Дополнительные поля профиля юзера (не extended)

Разрабатываю проект, в котором необходимо было реализовать более простое редактирование дополнительных полей профиля, чем есть из коробки. К слову, неудобное редактирование — это не единственный минус нативного способа расширения профиля полями. Ни для кого не секрет, что фильтрацию по JSON полям нормально не осуществить, только костылями. Фактически, мне надо было получить решение, которое бы расширяло стандартный код MODX, не трогая исходники, дабы сохранить
Пришёл к выводу, что буду расширять стандартную вкладку профиля «Общая информация». При желании можно чуть переписать код в событии OnUserFormPrerender и создать свою вкладку со своими полями.
Инструкция получения дополнительных полей, как на скриншоте выше
- Первым делом идём в phpMyAdmin (или что-то подобное) и создаём:
- столбец new_checkbox в таблице modx_users:

ALTER TABLE `modx_users` ADD `new_checkbox` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1' ; - столбец new_field в таблице modx_user_attributes:

ALTER TABLE `modx_user_attributes` ADD `new_field` VARCHAR(255) NOT NULL ;
- столбец new_checkbox в таблице modx_users:
- После этого нам осталось повесить плагин на события OnMODXInit и OnUserFormPrerender:
switch ($modx->event->name) { case "OnMODXInit": $map = array( 'modUser' => array( 'fields' => array( 'new_checkbox' => 1, ), 'fieldMeta' => array( 'new_checkbox' => array( 'dbtype' => 'tinyint', 'precision' => '1', 'phptype' => 'boolean', 'attributes' => 'unsigned', 'null' => false, 'default' => 1, ), ), ), 'modUserProfile' => array( 'fields' => array( 'new_field' => '', ), 'fieldMeta' => array( 'new_field' => array( 'dbtype' => 'varchar', 'precision' => '255', 'phptype' => 'string', 'null' => false, ), ), ), ); foreach ($map as $class => $data) { $modx->loadClass($class); foreach ($data as $tmp => $fields) { if ($tmp == 'fields') { foreach ($fields as $field => $value) { foreach (array('fields', 'fieldMeta', 'indexes') as $key) { if (isset($data[$key][$field])) { $modx->map[$class][$key][$field] = $data[$key][$field]; } } } } elseif ($tmp == 'composites' || $tmp == 'aggregates') { foreach ($fields as $alias => $relation) { if (!isset($modx->map[$class][$tmp][$alias])) { $modx->map[$class][$tmp][$alias] = $relation; } } } } } break; case "OnUserFormPrerender": if (!isset($user) || $user->get('id') < 1) { return; } if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) { $data['new_checkbox'] = $user->new_checkbox ? 'true' : 'false'; $data['new_field'] = htmlspecialchars($user->Profile->new_field); $modx->controller->addHtml(" <script type='text/javascript'> Ext.ComponentMgr.onAvailable('modx-user-tabs', function() { this.on('beforerender', function() { // Получаем колонки первой вкладки var leftCol = this.items.items[0].items.items[0].items.items[0]; var rightCol = this.items.items[0].items.items[0].items.items[1]; // Добавляем новое поле в левую колонку 4ым по счёту полем (перед полем 'Email') leftCol.items.insert(4, 'modx-user-new-field', new Ext.form.TextField({ id: 'modx-user-new-field', name: 'new_field', fieldLabel: 'Новое поле профиля', xtype: 'textfield', anchor: '100%', maxLength: 255, value: '{$data['new_field']}', })); // Добавляем чекбокс первым по счёту полем (перед чекбоксом 'Активный') rightCol.items.insert(0, 'modx-user-new-checkbox', new Ext.form.Checkbox({ id: 'modx-user-new-checkbox', name: 'new_checkbox', hideLabel: true, boxLabel: 'Новый чекбокс юзера', description: 'Описание нового чекбокса...', xtype: 'xcheckbox', inputValue: 1, listeners: { beforerender: function(that) { that.hiddenField = new Ext.Element(document.createElement('input')).set({ type: 'hidden', name: that.name, value: 0, }); }, afterrender: function(that) { that.el.insertHtml('beforeBegin', that.hiddenField.dom.outerHTML); }, }, checked: {$data['new_checkbox']}, })); }); }); </script> "); } break; }
Небольшое пояснение, что вообще делает этот плагин
В первом событии (OnMODXInit) происходит расширение модели классов системы нашими дополнительными полями.Во втором событии (OnUserFormPrerender) мы, перед рендерингом формы юзера, встраиваем наши поля среди уже имеющихся полей профиля.
Итого
Мы получаем свои дополнительные поля данных, встроенные в стандартный MODX, без использования JSON извращения, которое мы имеем из коробки.Комментарии: 138
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
или
Вообще можно, если так, но надо понимать, что при назначении группы, смены набора полей происходить не будет. Ибо при входе на страницу редактирования юзера в код будет подгружен один набор полей для нужной группы, либо не будет подгружен никакой вообще, т.к. юзер не состоит ни в той, ни в другой группе. И когда мы будем менять группу у юзера на вкладке «Права доступа», то нам нужно будет совершать перезагрузку страницы вручную, чтобы подгрузить нужный набор полей.
Проще создать отдельную вкладку для всех новых полей и там разделить их между собой либо подвкладками, как это сделано в новой версии miniShop2, либо FieldSet-ами.
Пашин способ проще, приятнее и более «родной» для всех компонентов системы.
а
писать.
Я не могу сказать точно, тебе будет проще всё это проверить самому. И вообще, неплохо почитать исходники компонентов, которые уже делают что-то подобное, например miniShop2 и сравнить со своим кодом. А также, читать документацию по ExtJS 3.4. И пробовать, пробовать, пробовать… У меня только так получается разобраться с ошибками при написании компонентов.
Вопрос: как сделать так, чтобы все нормально сохранялось в поле extended, если хочется без доп таблиц?
Тут нет доп таблиц, здесь ты расширяешь системную таблицу своими полями.
Как ни пробую вставлять свой файл comments2.grid.js он все время расположен выше файлов тикетс. Как я понял, чтобы переопределение работало надо, чтобы свой файл подключался ниже файлов тикетс.
Вот такой плагин получился и не надо создавать никаких comments2.grid.js.
но в любом случае не понимаю как у вас работает, вот смотрите я включил ваш плагин и при регистрации выдает следующее joxi.ru/D2PDj6MId5Pdg2 хотя в пользователях его нет joxi.ru/ZrJXVE7h1BP962, после чего он добавляется joxi.ru/LmGEV7ktR0Pe5A, но сообщение на мыло не приходит и как можете заметить емейл добавляется не в поле емейл а в имя.
авторизация так же глючит я создал пользователя но мне выдает вот такое joxi.ru/D2PDj6MId5Ppg2
Кстати, можно на «ты».
— Обновлено
Ну и как следствие, спокойно зарегистрировался на сайте со своим мылом через форму Office.
Рад помочь.
Именно!
Поле типа minishop2-combo-autocomplete не показывает варианты выбора, пока не начнешь вводить первые буквы в поле ввода. Как сделать обычное поле select с несколькими статичными вариантами выбора?
На счёт «как сделать» — присмотреться к КомбоБоксу. И вообще, почаще читать документацию той технологии, с которой работаешь. А также, смотреть на уже готовые решения, хотя бы в самом MODX Revolution.
Оба поля в профиле есть, но сохраняется только одно patronymic. Поле surname очищается после сохранения. Подскажите как сохранить оба этих поля?
Проще говоря, вместо:
Надо так:
как я понял проблема тут
айдишник check_hidden заменяется check_hidden1 и получается два чекбокса с одним айди, как это исправить? или не в этом проблема?
А нужно:
На это не обратил внимания:) Спасибо за разъяснение.
А в чем принципиальная разница в какой таблице хранить данные? Я добавил все 6 полей в modUserProfile.
В частности со страницы редактирования профиля Office и на странице создания заказа MiniShop?
Что то простое вида:
У меня стояла задача добавить поля «Дом» и «Номер квартиры» в профиль пользователя и отображать содержимое этих полей при создании нового заказа в miniShop2. Поля building и room — это единственные поля, которые не совпадают с полями в стандартном профиле пользователя, в результате чего при создании нового заказа приходится указывать номер дома и квартиры каждый раз в ручную.
Выполнил инструкцию из первого поста. После чего внес изменения в параметры сниппета officeProfile и в чанки tpl.msOrder (miniShop2), tpl.Office.profile.form (Office)
Для отображения нового поля в профиле в параметрах сниппета officeProfile, в раздел profileFields необходимо добавить поле new_field и соответствующее поле input
Для отображения нового поля при создании нового заказа в чанке tpl.msOrder отредактировал соответсвущий input
А то я сделал два поля, которые:
1) Не работают (ставлю галки на вкладке «Системные события» напротив OnMODXInit и OnUserFormPrerender у плагина — блок «Пользователи» не рендериться)
2) Просто текстовые
У меня возникла необходимость вынести дополнительное поле в отдельную вкладку, но при добавлении параметра «value» она у меня почему-то не отображается, без этого параметра все выводиться, помогите пожалуйста разобраться в чем моя ошибка, вот так я добавляю новую вкладку и вывожу в ней дополнительное поле:
За ранее благодарен за оказанную помощь.
Однако, после сохранения юзера на тестовом сайте modhost.pro, все отлично работает. И данные вводятся в поля, и редактировать их можно.
часть снипета с записью в поля:
как то так
не критично. Повторюсь сам метод мне понятен, прост и мне вполне подходит. Спасибо за него
Павлу.
core\components\userimport\model\userimport\importhandler.class.php
Вписал туда соответствующие строки в двух местах, по образу и подобию уже имеющихся, и всё сработало, юзеры импортировались как надо. Просто когда в первый раз искал где оно прописано, по невнимательности пропустил этот файл, и решил что приложение берет список полей откуда-то еще.
Добавляю копию поля dob и называю dov (Хочу добиться результата, чтобы в админке одинаково они вывелись)
Получился плагин
Поле появляется там, где надо, но без кнопки с календарём и дата в unix формате вместо обычного.
Если использовать textfield то выводится дата в unix, а если datefield, то ничего не выводится.
Что надо написать, чтобы в админке дата нормально выводилась?
Больше ничего подсказать не смогу, надо разбираться непосредственно с вашей проблемой. 1 час = 2к руб.
(несмотря на то, что сам modx в схеме для dob использует 'phptype' => 'integer',)
Всегда выводится пустой. При изменении, не сохраняется.
new_field выводится и сохраняется.
Как правильно вывести checkbox на фронте?
Новые поля необходимо добавить в параметры сниппета officeProfile
С полем new_field все нормально.
kvartira — новое поле
Не подскажите, как правильно вывести на фронте?
Заработало.
пробовал , но в итоге вышла ошибка
А каким образом можно использовать текстовый редактор например TinyMCE вместо обычных полей?
Заранее благодарю за ответ.
Подскажите как можно сделать чтобы checkbox по умолчанию был не отмеченным?
Уже исправил значения столбца по умолчанию в БД на DEFAULT '0'
и в плагине заменил
и всё равно при регистрации нового пользователя у него по умолчанию отмечен checkbox.
А у пользователей которые были ранее зарегистрированны checkbox'ы не стоят.
нужен похожий способ что бы внести изменения в новые поля.
Добавил такое поле:
Оно отображает текущее состояние чекбокса, но при изменении значения не меняет и в базу не сохраняет
где я что то упустил?
Если менять в бекенде то все меняется и в базу пишет нормально. И если менять в беке то и на фронте меняет значение.
мой вызов:
В ответе выше говорилось про скрытое поле перед checkbox, можно немного подробнее?
У меня задача заключается в создании около 50-ти дополнительных полей для всех пользователей. В эти поля отдельным скриптом пишутся текущие характеристики пользователя и уже средствами MODx между ними производится пересчёт. Подскажите пожалуйста что я делаю не так и куда поместить код?
Структура состоит из:
— Шаблонов (шаблоны страниц);
— Чанков (куски HTML-тэгов из которых состоит Шаблон);
— TV-параметры (добавляемые поля, которые крепятся к шаблону, имеющие разные типы от чекбоксов до более сложных как MIGX);
— Сниппет (PHP-код имеющий параметры и используемый на фронтенде);
— Плагин (PHP-код имеющий события, на которые можно вешать любые действия в админпанели);
— Категории (ярлыки для более удобного распределения вышеперечисленных элементов).
Нет, pdoTools — это компонент (пакет), который из себя представляет список сниппетов для работы с базой данных через xPDO.
Я не хочу хардкодить поля шаблона в админке, но они нужны не только на фронтенде, где я могу их получить «в лоб», а хотелось бы грамотно организовать работу для админа с возможностью вносить корректировки через редактирование профиля.
С этими понятиями я знаком с появления Revo, здесь тоже частый гость. Но раньше потребности вмешиваться в дефолтную админку не возникало.
Вы это имеете ввиду, когда говорите «навесить события» или нужно где-то ещё внести какие-либо правки?
Вот честное слово была бы возможность я бы вам на ящик пива даже скинул.
Современем потом найду этот топик и надеюсь скину позже
Кому нежалко, отблагодарите человека за такое суперовое решение!!!
Мне помогли, я бы денег дал даже за помощь. Но не дам. Кому не жалко сами дайте.
данный топик у меня в избранных до лучших времён
вот решение без cheeckbox
во фронтенде
музыка
фотография
автомобили
чтение литературы
Plugin: profileinteresi (дополнительное поле интересы пользователя)
System Events
OnMODXInit
OnUserFormPrerender
надеюсь моя небольшая модернизация без checkbox равносильна пиву?
буду признателен очень, если кто подскажет, как вывести дополнительные поля user profile во фронтенде
Плагин повесил на указанные события
На странице редактирования профиля вывожу
Пытаюсь отредактировать профиль а поля которые были созданы не сохраняются. При этом если в админке редактировать то поля сохраняются. А на сайте не хотят сохраняться. В чем может быть причина может что то не так сделал?
Стандартные поля при этом изменить можно на сайте. Не получается только добавленные.
Все равно ничего не сохраняет на сайте.
upd: проблема решилась очисткой кэша
Если следовать вашему примеру, то зайдя в профиль юзера,
в поле «Новое поле профиля» написать вместо:
Можно сохранять что угодно…
например
Можно сохранять что угод'но…
Сохраняем, заходим еще раз в профиль этого пользователя и вуаля… нового поля нет (а если было не одно новое поле, то и других бы тоже).
Неприятность находится здесь:
Внесите в код правку:
Или, как вариант, впихнуть какую-то регулярку…
Надеюсь, это кому-то поможет.
Мой плагин получился таким.
я пытался так, но не работает, Но текстовое поле обновляется, а вот чекбокс никак
ну и внимательно смотрите где это поле у вас в modUser или же в modUserProfile
В данном случае при первой перезагрузке страницы выведется и email и layer, при повторной же emal выведется а свое поле будет null
B так каждый раз пока кэш не очистишь
Данные в БД храню в integer формате в unixtimestamp
Мне важно получить дату до какого времени оплачен доступ у юзера, потому условно дата 01/01/2023, то сохраняю 01/01/2023 23:59:59 (GMT+0000)
Ну и соответственно потом показываю по разному данную дату (в подписи к полю — в привычном порядке для СНГ — день/месяц/год), а в самом поле, как по умолчанию месяц/день/год.
И да, для сохранения заюзал еще одно системное событие OnBeforeUserFormSave
Как адаптировать плагин под MODx 3?
Под MODx 3 не читает значения из полей пользователя, ни из modUser, ни из modUserProfile.
Получаются пустые значения, а при сохранении, в БД ничего не сохраняется :(