Дополнительные поля у юзера

Доброго времени суток!

Решаю задачу по расширению кабинета юзера. Сначала пошел по пути создания 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, тоже не дают результата. И это мне уже надоело, я затягиваю проект, заказчик тоже недоволен, потому хотелось бы не получать минусы здесь от вас, а услышать дельный совет по ссылкам, которые я написал. Там не все написано про реализацию фронд-энда что ли или я что-то упускаю?

Андрей
09 апреля 2017, 16:02
modx.pro
1 633
0

Комментарии: 5

Andrei D.
09 апреля 2017, 23:06
1
0
попробуйте такой плагин
с 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;

}
    Андрей
    10 апреля 2017, 05:11
    0
    зачем первый цикл?

    foreach ($map as $class => $data) {...}
    нельзя разве сразу работать с классом Users?

    И второй вопрос: В новом модексе что-то изменилось, раз одного этого скрипта достаточно для работы с дополнительными полями, без extJS?

    И не работает ваш код, хотя в таблице user_attributes есть описание этиъ полей, в таблице user тоже я продублировал на всякий случай поля.

    Почему у вас нет явного объявления класса?

    $modx->loadClass('modUser');
    Универсальный что ли код или что?)
      Андрей
      10 апреля 2017, 05:23
      0
      Смущает еще то, что работа идет с массивом
      modUserProfile
      , а не
      modUser
        Andrei D.
        10 апреля 2017, 07:14
        0
        Не смущайтесь, а используйте так как написано выше. Плагин 100% рабочий и универсальный (под несколько таблиц), если вы не будете ничего трогать. Вбейте свои поля в плагин, user_attributes, поставьте на событие OnMODXInit и всё.
          Андрей
          10 апреля 2017, 11:34
          0
          у меня не работает, к сожалению. Копипастил буквально, тем не менее, не работает. Естественно предварительно создал в таблице такие поля.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5