diff --git a/.idea/deployment.xml b/.idea/deployment.xml
new file mode 100644
index 00000000..dc2a86a5
--- /dev/null
+++ b/.idea/deployment.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/discord.xml b/.idea/discord.xml
new file mode 100644
index 00000000..30bab2ab
--- /dev/null
+++ b/.idea/discord.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/VKAPI/Handlers/Users.php b/VKAPI/Handlers/Users.php
index 6185a250..e9e33c3e 100644
--- a/VKAPI/Handlers/Users.php
+++ b/VKAPI/Handlers/Users.php
@@ -52,7 +52,7 @@ final class Users extends VKAPIRequestHandler
$response[$i]->verified = intval($usr->isVerified());
break;
case "sex":
- $response[$i]->sex = $usr->isFemale() ? 1 : 2;
+ $response[$i]->sex = $usr->getGender();
break;
case "has_photo":
$response[$i]->has_photo = is_null($usr->getAvatarPhoto()) ? 0 : 1;
diff --git a/Web/Models/Entities/User.php b/Web/Models/Entities/User.php
index b7516c90..92c91e3a 100644
--- a/Web/Models/Entities/User.php
+++ b/Web/Models/Entities/User.php
@@ -726,7 +726,25 @@ class User extends RowModel
function isFemale(): bool
{
- return (bool) $this->getRecord()->sex;
+ return (bool) $this->getRawGender() == "female";
+ }
+
+ function getGender(): string
+ {
+ $gender = $this->getRecord()->gender;
+
+ if(in_array($gender, ["female", "male", "non-binary"])) return tr($gender);
+ else return $gender ?? "Не указан";
+ }
+
+ function getRawGender(): ?string
+ {
+ return $this->getRecord()->gender;
+ }
+
+ function hasOtherGenderString(): bool
+ {
+ return !in_array($this->getRecord()->gender, ["female", "male", "non-binary", NULL]);
}
function isVerified(): bool
diff --git a/Web/Presenters/AuthPresenter.php b/Web/Presenters/AuthPresenter.php
index bb9d7272..799250f0 100644
--- a/Web/Presenters/AuthPresenter.php
+++ b/Web/Presenters/AuthPresenter.php
@@ -91,7 +91,10 @@ final class AuthPresenter extends OpenVKPresenter
$user = new User;
$user->setFirst_Name($this->postParam("first_name"));
$user->setLast_Name($this->postParam("last_name"));
- $user->setSex((int)($this->postParam("sex") === "female"));
+
+ if ($this->postParam("sex") != "null")
+ $user->setGender((int)($this->postParam("sex") === "female"));
+
$user->setEmail($this->postParam("email"));
$user->setSince(date("Y-m-d H:i:s"));
$user->setRegistering_Ip(CONNECTING_IP);
diff --git a/Web/Presenters/UserPresenter.php b/Web/Presenters/UserPresenter.php
index 3acabc84..f1cab162 100644
--- a/Web/Presenters/UserPresenter.php
+++ b/Web/Presenters/UserPresenter.php
@@ -165,9 +165,17 @@ final class UserPresenter extends OpenVKPresenter
if ($this->postParam("politViews") <= 9 && $this->postParam("politViews") >= 0)
$user->setPolit_Views($this->postParam("politViews"));
- if ($this->postParam("gender") <= 1 && $this->postParam("gender") >= 0)
- $user->setSex($this->postParam("gender"));
-
+ if ($this->postParam("gender"))
+ if($this->postParam("gender") == "hide")
+ $user->setGender(NULL);
+ elseif($this->postParam("gender") == "other")
+ if($this->postParam("other-gender-string"))
+ $user->setGender($this->postParam("other-gender-string"));
+ else
+ $user->setGender(NULL);
+ else
+ $user->setGender($this->postParam("gender"));
+
if(!empty($this->postParam("phone")) && $this->postParam("phone") !== $user->getPhone()) {
if(!OPENVK_ROOT_CONF["openvk"]["credentials"]["smsc"]["enable"])
$this->flashFail("err", tr("error_segmentation"), "котлетки");
diff --git a/Web/Presenters/templates/Auth/Register.xml b/Web/Presenters/templates/Auth/Register.xml
index 16532cb1..abf85b91 100644
--- a/Web/Presenters/templates/Auth/Register.xml
+++ b/Web/Presenters/templates/Auth/Register.xml
@@ -49,8 +49,9 @@
{var $femalePreferred = OPENVK_ROOT_CONF["openvk"]["preferences"]["femaleGenderPriority"]}
|
diff --git a/Web/Presenters/templates/User/Edit.xml b/Web/Presenters/templates/User/Edit.xml
index 96152132..b493121a 100644
--- a/Web/Presenters/templates/User/Edit.xml
+++ b/Web/Presenters/templates/User/Edit.xml
@@ -133,11 +133,23 @@
{_gender}:
|
+
- |
diff --git a/Web/Presenters/templates/User/View.xml b/Web/Presenters/templates/User/View.xml
index fb38133d..571575a0 100644
--- a/Web/Presenters/templates/User/View.xml
+++ b/Web/Presenters/templates/User/View.xml
@@ -382,7 +382,7 @@
{_gender}: |
- {$user->isFemale() ? tr("female") : tr("male")} |
+ {$user->getGender()} |
{_relationship}: |
diff --git a/install/sqls/00032-other-gender-options.sql b/install/sqls/00032-other-gender-options.sql
new file mode 100644
index 00000000..5014c153
--- /dev/null
+++ b/install/sqls/00032-other-gender-options.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `profiles` DROP `sex`;
+ALTER TABLE `profiles` ADD `gender` VARCHAR(50) NULL DEFAULT NULL AFTER `left_menu`;
diff --git a/locales/en.strings b/locales/en.strings
index f5259312..ec5b35ac 100644
--- a/locales/en.strings
+++ b/locales/en.strings
@@ -72,6 +72,10 @@
"gender" = "Gender";
"male" = "male";
"female" = "female";
+"non-binary" = "non-binary";
+"other" = "other";
+"other_gender_placeholder" = "I refer to myself as...";
+"hidden" = "not specified";
"description" = "Description";
"save" = "Save";
"main_information" = "Main information";
@@ -1226,3 +1230,5 @@
"undergoing_section_maintenance" = "Unfortunately, the $1 section is temporarily unavailable. We are already working on troubleshooting. Please try to come back later.";
"topics" = "Topics";
+
+"not_specified" = "Not specified";
diff --git a/locales/ru.strings b/locales/ru.strings
index 82956b45..268617a4 100644
--- a/locales/ru.strings
+++ b/locales/ru.strings
@@ -71,6 +71,10 @@
"gender" = "Пол";
"male" = "мужской";
"female" = "женский";
+"non-binary" = "небинарный";
+"other" = "другой";
+"other_gender_placeholder" = "Я идентифицирую себя как...";
+"hidden" = "не указан";
"description" = "Описание";
"save" = "Сохранить";
"main_information" = "Основная информация";
@@ -1284,3 +1288,5 @@
"undergoing_section_maintenance" = "К сожалению, раздел $1 временно недоступен. Мы уже работаем над устранением неисправностей. Пожалуйста, попробуйте зайти позже.";
"topics" = "Темы";
+
+"not_specified" = "Не указан";