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

28 марта 2018, 19:39

Дополнительные поля профиля User (не extended) modx revo

Потребовалось на одном проекте в форму профиля добавить для пользователей дополнительные поля. Отдельно Имя, Фамилия, Отчество и поля для добавления ссылок на социальные группы.

Инструкция получения дополнительных полей, как на скриншоте выше

Первым делом идём в phpMyAdmin (или что-то подобное) и создаём:

столбец name в таблице modx_user_attributes:

ALTER TABLE `modx_user_attributes` ADD `name` VARCHAR(255) NOT NULL;

столбец surname в таблице modx_user_attributes:

ALTER TABLE `modx_user_attributes` ADD `surname` VARCHAR(255) NOT NULL;

столбец lastname в таблице modx_user_attributes:

ALTER TABLE `modx_user_attributes` ADD `lastname` VARCHAR(255) NOT NULL;

После этого нам осталось повесить плагин на события OnMODXInit и OnUserFormPrerender:

<?php 
switch ($modx->event->name) {
    case "OnMODXInit":
        $map = array(
            'modUserProfile' => array(
                'fields' => array(
                    'name' => '',
                    'surname' => '',
                    'lastname' => '',
                ),
                'fieldMeta' => array(
                    'name' => array(
                        'dbtype' => 'varchar',
                        'precision' => '100',
                        'phptype' => 'string',
                        'null' => true,
                    ),
                    'surname' => array(
                        'dbtype' => 'varchar',
                        'precision' => '100',
                        'phptype' => 'string',
                        'null' => true,
                    ),
                    'lastname' => array(
                        'dbtype' => 'varchar',
                        'precision' => '100',
                        'phptype' => 'string',
                        'null' => true,
                    ),
                ),
            ),
        );

        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 ($user->get('id') > 0) {
            $data['name'] = htmlspecialchars($user->Profile->name);
            $data['surname'] = htmlspecialchars($user->Profile->surname);
            $data['lastname'] = htmlspecialchars($user->Profile->lastname);

            $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];

                            // Добавляем новое поле в левую колонку 4ым по счёту полем (перед полем 'Email')
                            leftCol.items.insert(3, 'modx-user-name', new Ext.form.TextField({
                                id: 'modx-user-name',
                                name: 'name',
                                fieldLabel: 'Имя',
                                xtype: 'textfield',
                                anchor: '100%',
                                maxLength: 255,
                                value: '{$data['name']}',
                            }));
                            leftCol.items.insert(4, 'modx-user-lastname', new Ext.form.TextField({
                                id: 'modx-user-lastname',
                                name: 'lastname',
                                fieldLabel: 'Отчество',
                                xtype: 'textfield',
                                anchor: '100%',
                                maxLength: 255,
                                value: '{$data['lastname']}',
                            }));
                            leftCol.items.insert(5, 'modx-user-surname', new Ext.form.TextField({
                                id: 'modx-user-surname',
                                name: 'surname',
                                fieldLabel: 'Фамилия',
                                xtype: 'textfield',
                                anchor: '100%',
                                maxLength: 255,
                                value: '{$data['surname']}',
                            }));
                        });
                    });
                </script>
            ");
        }
        break;
}

Если у вас есть компонент Office, можно настроить поля в профиле. Для этого вызываем наш officeProfile со следующими параметрами:

[[!officeProfile?
&profileFields=`username:50,email:50,fullname:50,name:50,surname:50,lastname:50,phone:12,mobilephone:12,dob:10,gender,address,country,city,state,zip,fax,photo,comment,website,specifiedpassword,confirmpassword`
&tplProfile=`tpl.Site.Office.profile.form`
]]

а наш чанк tpl.Site.Office.profile.form будет выглядеть следующим образом:

<form action="" method="post" class="form-horizontal well" id="office-profile-form" enctype="multipart/form-data">
    <div class="header">
        <small>{'office_profile_header' | lexicon}</small>
    </div>

    <div class="form-group avatar">
        <label class="col-sm-2 control-label">{'office_profile_avatar' | lexicon}</label>
        <div class="col-sm-10">
            <img src="{if $photo?}{$photo}{else}{$gravatar}?s=100{/if}" id="profile-user-photo"
                 data-gravatar="{$gravatar}?s=100" width="100"?-->
            <a id="office-user-photo-remove" style="display: none;" href="#">
                {'office_profile_avatar_remove' | lexicon}

            </a>
                        {'office_profile_avatar_desc' | lexicon}<br>
            <input name="photo" type="hidden" value="{$photo}" />
            <input id="profile-photo" name="newphoto" type="file" /></code></pre>{'office_profile_username' | lexicon}<sup>*</sup><br>
/><br>
{$error_username}<br>
{'office_profile_username_desc' | lexicon}<br>
<br>
<br>
{'office_profile_fullname' | lexicon}<sup>*</sup><br>
/><br>
{$error_fullname}<br>
{'office_profile_fullname_desc' | lexicon}<br>
<br>
<br>
Имя<sup>*</sup><br>
{$error_name}<br>
Ваше имя<br>
<br>
<br>
Отчество<sup>*</sup><br>
{$error_lastname}<br>
Ваше отчество<br>
<br>
<br>
Фамилия<sup>*</sup><br>
{$error_surname}<br>
Ваша фамилия<br>
<br>
<br>
{'office_profile_email' | lexicon}<sup>*
{$error_email}<br>
{'office_profile_email_desc' | lexicon}<br>
<br>
<br>
{'office_profile_phone' | lexicon}{if $_modx->config.office_auth_mode == 'phone'} *{/if} <br>
{$error_mobilephone}<br>
{'office_profile_phone_desc' | lexicon}<br>
<br>
<br>
{'office_auth_register_phone_code' | lexicon}<br>
{$error_phone_code}<br>
{'office_profile_phone_code_desc' | lexicon}<br>
<br>
<br>
{'office_profile_password' | lexicon}<br>
{$error_specifiedpassword}<br>
{'office_profile_specifiedpassword_desc' | lexicon}<br>
{$error_confirmpassword}<br>
{'office_profile_confirmpassword_desc' | lexicon}<br>
<br>
<br>
    {if $providers?}{'ha.providers_available' | lexicon}<br>
{$providers}<br>
<br>
    {/if}<hr />{'office_profile_save' | lexicon}      {'office_profile_logout' | lexicon}<br>

Небольшое пояснение, что вообще делает этот плагин

В первом событии (OnMODXInit) происходит расширение модели классов системы нашими дополнительными полями.

Во втором событии (OnUserFormPrerender) мы, перед рендерингом формы юзера, встраиваем наши поля среди уже имеющихся полей профиля.

Итого

Мы получаем свои дополнительные поля данных, встроенные в стандартный MODX, без использования JSON извращения, которое мы имеем из коробки.

SEQUEL.ONE
1    2832    0
+1

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.