From 1677d9849ecb9011c4fe8984db6f1a15482d5bd8 Mon Sep 17 00:00:00 2001 From: Artemka Date: Fri, 20 Dec 2024 16:21:31 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=9D=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B2=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=B0=D1=85=20?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B5=D0=BC=20(=D0=9D=D0=B5=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB)=20(#1125)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Email/assets/res/pictures/lock.jpeg | Bin 9925 -> 0 bytes Email/change-email.eml.latte | 51 +++++++++++++--------------- Email/hello.eml.latte | 2 +- Email/password-reset.eml.latte | 51 +++++++++++++--------------- Email/verify-email.eml.latte | 51 +++++++++++++--------------- 5 files changed, 73 insertions(+), 82 deletions(-) delete mode 100644 Email/assets/res/pictures/lock.jpeg diff --git a/Email/assets/res/pictures/lock.jpeg b/Email/assets/res/pictures/lock.jpeg deleted file mode 100644 index 9afc6e0b12f7c67a133baaed021cabd353238db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9925 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 M^gkK_mV=>x12|&IZ~y=R diff --git a/Email/change-email.eml.latte b/Email/change-email.eml.latte index 6cff8c11..30f4c4a9 100644 --- a/Email/change-email.eml.latte +++ b/Email/change-email.eml.latte @@ -46,17 +46,14 @@ - + diff --git a/Email/password-reset.eml.latte b/Email/password-reset.eml.latte index aa6911c6..a8253e23 100644 --- a/Email/password-reset.eml.latte +++ b/Email/password-reset.eml.latte @@ -46,17 +46,14 @@
-
- -
- +
@@ -64,9 +61,9 @@
- +
- +
@@ -74,11 +71,11 @@
- +

Здравствуйте, {$name}! Вы вероятно изменили свой адрес электронной почты в OpenVK. Чтобы изменение вступило в силу, необходимо подтвердить ваш новый Email.

- +
@@ -86,7 +83,7 @@
- + @@ -102,7 +99,7 @@
@@ -94,7 +91,7 @@
- Подтвердить Email! + Подтвердить Email!
- +
@@ -110,30 +107,30 @@
- +

Если кнопка не работает, вы можете попробовать скопировать и вставить эту ссылку в адресную строку вашего веб-обозревателя:

- +
- - http://{$_SERVER['HTTP_HOST']}/settings/change_email?key={$key} + + https://{$_SERVER['HTTP_HOST']}/settings/change_email?key={$key}
- +

Обратите внимание на то, что эту ссылку нельзя:

- +
    -
  • Передавать другим людям (даже друзьям, питомцам, соседам, любимым девушкам)
  • +
  • Передавать другим людям (даже друзьям, питомцам, соседям, любимым девушкам)
  • Использовать, если прошло более двух дней с её генерации
- +
@@ -144,7 +141,7 @@
- +
@@ -152,11 +149,11 @@
- +

С уважением, овк-тян.

- +
@@ -164,9 +161,9 @@
- +
- +
@@ -174,7 +171,7 @@
- +

Вы получили это письмо так как кто-то или вы изменили адрес электронной почты. Это не рассылка и от неё нельзя отписаться. Если вы всё равно хотите перестать получать подобные письма, деактивируйте ваш аккаунт. @@ -201,4 +198,4 @@

- + \ No newline at end of file diff --git a/Email/hello.eml.latte b/Email/hello.eml.latte index 8ae66499..1bcd1e03 100644 --- a/Email/hello.eml.latte +++ b/Email/hello.eml.latte @@ -12,7 +12,7 @@
- Добро пожаловать в OpenVK! Приятного времяприпровождения, надеюсь вам понравится.

Если появились вопросы, касаемые нашего сайта, пишите сюда + Добро пожаловать в OpenVK! Приятного времяприпровождения, надеюсь вам понравится.

Если появились вопросы, касаемые нашего сайта, пишите сюда
- +
-
- -
- +
@@ -64,9 +61,9 @@
- +
- +
@@ -74,11 +71,11 @@
- +

Здравствуйте, {$name}! Вы вероятно забыли пароль от аккаунта OpenVK? Мы идём к Вам на помощь!

- +
@@ -86,7 +83,7 @@
- + @@ -102,7 +99,7 @@
@@ -94,7 +91,7 @@
- Сбросить пароль! + Сбросить пароль!
- +
@@ -110,30 +107,30 @@
- +

Если кнопка не работает, вы можете попробовать скопировать и вставить эту ссылку в адресную строку вашего веб-обозревателя:

- +
- - http://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={$key} + + https://{$_SERVER['HTTP_HOST']}/restore?act=finish&key={$key}
- +

Обратите внимание на то, что эту ссылку нельзя:

- +
    -
  • Передавать другим людям (даже друзьям, питомцам, соседам, любимым девушкам)
  • +
  • Передавать другим людям (даже друзьям, питомцам, соседям, любимым девушкам)
  • Использовать, если прошло более двух дней с её генерации
- +
@@ -144,7 +141,7 @@
- +
@@ -152,11 +149,11 @@
- +

С уважением, овк-тян.

- +
@@ -164,9 +161,9 @@
- +
- +
@@ -174,7 +171,7 @@
- +

Вы получили это письмо так как кто-то или вы отправили запрос на восстановлние пароля. Это не рассылка и от неё нельзя отписаться. Если вы всё равно хотите перестать получать подобные письма, деактивируйте ваш аккаунт. @@ -201,4 +198,4 @@

- + \ No newline at end of file diff --git a/Email/verify-email.eml.latte b/Email/verify-email.eml.latte index 40711f94..7f1f3683 100755 --- a/Email/verify-email.eml.latte +++ b/Email/verify-email.eml.latte @@ -46,17 +46,14 @@
- + + + + + + {if $additionalFields} + + + + + {/if}
-
- -
- +
@@ -64,9 +61,9 @@
- +
- +
@@ -74,11 +71,11 @@
- +

Здравствуйте, {$name}! Вы вероятно зарегистрировались на одном из инстансов OpenVK. Чтобы ваш аккаунт активировался, необходимо подтвердить Email.

- +
@@ -86,7 +83,7 @@
- + @@ -102,7 +99,7 @@
@@ -94,7 +91,7 @@
- Подтвердить Email! + Подтвердить Email!
- +
@@ -110,30 +107,30 @@
- +

Если кнопка не работает, вы можете попробовать скопировать и вставить эту ссылку в адресную строку вашего веб-обозревателя:

- +
- - http://{$_SERVER['HTTP_HOST']}/regFinish?key={$key} + + https://{$_SERVER['HTTP_HOST']}/regFinish?key={$key}
- +

Обратите внимание на то, что эту ссылку нельзя:

- +
    -
  • Передавать другим людям (даже друзьям, питомцам, соседам, любимым девушкам)
  • +
  • Передавать другим людям (даже друзьям, питомцам, соседям, любимым девушкам)
  • Использовать, если прошло более двух дней с её генерации
- +
@@ -144,7 +141,7 @@
- +
@@ -152,11 +149,11 @@
- +

С уважением, овк-тян.

- +
@@ -164,9 +161,9 @@
- +
- +
@@ -174,7 +171,7 @@
- +

Вы получили это письмо так как кто-то или вы зарегистрировались на инстансе OpenVK. Это не рассылка и от неё нельзя отписаться. Если вы всё равно хотите перестать получать подобные письма, деактивируйте ваш аккаунт. @@ -201,4 +198,4 @@

- + \ No newline at end of file From 4c9c650cff2210a388a9dc256fdadd81acc19771 Mon Sep 17 00:00:00 2001 From: veselcraft Date: Fri, 20 Dec 2024 17:17:40 +0300 Subject: [PATCH 2/3] feat(global): news on left menu Co-authored-by: Slava Petrov <55963296+saursvepur@users.noreply.github.com> --- Web/Presenters/OpenVKPresenter.php | 13 ++++++++++++- Web/Presenters/templates/@layout.xml | 8 ++++++++ Web/static/css/main.css | 7 ++++++- locales/en.strings | 2 ++ locales/ru.strings | 3 +++ openvk-example.yml | 3 +++ 6 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Web/Presenters/OpenVKPresenter.php b/Web/Presenters/OpenVKPresenter.php index 1d03a1c2..8b33b5a7 100644 --- a/Web/Presenters/OpenVKPresenter.php +++ b/Web/Presenters/OpenVKPresenter.php @@ -7,7 +7,7 @@ use Chandler\Security\Authenticator; use Latte\Engine as TemplatingEngine; use openvk\Web\Models\Entities\IP; use openvk\Web\Themes\Themepacks; -use openvk\Web\Models\Repositories\{IPs, Users, APITokens, Tickets, Reports, CurrentUser}; +use openvk\Web\Models\Repositories\{IPs, Users, APITokens, Tickets, Reports, CurrentUser, Posts}; use WhichBrowser; abstract class OpenVKPresenter extends SimplePresenter @@ -207,6 +207,17 @@ abstract class OpenVKPresenter extends SimplePresenter $userValidated = 0; $cacheTime = OPENVK_ROOT_CONF["openvk"]["preferences"]["nginxCacheTime"] ?? 0; + if(OPENVK_ROOT_CONF['openvk']['preferences']['news']['show']) { + $post = (new Posts)->getPostsFromUsersWall(-OPENVK_ROOT_CONF['openvk']['preferences']['news']['groupId'], 1, 1); + $post = iterator_to_array($post)[0]; + + $text = wordwrap($post->getText(false), 150, '\n', false); + $text = explode('\n', $text)[0]; + + $this->template->newsText = $text; + $this->template->newsLink = '/wall' . $post->getPrettyId(); + } + if(!is_null($user)) { $this->user = (object) []; $this->user->raw = $user; diff --git a/Web/Presenters/templates/@layout.xml b/Web/Presenters/templates/@layout.xml index 811548cd..34e033dc 100644 --- a/Web/Presenters/templates/@layout.xml +++ b/Web/Presenters/templates/@layout.xml @@ -239,6 +239,14 @@ + +
+ {_news} +
+ {$newsText}... +

+ {_news_more} +
{tr("you_still_have_x_points", $thisUser->getCoins())|noescape} diff --git a/Web/static/css/main.css b/Web/static/css/main.css index 928ef300..7333b22b 100644 --- a/Web/static/css/main.css +++ b/Web/static/css/main.css @@ -2314,7 +2314,7 @@ li { padding-left: 15px; } -#votesBalance { +#votesBalance, #news { margin-top: 10px; padding: 7px; background-color: #f6f6f6; @@ -2323,6 +2323,11 @@ li { user-select: none; } +#news b { + color: #8A0000; + font-size: 12px; +} + .cookies-popup { position: fixed; bottom: 0; diff --git a/locales/en.strings b/locales/en.strings index ac328308..2cfda2eb 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -1072,6 +1072,8 @@ "time_today" = "today"; "time_yesterday" = "yesterday"; +"news" = "News"; +"news_more" = "More »"; "points" = "Votes"; "points_count" = "votes"; "on_your_account" = "on your account"; diff --git a/locales/ru.strings b/locales/ru.strings index 3f036473..2a79df8a 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -1023,6 +1023,9 @@ "time_minutes_ago" = "$1 минут назад"; "time_today" = "сегодня"; "time_yesterday" = "вчера"; + +"news" = "Новости"; +"news_more" = "Подробнее »"; "points" = "Голоса"; "points_count" = "голосов"; "on_your_account" = "на вашем счету"; diff --git a/openvk-example.yml b/openvk-example.yml index b64a589e..b8cb899f 100644 --- a/openvk-example.yml +++ b/openvk-example.yml @@ -111,6 +111,9 @@ openvk: defaultMobileTheme: "" defaultFeaturePhoneTheme: "" logs: true + news: + show: false + groupId: 1 telemetry: plausible: From 0aecc299cf42c692bb4963d5741832570fc02efb Mon Sep 17 00:00:00 2001 From: mrilyew <99399973+mrilyew@users.noreply.github.com> Date: Fri, 20 Dec 2024 17:34:29 +0300 Subject: [PATCH 3/3] feat(profile): fav games & custom fields (#1193) * add fav games * add additional fields * add gui 4 dis * add maxlength --- VKAPI/Handlers/Account.php | 47 ++++++++- VKAPI/Handlers/Users.php | 26 ++++- Web/Models/Entities/User.php | 37 ++++++++ .../UserInfoEntities/AdditionalField.php | 95 +++++++++++++++++++ Web/Presenters/UserPresenter.php | 56 +++++++++-- Web/Presenters/templates/@layout.xml | 1 + Web/Presenters/templates/User/Edit.xml | 63 ++++++++++++ Web/Presenters/templates/User/View.xml | 16 ++++ Web/static/css/main.css | 22 +++++ Web/static/js/al_wall.js | 61 +++++++++++- install/sqls/00053-new-fields.sql | 10 ++ locales/en.strings | 16 ++++ locales/ru.strings | 16 ++++ quirks.yml | 3 +- 14 files changed, 456 insertions(+), 13 deletions(-) create mode 100644 Web/Models/Entities/UserInfoEntities/AdditionalField.php create mode 100644 install/sqls/00053-new-fields.sql diff --git a/VKAPI/Handlers/Account.php b/VKAPI/Handlers/Account.php index c1f3ef23..d4144b90 100644 --- a/VKAPI/Handlers/Account.php +++ b/VKAPI/Handlers/Account.php @@ -269,7 +269,7 @@ final class Account extends VKAPIRequestHandler return 1; $entity = get_entity_by_id($owner_id); - if(!$entity || $entity->isDeleted()) + if(!$entity) return 0; if(!$entity->isBlacklistedBy($this->getUser())) @@ -296,4 +296,49 @@ final class Account extends VKAPIRequestHandler return $result; } + + function saveInterestsInfo( + string $interests = NULL, + string $fav_music = NULL, + string $fav_films = NULL, + string $fav_shows = NULL, + string $fav_books = NULL, + string $fav_quote = NULL, + string $fav_games = NULL, + string $about = NULL, + ) + { + $this->requireUser(); + $this->willExecuteWriteAction(); + + $user = $this->getUser(); + $changes = 0; + $changes_array = [ + "interests" => $interests, + "fav_music" => $fav_music, + "fav_films" => $fav_films, + "fav_books" => $fav_books, + "fav_shows" => $fav_shows, + "fav_quote" => $fav_quote, + "fav_games" => $fav_games, + "about" => $about, + ]; + + foreach($changes_array as $change_name => $change_value) { + $set_name = "set".ucfirst($change_name); + $get_name = "get".str_replace("Fav", "Favorite", str_replace("_", "", ucfirst($change_name))); + if(!is_null($change_value) && $change_value !== $user->$get_name()) { + $user->$set_name(ovk_proc_strtr($change_value, 1000)); + $changes += 1; + } + } + + if($changes > 0) { + $user->save(); + } + + return (object) [ + "changed" => (int)($changes > 0), + ]; + } } diff --git a/VKAPI/Handlers/Users.php b/VKAPI/Handlers/Users.php index 7dc68f3b..c47acb8e 100644 --- a/VKAPI/Handlers/Users.php +++ b/VKAPI/Handlers/Users.php @@ -12,8 +12,14 @@ final class Users extends VKAPIRequestHandler if($authuser == NULL) $authuser = $this->getUser(); $users = new UsersRepo; - if($user_ids == "0") + if($user_ids == "0") { + if(!$authuser) { + return []; + } + $user_ids = (string) $authuser->getId(); + } + $usrs = explode(',', $user_ids); $response = array(); @@ -198,6 +204,13 @@ final class Users extends VKAPIRequestHandler $response[$i]->quotes = $usr->getFavoriteQuote(); break; + case "games": + if(!$canView) { + break; + } + + $response[$i]->games = $usr->getFavoriteGames(); + break; case "email": if(!$canView) { break; @@ -280,6 +293,17 @@ final class Users extends VKAPIRequestHandler $response[$i]->blacklisted = (int)$this->getUser()->isBlacklistedBy($usr); break; + case "custom_fields": + if(sizeof($usrs) > 1) + break; + + $c_fields = \openvk\Web\Models\Entities\UserInfoEntities\AdditionalField::getByOwner($usr->getId()); + $append_array = []; + foreach($c_fields as $c_field) + $append_array[] = $c_field->toVkApiStruct(); + + $response[$i]->custom_fields = $append_array; + break; } } diff --git a/Web/Models/Entities/User.php b/Web/Models/Entities/User.php index 61ea120b..a1f650ec 100644 --- a/Web/Models/Entities/User.php +++ b/Web/Models/Entities/User.php @@ -228,6 +228,11 @@ class User extends RowModel return $this->getRecord()->about; } + function getAbout(): ?string + { + return $this->getRecord()->about; + } + function getStatus(): ?string { return $this->getRecord()->status; @@ -415,6 +420,11 @@ class User extends RowModel return $this->getRecord()->fav_quote; } + function getFavoriteGames(): ?string + { + return $this->getRecord()->fav_games; + } + function getCity(): ?string { return $this->getRecord()->city; @@ -425,6 +435,30 @@ class User extends RowModel return $this->getRecord()->address; } + function getAdditionalFields(bool $split = false): array + { + $all = \openvk\Web\Models\Entities\UserInfoEntities\AdditionalField::getByOwner($this->getId()); + $result = [ + "interests" => [], + "contacts" => [], + ]; + + if($split) { + foreach($all as $field) { + if($field->getPlace() == "contact") + $result["contacts"][] = $field; + else if($field->getPlace() == "interest") + $result["interests"][] = $field; + } + } else { + $result = []; + foreach($all as $field) + $result[] = $field; + } + + return $result; + } + function getNotificationOffset(): int { return $this->getRecord()->notification_offset; @@ -1432,6 +1466,9 @@ class User extends RowModel $res->blacklisted = (int)$user->isBlacklistedBy($this); break; + case "games": + $res->games = $this->getFavoriteGames(); + break; } } diff --git a/Web/Models/Entities/UserInfoEntities/AdditionalField.php b/Web/Models/Entities/UserInfoEntities/AdditionalField.php new file mode 100644 index 00000000..47c69de3 --- /dev/null +++ b/Web/Models/Entities/UserInfoEntities/AdditionalField.php @@ -0,0 +1,95 @@ +getRecord()->owner; + } + + function getName(bool $tr = true): string + { + $orig_name = $this->getRecord()->name; + $name = $orig_name; + if($tr && $name[0] === "_") + $name = tr("custom_field_" . substr($name, 1)); + + if(str_contains($name, "custom_field")) + return $orig_name; + + return $name; + } + + function getContent(): string + { + return $this->getRecord()->text; + } + + function getPlace(): string + { + switch($this->getRecord()->place) { + case AdditionalField::PLACE_CONTACTS: + return "contact"; + case AdditionalField::PLACE_INTERESTS: + return "interest"; + } + + return "contact"; + } + + function isContact(): bool + { + return $this->getRecord()->place == AdditionalField::PLACE_CONTACTS; + } + + function toVkApiStruct(): object + { + return (object) [ + "type" => $this->getRecord()->place, + "name" => $this->getName(), + "text" => $this->getContent() + ]; + } + + static function getById(int $id) + { + $ctx = DatabaseConnection::i()->getContext(); + $entry = $ctx->table("additional_fields")->where("id", $id)->fetch(); + + if(!$entry) + return NULL; + + return new AdditionalField($entry); + } + + static function getByOwner(int $owner): \Traversable + { + $ctx = DatabaseConnection::i()->getContext(); + $entries = $ctx->table("additional_fields")->where("owner", $owner); + + foreach($entries as $entry) { + yield new AdditionalField($entry); + } + } + + static function getCountByOwner(int $owner): \Traversable + { + return DatabaseConnection::i()->getContext()->table("additional_fields")->where("owner", $owner)->count(); + } + + static function resetByOwner(int $owner): bool + { + DatabaseConnection::i()->getContext()->table("additional_fields")->where("owner", $owner)->delete(); + + return true; + } +} diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php index f238e381..dc8fb02c 100644 --- a/Web/Presenters/UserPresenter.php +++ b/Web/Presenters/UserPresenter.php @@ -64,6 +64,7 @@ final class UserPresenter extends OpenVKPresenter $this->template->audios = (new Audios)->getRandomThreeAudiosByEntityId($user->getId()); $this->template->audiosCount = (new Audios)->getUserCollectionSize($user); $this->template->audioStatus = $user->getCurrentAudioStatus(); + $this->template->additionalFields = $user->getAdditionalFields(true); $this->template->user = $user; @@ -251,13 +252,14 @@ final class UserPresenter extends OpenVKPresenter else $user->setWebsite((!parse_url($website, PHP_URL_SCHEME) ? "https://" : "") . $website); } elseif($_GET['act'] === "interests") { - $user->setInterests(empty($this->postParam("interests")) ? NULL : ovk_proc_strtr($this->postParam("interests"), 300)); - $user->setFav_Music(empty($this->postParam("fav_music")) ? NULL : ovk_proc_strtr($this->postParam("fav_music"), 300)); - $user->setFav_Films(empty($this->postParam("fav_films")) ? NULL : ovk_proc_strtr($this->postParam("fav_films"), 300)); - $user->setFav_Shows(empty($this->postParam("fav_shows")) ? NULL : ovk_proc_strtr($this->postParam("fav_shows"), 300)); - $user->setFav_Books(empty($this->postParam("fav_books")) ? NULL : ovk_proc_strtr($this->postParam("fav_books"), 300)); - $user->setFav_Quote(empty($this->postParam("fav_quote")) ? NULL : ovk_proc_strtr($this->postParam("fav_quote"), 300)); - $user->setAbout(empty($this->postParam("about")) ? NULL : ovk_proc_strtr($this->postParam("about"), 300)); + $user->setInterests(empty($this->postParam("interests")) ? NULL : ovk_proc_strtr($this->postParam("interests"), 1000)); + $user->setFav_Music(empty($this->postParam("fav_music")) ? NULL : ovk_proc_strtr($this->postParam("fav_music"), 1000)); + $user->setFav_Films(empty($this->postParam("fav_films")) ? NULL : ovk_proc_strtr($this->postParam("fav_films"), 1000)); + $user->setFav_Shows(empty($this->postParam("fav_shows")) ? NULL : ovk_proc_strtr($this->postParam("fav_shows"), 1000)); + $user->setFav_Books(empty($this->postParam("fav_books")) ? NULL : ovk_proc_strtr($this->postParam("fav_books"), 1000)); + $user->setFav_Quote(empty($this->postParam("fav_quote")) ? NULL : ovk_proc_strtr($this->postParam("fav_quote"), 1000)); + $user->setFav_Games(empty($this->postParam("fav_games")) ? NULL : ovk_proc_strtr($this->postParam("fav_games"), 1000)); + $user->setAbout(empty($this->postParam("about")) ? NULL : ovk_proc_strtr($this->postParam("about"), 1000)); } elseif($_GET["act"] === "backdrop") { if($this->postParam("subact") === "remove") { $user->unsetBackDropPictures(); @@ -295,10 +297,46 @@ final class UserPresenter extends OpenVKPresenter $this->returnJson([ "success" => true ]); + } elseif($_GET['act'] === "additional") { + $maxAddFields = ovkGetQuirk("users.max-fields"); + $items = []; + + for($i = 0; $i < $maxAddFields; $i++) { + if(!$this->postParam("name_".$i)) { + continue; + } + + $items[] = [ + "name" => $this->postParam("name_".$i), + "text" => $this->postParam("text_".$i), + "place" => $this->postParam("place_".$i), + ]; + } + + \openvk\Web\Models\Entities\UserInfoEntities\AdditionalField::resetByOwner($this->user->id); + foreach($items as $new_field_info) { + $name = ovk_proc_strtr($new_field_info["name"], 50); + $text = ovk_proc_strtr($new_field_info["text"], 1000); + if(ctype_space($name) || ctype_space($text)) { + continue; + } + + $place = (int)($new_field_info["place"]); + + $new_field = new \openvk\Web\Models\Entities\UserInfoEntities\AdditionalField; + $new_field->setOwner($this->user->id); + $new_field->setName($name); + $new_field->setText($text); + $new_field->setPlace([0, 1][$place] ? $place : 0); + + $new_field->save(); + } } try { - $user->save(); + if($_GET['act'] !== "additional") { + $user->save(); + } } catch(\PDOException $ex) { if($ex->getCode() == 23000) $this->flashFail("err", tr("error"), tr("error_shorturl")); @@ -310,7 +348,7 @@ final class UserPresenter extends OpenVKPresenter } $this->template->mode = in_array($this->queryParam("act"), [ - "main", "contacts", "interests", "avatar", "backdrop" + "main", "contacts", "interests", "avatar", "backdrop", "additional" ]) ? $this->queryParam("act") : "main"; diff --git a/Web/Presenters/templates/@layout.xml b/Web/Presenters/templates/@layout.xml index 34e033dc..245ccfb0 100644 --- a/Web/Presenters/templates/@layout.xml +++ b/Web/Presenters/templates/@layout.xml @@ -460,6 +460,7 @@ "max_filesize_mb": 5, "current_id": {$thisUser ? $thisUser->getId() : 0}, "disable_ajax": {$disable_ajax ? $disable_ajax : 0}, + "max_add_fields": {ovkGetQuirk("users.max-fields")}, } diff --git a/Web/Presenters/templates/User/Edit.xml b/Web/Presenters/templates/User/Edit.xml index 8bea7f0c..0cc70a63 100644 --- a/Web/Presenters/templates/User/Edit.xml +++ b/Web/Presenters/templates/User/Edit.xml @@ -13,6 +13,7 @@ {var $isMain = $mode === 'main'} {var $isContacts = $mode === 'contacts'} {var $isInterests = $mode === 'interests'} + {var $isAdditional = $mode === 'additional'} {var $isAvatar = $mode === 'avatar'} {var $isBackDrop = $mode === 'backdrop'} @@ -31,6 +32,9 @@ + @@ -294,6 +298,14 @@
+ {_favorite_games}: + + +
{_information_about}: @@ -375,7 +387,58 @@ + {elseif $isAdditional} + {var $f_iterator = 0} +

{_additional_information}

+

{tr("additional_fields_description", ovkGetQuirk("users.max-fields"))}

+
+
+ + + + + + + + + + + + + + + + + + + {php $f_iterator += 1} +
+ {_additional_field_name} + + + +
+
+ {_additional_field_text} + + +
+ {_additional_field_place} + + +
+
+ +
+ + + +
+
{/if} diff --git a/Web/Presenters/templates/User/View.xml b/Web/Presenters/templates/User/View.xml index cbcb1f1f..9c013dd1 100644 --- a/Web/Presenters/templates/User/View.xml +++ b/Web/Presenters/templates/User/View.xml @@ -506,6 +506,12 @@
{_address}: {$user->getPhysicalAddress()}
{$field->getName()}:{$field->getContent()}
{/capture} @@ -567,6 +573,16 @@ {_favorite_quotes}: {$user->getFavoriteQuote()} + + {_favorite_games}: + {$user->getFavoriteGames()} + + {if $additionalFields} + + {$field->getName()}: + {$field->getContent()} + + {/if} {_information_about}: {$user->getDescription()} diff --git a/Web/static/css/main.css b/Web/static/css/main.css index 7333b22b..94f5939d 100644 --- a/Web/static/css/main.css +++ b/Web/static/css/main.css @@ -506,6 +506,28 @@ table { text-align: left; } +.outline_table td { + text-align: right; + font-weight: normal; + color: gray; +} + +.outline_table { + border-bottom: 1px solid #cbcbcb; + padding: 5px 0px; +} + +.outline_table:last-of-type { + border-bottom: unset; +} + +.flex_column_center_gap5px { + display: flex; + flex-direction: column; + align-items: center; + gap: 5px; +} + .information { padding: 9px; background-color: #c3e4ff; diff --git a/Web/static/js/al_wall.js b/Web/static/js/al_wall.js index a20b0d9d..e6229b28 100644 --- a/Web/static/js/al_wall.js +++ b/Web/static/js/al_wall.js @@ -924,7 +924,8 @@ u(document).on("click", "#editPost", async (e) => { const target = u(e.target) const post = target.closest("table") const content = post.find(".post-content") - const edit_place = post.find('.post-edit') + const edit_place_l = post.find('.post-edit') + const edit_place = u(edit_place_l.first()) const id = post.attr('data-id').split('_') let type = 'post' @@ -2886,3 +2887,61 @@ u(document).on('click', '#_bl_toggler', async (e) => { } } }) + +/* Additional fields */ + +u(document).on("click", "#additional_field_append", (e) => { + let iterator = 0 + if(u(`table[data-iterator]`).last()) { + iterator = Number(u(`table[data-iterator]`).last().dataset.iterator) + 1 + } + + if(iterator >= window.openvk.max_add_fields) { + return + } + + u('.edit_field_container_inserts').append(` + + + + + + + + + + + + + + + + +
${tr("additional_field_name")}
${tr("additional_field_text")}
${tr("additional_field_place")} + +
+ `) + u(`.edit_field_container_item[data-iterator='${iterator}'] input[type="text"]`).nodes[0].focus() +}) + +u(document).on("click", ".edit_field_container_item #small_remove_button", (e) => { + let iterator = 0 + u(e.target).closest('table').remove() + u(".edit_field_container_inserts .edit_field_container_item").nodes.forEach(node => { + node.setAttribute('data-iterator', iterator) + iterator += 1 + }) +}) + +u(document).on("submit", "#additional_fields_form", (e) => { + u(`.edit_field_container_item input, .edit_field_container_item textarea`).nodes.forEach(node => { + if(node.value == "" || node.value == " ") { + e.preventDefault() + node.focus() + return + } + }) +}) diff --git a/install/sqls/00053-new-fields.sql b/install/sqls/00053-new-fields.sql new file mode 100644 index 00000000..0b437e57 --- /dev/null +++ b/install/sqls/00053-new-fields.sql @@ -0,0 +1,10 @@ +ALTER TABLE `profiles` ADD `fav_games` MEDIUMTEXT NULL DEFAULT NULL AFTER `fav_quote`; +CREATE TABLE `additional_fields` ( + `id` BIGINT(20) NOT NULL AUTO_INCREMENT, + `owner` BIGINT(20) UNSIGNED NOT NULL, + `name` VARCHAR(255) COLLATE utf8mb4_unicode_520_ci NOT NULL, + `text` MEDIUMTEXT COLLATE utf8mb4_unicode_520_ci NOT NULL, + `place` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE = InnoDB; +ALTER TABLE `additional_fields` ADD INDEX(`owner`); diff --git a/locales/en.strings b/locales/en.strings index 2cfda2eb..1aff6d88 100644 --- a/locales/en.strings +++ b/locales/en.strings @@ -147,11 +147,27 @@ "personal_information" = "Personal information"; "interests" = "Interests"; +"additional" = "Additional"; +"additional_fields_description" = "There you can add additional info about you, like another profiles links or your interests. Up to a maximum of $1 such fields can be added."; +"additional_field_name" = "Name"; +"additional_field_text" = "Text"; +"additional_field_place" = "Place"; +"additional_field_place_contacts" = "In \"contacts\""; +"additional_field_place_interests" = "In \"interests\""; + "favorite_music" = "Favorite music"; "favorite_films" = "Favorite flims"; "favorite_shows" = "Favorite TV-shows"; "favorite_books" = "Favorite books"; "favorite_quotes" = "Favorite quotes"; +"favorite_games" = "Favorite games"; +"custom_field_favorite_performers" = "Favourite performers"; +"custom_field_favorite_content_makers" = "Favourite content-makers"; +"custom_field_favorite_anime" = "Favourite anime"; +"custom_field_favorite_manga" = "Favourite manga"; +"custom_field_favorite_vtubers" = "Favourite vtubers"; +"custom_field_favorite_albums" = "Favourite music albums"; + "information_about" = "About"; "updated_at" = "Updated at $1"; diff --git a/locales/ru.strings b/locales/ru.strings index 2a79df8a..93439550 100644 --- a/locales/ru.strings +++ b/locales/ru.strings @@ -131,11 +131,27 @@ "address" = "Адрес"; "personal_information" = "Личная информация"; "interests" = "Интересы"; +"additional" = "Дополнительно"; +"additional_fields_description" = "Здесь вы можете добавить дополнительную информацию о себе: ссылки на ваши социальные сети, либо же ваши интересы. Максимум можно добавить до $1 таких полей."; +"additional_field_name" = "Название"; +"additional_field_text" = "Текст"; +"additional_field_place" = "Отображение"; +"additional_field_place_contacts" = "В \"контактах\""; +"additional_field_place_interests" = "В \"интересах\""; + "favorite_music" = "Любимая музыка"; "favorite_films" = "Любимые фильмы"; "favorite_shows" = "Любимые ТВ-шоу"; "favorite_books" = "Любимые книги"; "favorite_quotes" = "Любимые цитаты"; +"favorite_games" = "Любимые игры"; +"custom_field_favorite_performers" = "Любимые исполнители"; +"custom_field_favorite_content_makers" = "Любимые контент-мейкеры"; +"custom_field_favorite_anime" = "Любимые аниме"; +"custom_field_favorite_manga" = "Любимая манга"; +"custom_field_favorite_vtubers" = "Любимые витуберы"; +"custom_field_favorite_albums" = "Любимые альбомы"; + "information_about" = "О себе"; "updated_at" = "Обновлено $1"; "user_banned" = "К сожалению, нам пришлось заблокировать страницу пользователя $1."; diff --git a/quirks.yml b/quirks.yml index 8a1b7878..8fe09b2f 100644 --- a/quirks.yml +++ b/quirks.yml @@ -45,4 +45,5 @@ comments.allow-graffiti: 0 # + Set this option to any non-negative number to be this limit wall.repost-liking-recursion-limit: 10 -polls.max-opts: 10 \ No newline at end of file +polls.max-opts: 10 +users.max-fields: 7