Изменение полей редактирования веб-пользователей в админ-панели.

ManageUserFieldsНесколько раз возникала необходимость при регистрации веб-пользователей на сайте использовать поля, отличные от тех, что уже имеются по-умолчанию в MODX Evolution.
Что-то типа «Сфера деятельности» или «Организация» и т.п.
Когда таких нестандартных полей много — то проще использовать WebloginPE (или можно немного подправленную его версию из Clipper — WebUsers). С ним можно добавлять сколько угодно полей в отдельную таблицу БД.
А когда изменяемых полей не много, то достаточно и имеющихся стандартных. Только встает задача их переименовать. И если при регистрации и редактировании профиля это сделать не проблема в шаблоне, то в админке приходилось поступать некрасиво — лезть в языковой файл системы и там переименовывать нужные поля.
А если кому-то еще очень захочется и ненужные поля скрыть, то придется менять системный файл mutate_web_user.dynamic.php. А все знают(?), что делать это — нехорошо.
После того, как я пару раз поступал так вот нехорошо, решил все-таки решить эту задачу плагином.

Плагин ManageUserFields
//<?php
/**
 * ManageUserFields
 * Плагин для скрытия и переименования полей веб-пользователей в админ-панели
 * 
 * @category    plugin
 * @version     0.2
 * @author      Akool
 * @internal    @properties &hideFields=Скрываем;text; &renameFields=Переименовываем;text;
 * @internal    @events OnWUsrFormRender
 * @internal    @modx_category Manager and Admin
 * 
 * Exemple config: &hideFields=Скрываем;text;phone,mobilephone,zip,country,dob,gender &renameFields=Переименовываем;textarea;state||Регион:,comment||Контакты:
 *
 * Important: Evolution CMS Database fields length limits: 
 * phone: 100, mobilephone: 100, dob: int(10), gender: int(1), country: 25, zip: 25, state: 25, fax: 100, 
 */

$hideFields = isset($hideFields) ? explode(',', $hideFields) : [];
$renameFields = isset($renameFields) ? explode(',', $renameFields) : [];
$output = '';
$hideFieldsSrt = '';
$renameFieldsSrt = '';

$e = &$modx->event;
if ($e->name == 'OnWUsrFormRender') {
  
  if (count($hideFields)>0) {
    foreach ($hideFields as $field) {
      $hideFieldsSrt .= "document.querySelector('[name=".$field."]').parentNode.parentNode.style.display = 'none';";
    }
  }

  if (count($renameFields)>0) {
    foreach ($renameFields as $field) {
      $val = explode('||',$field);
      $renameFieldsSrt .= "document.querySelector('[name=".$val[0]."]').parentNode.parentNode.children[0].innerHTML='". $val[1] . "';";
    }
  }

  if ('' != $hideFieldsSrt || '' != $renameFieldsSrt) {
    $output = "
    <!-- ManageUserFields plugin -->
    <script type=\"text/javascript\">
    ".$hideFieldsSrt."
    ".$renameFieldsSrt."
    </script>";
  }
}
$e->addOutput($output);


Этот же код на github gist.

Пример конфигурации представлен в коде плагина.

Для скрытия — перечисляем name-атрибуты полей через запятую.
Для переименования — записываем name-атрибут через две вертикальные черты с новым названием и эти пары пишем через запятую.

Результат
Было:
редактирование веб-пользователей modx evo

Стало:
изменение полей веб-пользователей

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

Такие вот возможности у плагинов в MODX.

Update 20.03.2019
Обновлен код плагина. Теперь JS-код без зависимостей от Mootools или JQuery.

15 комментариев

avatar
Молчаливое плюсование — признак того, что у всех захватило дух от такого решения, насколько я понимаю.

По существу: круто. Спасибо.
avatar
Спасибо, хоть кто-то не постеснялся высказаться. ;)
Может просто не такое уж нужное решение.
avatar
Нужное. Вот только я немного другим костылем для этих целей воспользовался когда сайт http://agel-nash.ru делал
if($modx->Event->name=='OnWUsrFormPrerender'){
  global $_lang;
  $_lang["user_mobile"]='Способ оплаты';
  $_lang["user_zip"] = 'Сумма оплаты';
  $_lang["user_state"] = 'Статус оплаты';
  $_lang["user_fax"] = 'Дата и время оплаты';
}
Комментарий отредактирован 2013-02-23 19:23:22 пользователем Agel_Nash
avatar
Тоже остроумно.
avatar
а если сделал вот так

$_lang["user_zip"] = '<style>.user_zip {display:none;}</style>';

только посмотреть какой именно там класс или id то можно и скрыть поле))
avatar
Там нет классов и id. Там простая таблица.
Поэтому я и привязывался к name и от него поднимался по parentNode.
В mootools следующей версии уже можно проще — getParent('tr');
avatar
надо глянуть на сколько совместим старый мутулс и новый
avatar
Ну жили же как-то до этого со старым и, по-моему, никто не страдал особо. Впихивают jquery сразу и с ним уже делают что надо.
Я пытался подсунуть в админку mootools по-новее, но валились ошибки. Может Agel_Nash доберется и глянет как там можно обновиться. Говорил, что не плохо знает этот фреймворк.
avatar
А можно вопрос. Зачем вам новая версия mootools? Просто чтобы было?
avatar
Вот и я о том же. Не так уж и нужна.
Только если заморачиваться и еще в каких-нить местах админки задачи решать придется. Я пока искал информацию, понял, что следующие версии по-функциональней значительно.
avatar
Вот пока свой велосипед не сделаешь — никто не признается о возможностях.

Я даже не лез в плагины на это событие пока не потребовалось скрыть некоторые поля.
А со скрытием решил и переименование приделать уже.
avatar
Вот пока свой велосипед не сделаешь — никто не признается о возможностях.
Скорее так. Пока никто не выложит свои наработки в определенном направлении, никому и в голову не придет, что такая мелочь может кому-то еще понадобиться.
avatar
Спасибо за хорошее решение! Во избежание недоразумений, было бы полезно в топике указать ограничение длин пользовательских атрибутов в базе данных, например для менеджеров: country(5), zip(25), state(25), fax(100), street(255), city(255). Также, думаю не помешает на ряду с OnWUsrFormRender обрабатывать и OnUserFormRender, а галочками уже выбирать нужное событие или оба.
avatar
В последний версиях движка работает криво. Показывает и старые названия полей и новые. Апдейт будет?
avatar
О, сам нашел и исправил. Надо в этой строчке
\$E('.".$val[0]." td').setText('".$val[1]."');"

поменять td на th
\$E('.".$val[0]." th').setText('".$val[1]."');"
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.