Дополнительные поля у юзера
Решаю задачу по расширению кабинета юзера. Сначала пошел по пути создания extended полей. Это было легко, однако, когда начался процесс работы с фильтрами сайта, тут выяснилось, что компоненты mSearch2 не может работать с этими полями, потому что они представляют собой массив данных в одном поле, и для того, чтобы работать с ними, надо распарсивать их предварительно.
Потому я задам вопрос такой, можно ли как-то адаптировать extended-поля для компонента mFilter и mSearch2? Без многочисленных допиливаний и редактирования ядра системы, потому что я там уже много что менял в целях эксперимента системы.
Второй вопрос: Если нельзя с экстендед полями работать через фильтры, то почему вот эти статейки про расширение кабинета юзера не работают?
1) modx.pro/howto/8889-extra-fields-and-user-profile-not-extended/
2) modx.pro/solutions/7037-expanding-any-table-modx/
Пишут, что все вот так просто редактируется, а на самом деле, даже копипаст не работает.
Пробовал редактировать файлы по директории:
сайт\manager\assets\modext\widgets\security\modx.panel.user.js
в ядре редактировал данные, тем не менее на результат это не повлияло. Я смог создавать поля, но они не сохраняли данные, и плюс еще лабелы у них пропадали почему-то. Подскажите, что надо сделать, помимо этих двух заметок, что выше писал, чтобы во фрондэнде админки отобразить новые поля юзера.
Часть кода выглядит так:
В плаггине пишу, к примеру, поле — университета:
switch ($modx->event->name) {
case 'OnMODXInit':
$modx->loadClass('modUser');
/* UniverCity - уровень образования высшее или средне-специальное */
$modx->map['modUser']['fields']['UniverCity'] = 'Университет';
$modx->map['modUser']['fieldMeta']['UniverCity'] = array(
'dbtype' => 'varchar',
'precision' => '255',
'attributes' => 'unsigned',
'phptype' => 'string',
'null' => true,
'default' => 'тест универ',
);
$modx->map['modUserProfile']['fields']['UniverCity'] = 'Универ';
$modx->map['modUserProfile']['fieldMeta']['UniverCity'] = array(
'UniverCity' => array(
'dbtype' => 'varchar',
'precision' => '255',
'phptype' => 'string',
'null' => false,
),
);
case «OnUserFormPrerender»:
if (!isset($user) || $user->get('id') < 1) {
return;
}
if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false)))
{
$data['UniverCity'] = $user->UniverCity;
$data['UniverCity'] = htmlspecialchars($user->Profile->UniverCity);
$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-UniverCity', new Ext.form.TextField({
id: 'modx-user-UniverCity',
name: 'UniverCity',
fieldLabel: 'Университет',
xtype: 'textfield',
anchor: '100%',
maxLength: 255,
value: '{$data['UniverCity']}',
}));
// Добавляем чекбокс первым по счёту полем (перед чекбоксом 'Активный')
rightCol.items.insert(0, 'modx-user-UniverCity', new Ext.form.Checkbox({
id: 'modx-user-UniverCity',
name: 'UniverCity',
hideLabel: true,
boxLabel: 'Университет',
description: 'Описание нового поля...',
xtype: 'textfield',
inputValue: '',
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['UniverCity']},
}));
});
});
</script>
");
}
break;
И в файле \manager\assets\modext\widgets\security\modx.panel.user.js
пишу:
…
{
id: 'modx-user-UniverCity'
,name: 'UniverCity'
,fieldLabel: _('user_UniverCity')
,xtype: 'textfield'
,anchor: '100%'
,maxLength: 255
},
…Итак, моя задача, внедрить фильтры поиска дополнительных расширенных полей юзера во фрондэнд. Экстендед-поля не позволяют этого сделать. Редактирование таблиц user и user_attributes, тоже не дают результата. И это мне уже надоело, я затягиваю проект, заказчик тоже недоволен, потому хотелось бы не получать минусы здесь от вас, а услышать дельный совет по ссылкам, которые я написал. Там не все написано про реализацию фронд-энда что ли или я что-то упускаю?
Комментарии: 5
попробуйте такой плагин
с extJS не работал и не собираюсь, так как для менеджера делаю всегда страницы управления во фронте, где можно те же данные юзеров смотреть и изменять
с extJS не работал и не собираюсь, так как для менеджера делаю всегда страницы управления во фронте, где можно те же данные юзеров смотреть и изменять
<?php
switch ($modx->event->name) {
case "OnMODXInit":
$map = array(
'modUserProfile' => array(
'fields' => array(
'firstname' => '',
'lastname' => '',
'company' => '',
'profile_type' => '',
),
'fieldMeta' => array(
'firstname' => array(
'dbtype' => 'varchar',
'precision' => '100',
'phptype' => 'string',
'collation' => 'utf8_general_ci',
'null' => false,
),
'lastname' => array(
'dbtype' => 'varchar',
'precision' => '100',
'phptype' => 'string',
'collation' => 'utf8_general_ci',
'null' => false,
),
'company' => array(
'dbtype' => 'varchar',
'precision' => '100',
'phptype' => 'string',
'collation' => 'utf8_general_ci',
'null' => false,
),
'profile_type' => array(
'dbtype' => 'int',
'precision' => '10',
'phptype' => 'string',
'attributes' => 'unsigned',
'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;
}
зачем первый цикл?
И второй вопрос: В новом модексе что-то изменилось, раз одного этого скрипта достаточно для работы с дополнительными полями, без extJS?
И не работает ваш код, хотя в таблице user_attributes есть описание этиъ полей, в таблице user тоже я продублировал на всякий случай поля.
Почему у вас нет явного объявления класса?
foreach ($map as $class => $data) {...}
нельзя разве сразу работать с классом Users? И второй вопрос: В новом модексе что-то изменилось, раз одного этого скрипта достаточно для работы с дополнительными полями, без extJS?
И не работает ваш код, хотя в таблице user_attributes есть описание этиъ полей, в таблице user тоже я продублировал на всякий случай поля.
Почему у вас нет явного объявления класса?
$modx->loadClass('modUser');
Универсальный что ли код или что?)
Смущает еще то, что работа идет с массивом
modUserProfile
, а не modUser
Не смущайтесь, а используйте так как написано выше. Плагин 100% рабочий и универсальный (под несколько таблиц), если вы не будете ничего трогать. Вбейте свои поля в плагин, user_attributes, поставьте на событие OnMODXInit и всё.
у меня не работает, к сожалению. Копипастил буквально, тем не менее, не работает. Естественно предварительно создал в таблице такие поля.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.