ЧПУ для пользователей и пользовательских групп

#1 4 ноября 2014 в 03:54
Добрый день.

Подскажите, пожалуйста, как решить следующую задачу на InstantCms 2.x.

Допустим, создаем сайт, на котором будут регистрироваться пользователи и есть пользовательские группы.

URL-адреса персональных страничек зарегистрированных пользователей сейчас выглядят так:
nazvanie-saita.domen/users/1
nazvanie-saita.domen/users/2
....

URL-адреса пользовательских групп выглядят так:
nazvanie-saita.domen/groups/1
nazvanie-saita.domen/groups/2
....

Нужно получить следующий вид.

URL-адреса персональных страничек зарегистрированных пользователей:
nazvanie-saita.domen/u/nickname-pervogo-polzovatelya
nazvanie-saita.domen/u/nickname-vtorogo-polzovatelya
или
nazvanie-saita.domen/u/chpu-imja-pervogo-polzovatelya
nazvanie-saita.domen/u/chpu-imja-vtorogo-polzovatelya
....

URL-адреса пользовательских групп:
nazvanie-saita.domen/g/nazvanie-pervoj-gruppy
nazvanie-saita.domen/g/nazvanie-vtoroj-gruppy
или
nazvanie-saita.domen/g/chpu-imja-pervoj-gruppy
nazvanie-saita.domen/g/chpu-imja-vtoroj-gruppy
....

Буду благодарен за советы и подсказки, как это можно реализовать.
#2 4 ноября 2014 в 03:55
— — — — — -

Есть вот такой мануал:
docs.instantcms.ru/manual/settings/rewriting

Он позволяет решить часть задачи, заменить в URL-адресах "users" на "u", "groups" на "g".
#3 4 ноября 2014 в 03:55
— — — — — -

Вторая часть задачи посложнее.

Нужно заменить в URL-адресах ID пользователя и ID группы на ЧПУ-строки (уникальные строки с использованием букв на английском, цифр, без пробелов и других специальных знаков, за исключением, возможно, "-" и "_").

— — — — — -

В моем случае поле "Nickname" будет содержать ФИО участника, допускается использовать кириллические символы.
Поэтому для ЧПУ-строки можно создать отдельное поле "Адрес Вашей странички" (системное имя — например, "chpu-url").

Для этого в админке идем в "Компоненты", выбираем "Профили пользователей", затем "Добавить поле".
Проставляем галочки "Поле должно быть заполнено" и "Только латинские буквы и цифры".

Остается прописать код, который будет для каждого пользователя при формировании URL получать значение поля "chpu-url" и подставлять его вместо ID.

Как это сделать — пока не знаю.
Буду благодарен за подсказки.

— — — — — -

Для пользовательских групп (групп, в которых группируются пользователи, контент, не путайте с группами уровня доступа) сложнее.

В админке управление настройками отдельных групп недоступно, а во фронт-части сайта есть возможность изменить название и описание группы, но нет возможности добавлять новые поля.

В моем случае количество пользовательских групп ограничено, создавать их могут только администраторы сайта.
Поэтому вполне допустимо не создавать специальное настраиваемое поле, а прописать напрямую в коде соответствие:
ID группы -> ЧПУ-адрес (это называется хеш-таблица, если не ошибаюсь).

— — — — — -

Нашел небольшой внешний мануальчик, как прописывать ЧПУ:
www.phpinfo.su/articles/practice/chpu_na_php.html

Доходчиво, возможно, пригодится.

— — — — — -

Бегло глянул в исходники сайта.
Пользователи и группы в движке реализованы как компоненты.

Не силен в PHP-программировании, но интуитивно догадываюсь, что можно подправить код в файлах "/system/controllers/users/action/profile.php" и "/system/controllers/groups/action/groups.php".

Данное решение будет корявым и негибким, поскольку при обновлении движка все прописанные изменения в коде сотрутся.
Более эффективным решением будет вынести, если это возможно, изменения в коде в отдельный компонент.

— — — — — -
#4 4 ноября 2014 в 04:03
Еще одна часть, которую нужно обязательно учесть при замене ID на ЧПУ-строки.

Да, можно прописать код, который для адресов
nazvanie-saita.domen/u/chpu-imja-pervogo-polzovatelya
nazvanie-saita.domen/g/chpu-imja-vtoroj-gruppy
будет корректно выдавать информацию.

Но ведь остальная часть движка по-прежнему будет генерировать старые урлы.
Например, компонент "Генератор карты сайта", ...., да просто навигация по сайту!!

Поэтому корректно все запрограммировать — не так-то просто.

Возможно, решение уже есть.
Буду благодарен за наводки.
#5 18 мая 2017 в 00:13
Владмир, какое решение нашли?
#6 18 мая 2017 в 18:55


Владмир, какое решение нашли?

ivanish

Вроде не гите чпу для группу уже есть. Похоже будет в коробке в следующей версии движка.
#7 22 мая 2017 в 05:39
Хмм… Можно запилить дополнительную таблицу алиасов с полем алиасов в таблице users
  1.  
  2. CREATE TABLE `cms_aliases` (
  3. `alias` VARCHAR(200) DEFAULT NULL,
  4. `controller` VARCHAR(200) DEFAULT NULL,
  5. `action` VARCHAR(200) DEFAULT NULL
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  7.  
  8. INSERT INTO `cms_aliases` (`alias`, `controller`, `action`) VALUES
  9. ('adminko', 'users', '1'),
  10. ('grupko', 'groups', '1');
  11.  
  12. ALTER TABLE `cms_aliases` ADD UNIQUE KEY `alias` (`alias`);
  13.  
  14. ALTER TABLE `cms_users` ADD `alias` VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER `email`, ADD UNIQUE (`alias`);
  15.  
и лефтджойнить их на совпадения. Так как URL в InstantCMS не формируется, а парсится функцией route(), то в функции runController() класса cmsCore нужно еще будет дописать нечто похожее на это
  1.  
  2. $db = cmsDatabase::getInstance();
  3. $row = $db->getRow('aliases',"`alias` = '{$this->uri}'");
  4.  
  5. if(!empty($row)){
  6. $this->uri_controller = $row['controller'];
  7. $this->uri_action = $row['action'];
  8. }
  9.  
Ну и естественно переписать все ссылки в шаблоне. Ну это как один из возможных вариантов реализации))
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.