Практические решения

Расширенные профили пользователей в Joomla 1.7

Joomla
Добавление в избранное
Сохранить

Расширенные профили пользователей в Joomla 1.7

Итак, вы создали сайт. Однако Перед нами стоит задача по реализации дополнительных полей профиля пользователей на странице регистрации. Для этого не нужно ставить трактор типа Community Builder, ибо мы можем настроить расширеные профили пользователей в Joomla 1.7 - то, чего так не хватало в 1.5.

Часть 1. Настройка профиля пользователя в Joomla 1.7

Настройка расширенного профиля делается следующим образом:

1. Идём в Расширения > Менеджер плагинов > Пользователь - Профиль. Нажимаем в название плагина для перехода в режим редактирования.

2. Публикуем плагин. Далее смотрим доступные режимы в правой части экрана.

Расширенные профили пользователей в Joomla 1.7

 

Этот список настроек содержит дополнительные типы данных, которые будут отображаться в профиле пользователя. По умолчанию всем настройкам выставлено значение "не обязательно". Это означает, что такие поля будут отображаться на странице регистрации пользователя и на странице редактирования профиля, однако данная информация не  будет обязательной к заполнению. Режим "Обязательно" делает поля обязательными к заполнению (пользователь не сможет зарегистрироваться не заполнив такое поле), режим "отключено", соответственно, отключает параметр во фронте.

Группа основных параметров в закладке "основные параметры" будет отображаться на странице регистрации пользователя во фронтальной части сайта, также как и в режиме редактирования профиля пользователя в панели администрирования. Нижняя часть параметров предназначена для формы изменения профиля.

3. На картинке, приведенной ниже, я внес следующие изменения:

  • Отключил параметры: любимая книга, условия предоставления услуг (Terms of Service) и дата рождения;
  • Сделал обязательными параметры телефона и Веб-сайта.

4. Нажимем "Сохранить и закрыть" в верхней правой части админ.панели. Открываем фронтальную часть сайта. У меня установлена обычная версия Joomla 1.7 с демо-данными. Нажав на ссылку "Создать аккаунт" в модуле авторизации (левая колонка шаблона), получаю следующую картину:

Создание расширенного профиля пользователя Joomla 1.7

 

Если снова переключиться на закладку с панелью управления и проследовать в верхнем меню: Сайт - Профиль пользователя, в вашем пользовательском профиле появятся добавленными нами ранее обязательные параметры для редактирования. Обратим внимание на правую часть экрана и дополнительные опции:

Создание расширенного профиля пользователя Joomla 1.7

Возможно выйти из режима редактирования профиля нажав на иконку "отмена", но в случае нажатия на кнопку "сохранить", вам потребуется заполнить обязательные параметры "Телефон" и "Веб-сайт".

Если владелец сайт (клиент) хочет собирать информацию о пользователях в виде отчета, то, к сожалению, экспорт этих данных в базовых возможностях Joomla не предусмотрен. Однако все данные хранятся в базе-данных, поэтому в случае надобности можно написать собственное решение, позволяющие экспортировать данные или поискать аналог на JED.

Дополнительные поля профиля пользователей в Joomla! 1.7+

Еще одна интересная особенность, о которой важно упомянуть - возможность легкого изменения и добавления параметров профиля пользователя путем редактирования xml файла плагина. Файл находится по следующему пути: plugins/user/profile/profiles/profile.xml. Можно внести модификацию и добавить свои поля / поменять текущие. Однако я не рекомендую этого делать ввиду нежелательности вносить изменения в core файлы, т.к. при последующем обновлении Joomla, вы можете затереть эти изменения. И здесь нам на помощь приходит смекалка и руки: ведь можно создать собственный плагин профиля пользователей в Joomla 1.7. Чему, собственно говоря, посвящена следующая часть статьи. 

Часть 2. Создание собственного плагина профиля пользователей в Joomla

Плагин профиля пользователей является нововведением в Joomla 1.7+. Он позволяет добавить дополнительные поля в форму регистрации и профиль пользователя во фронте и возможность редактировать их в панели администрирования.

Простой пример - стандатрный плагин под названием Пользователь - Профиль, идущий в дистрибутиве Joomla. Но ведь ничто не мешает переписать его и сделать собственный, расширенный плагин.

Плагин, который мы рассмотрим, использует премущества событий onContentPrepareForm и onUserAfterSave.

Joomla может исполнять ряд плагинов профиля пользователей в последовательном режиме.

В стандартном функционале Joomla формы профиля используются в четырех случаях и отображение в каждом из которых можно индивидуально настроить (если требуется):

  1. Страница регистрации пользователя
  2. Страница редактирования профиля во фронтэнде сайта
  3. Режим управления полями профилей в панели управления плагином
  4. Режим "Мой профиль" в панели управления.

Ниже разберем пример создания второго плагина полей пользовательского профиля и условно назовем его Пользователь - Профиль 5 - profile5. Плагин позволит нам добавить дополнительные параметры к существующим и будет дополнять стандартный плагин Пользователь - Профиль.

Структура плагина профиля пользователей:

profile5.php
profile5.xml
ru-RU.plg_user_profile5.ini
ru-RU.plg_user_profile5.sys.ini
/profiles/profile.xml

Поля с параметрами профиля формируются в profile.xml файле, расположенном в папке плагина профиля.


<?xml version="1.0" encoding="utf-8"?>
 
<form>
        <fields name="profile5">
                <fieldset name="profile5"
                        label="PLG_USER_PROFILE5_SLIDER_LABEL"
                >
                        <field
                                name="something"
                                type="text"
                                id="something"
                                description="PLG_USER_PROFILE5_FIELD_SOMETHING_DESC"
                                filter="string"
                                label="PLG_USER_PROFILE5_FIELD_SOMETHING_LABEL"
                                message="PLG_USER_PROFILE5_FIELD_SOMETHING_MESSAGE"
                                size="30"
                        />
                </fieldset>
        </fields>
</form>

 Создаем файл profile5.php:


<?php
 /**
  * @copyright  Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved.
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
  */
 
 defined('JPATH_BASE') or die;
 
  /**
   * An example custom profile plugin.
   *
   * @package     Joomla.Plugins
   * @subpackage  user.profile
   */
  class plgUserProfile5 extends JPlugin
  {
        /**
         * @param   string  The context for the data
         * @param   object  User object
         * 
         * @return  boolean
         * @since   1.6
         */
        function onContentPrepareData($context, $data)
        {
                // Check we are manipulating a valid form.
                if (!in_array($context, array('com_users.profile','com_users.registration','com_users.user','com_admin.profile'))){
                        return true;
                }
 
                $userId = isset($data->id) ? $data->id : 0;
 
                // Load the profile data from the database.
                $db = JFactory::getDbo();
                $db->setQuery(
                        'SELECT profile_key, profile_value FROM #__user_profiles' .
                        ' WHERE user_id = '.(int) $userId .
                        ' AND profile_key LIKE \'profile5.%\'' .
                        ' ORDER BY ordering'
                );
                $results = $db->loadRowList();
 
                // Check for a database error.
                if ($db->getErrorNum()) {
                        $this->_subject->setError($db->getErrorMsg());
                        return false;
                }
 
                // Merge the profile data.
                $data->profile5 = array();
                foreach ($results as $v) {
                        $k = str_replace('profile5.', '', $v[0]);
                        $data->profile5[$k] = json_decode($v[1], true);
                }
 
                return true;
        }
 
        /**
         * @param   JForm  The form to be altered.
         * @param   array  The associated data for the form.
         * 
         * @return  boolean
         * @since   1.6
         */
        function onContentPrepareForm($form, $data)
        {
                // Load user_profile plugin language
                $lang = JFactory::getLanguage();
                $lang->load('plg_user_profile5', JPATH_ADMINISTRATOR);
 
                if (!($form instanceof JForm)) {
                        $this->_subject->setError('JERROR_NOT_A_FORM');
                        return false;
                }
                // Check we are manipulating a valid form.
                if (!in_array($form->getName(), array('com_users.profile', 'com_users.registration','com_users.user','com_admin.profile'))) {
                        return true;
                }
                if ($form->getName()=='com_users.profile')
                {
                        // Add the profile fields to the form.
                        JForm::addFormPath(dirname(__FILE__).'/profiles');
                        $form->loadFile('profile', false);
 
                        // Toggle whether the something field is required.
                        if ($this->params->get('profile-require_something', 1) > 0) {
                                $form->setFieldAttribute('something', 'required', $this->params->get('profile-require_something') == 2, 'profile5');
                        } else {
                                $form->removeField('something', 'profile5');
                        }
                }
 
                //In this example, we treat the frontend registration and the back end user create or edit as the same. 
                elseif ($form->getName()=='com_users.registration' || $form->getName()=='com_users.user' )
                {               
                        // Add the registration fields to the form.
                        JForm::addFormPath(dirname(__FILE__).'/profiles');
                        $form->loadFile('profile', false);
 
                        // Toggle whether the something field is required.
                        if ($this->params->get('register-require_something', 1) > 0) {
                                $form->setFieldAttribute('something', 'required', $this->params->get('register-require_something') == 2, 'profile5');
                        } else {
                                $form->removeField('something', 'profile5');
                        }
                }                       
        }
 
         /**
         * Method is called after user data is deleted from the database
         *
         * @param   array    $data    Holds the user data
         * @param   array    $isNew   True if a new user is stored
         * @param   boolean  $result  True if user was succesfully stored in the database
         * @param   string   $error   Error message
         * 
         * @return  boolean
         */
        function onUserAfterSave($data, $isNew, $result, $error)
        {
                $userId = JArrayHelper::getValue($data, 'id', 0, 'int');
 
                if ($userId && $result && isset($data['profile5']) && (count($data['profile5'])))
                {
                        try
                        {
                                $db = JFactory::getDbo();
                                $db->setQuery('DELETE FROM #__user_profiles WHERE user_id = '.$userId.' AND profile_key LIKE \'profile5.%\'');
                                if (!$db->query()) {
                                        throw new Exception($db->getErrorMsg());
                                }
 
                                $tuples = array();
                                $order  = 1;
                                foreach ($data['profile5'] as $k => $v) {
                                        $tuples[] = '('.$userId.', '.$db->quote('profile5.'.$k).', '.$db->quote(json_encode($v)).', '.$order++.')';
                                }
 
                                $db->setQuery('INSERT INTO #__user_profiles VALUES '.implode(', ', $tuples));
                                if (!$db->query()) {
                                        throw new Exception($db->getErrorMsg());
                                }
                        }
                        catch (JException $e) {
                                $this->_subject->setError($e->getMessage());
                                return false;
                        }
                }
 
                return true;
        }
 
        /**
         * Remove all user profile information for the given user ID
         *
         * Method is called after user data is deleted from the database
         *
         * @param   array    $user     Holds the user data
         * @param   boolean  $success  True if user was succesfully stored in the database
         * @param   string   $msg      Message
         * 
         * @return  boolean
         */
        function onUserAfterDelete($user, $success, $msg)
        {
                if (!$success) {
                        return false;
                }
 
                $userId = JArrayHelper::getValue($user, 'id', 0, 'int');
 
                if ($userId)
                {
                        try
                        {
                                $db = JFactory::getDbo();
                                $db->setQuery(
                                        'DELETE FROM #__user_profiles WHERE user_id = '.$userId .
                                        " AND profile_key LIKE 'profile5.%'"
                                );
 
                                if (!$db->query()) {
                                        throw new Exception($db->getErrorMsg());
                                }
                        }
                        catch (JException $e)
                        {
                                $this->_subject->setError($e->getMessage());
                                return false;
                        }
                }
 
                return true;
        }
 }

Файл profile5.xml отвечает за поля, настраиваемые в панели управления (обязательное поле, выключено, необязательное). Поскольку profile5.php отвечает за создание / редактирование полей в панели управления, которые присутствуют и на странице регистрации, то он использует два набора параметров: register и profile.

<?xml version="1.0" encoding="utf-8"?>
<extension version="1.7" type="plugin" group="user">
    <name>plg_user_profile5</name>
    <author>Joomla! Project</author>
    <creationDate>January 2008</creationDate>
    <copyright>(C) 2005 - 2013 Open Source Matters. All rights reserved.</copyright>
    <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
    <authorEmail>admin [at] joomla.org</authorEmail>
    <authorUrl>www.joomla.org</authorUrl>
    <version>1.0.0</version>
    <description>PLG_USER_PROFILE5_XML_DESCRIPTION</description>
 
    <files>
            <filename plugin="profile5">profile5.php</filename>
            <filename>index.html</filename>
            <folder>profiles</folder>
    </files>
 
    <languages>
            <language tag="ru-RU">ru-RU.plg_user_profile5.ini</language>
            <language tag="ru-RU">ru-RU.plg_user_profile5.sys.ini</language>
    </languages>
 
    <config>
        <fields name="params">
 
            <fieldset name="basic">
                <field name="register-require-user" type="spacer"
                        label="PLG_USER_PROFILE5_FIELD_NAME_REGISTER_REQUIRE_USER"
                />
 
                <field name="register-something" type="list"
                        description="PLG_USER_PROFILE5_FIELD_SOMETHING_DESC"
                        label="PLG_USER_PROFILE5_FIELD_SOMETHING_LABEL"
                >
                        <option value="2">JOPTION_REQUIRED</option>
                        <option value="1">JOPTION_OPTIONAL</option>
                        <option value="0">JDISABLED</option>
                </field>
 
                <field name="profile-require-user" type="spacer"
                        label="PLG_USER_PROFILE5_FIELD_NAME_PROFILE_REQUIRE_USER"
                />
 
                <field name="profile-require_something" type="list"
                        description="PLG_USER_PROFILE5_FIELD_SOMETHING_DESC"
                        label="PLG_USER_PROFILE5_FIELD_SOMETHING_LABEL"
                >
                        <option value="2">JOPTION_REQUIRED</option>
                        <option value="1">JOPTION_OPTIONAL</option>
                        <option value="0">JDISABLED</option>
                </field>
 
            </fieldset>
 
        </fields>
    </config>
 </extension>

Создаем файл локализации ru-RU.plg_user_profile5.sys.ini:


; Joomla! Project
; Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php
; Note : All ini files need to be saved as UTF-8
PLG_USER_PROFILE5="Пользователь - профиль 5"
PLG_USER_PROFILE5_XML_DESCRIPTION="Плагин профилей пользователей 5"

И ru-RU.plg_user_profile5.ini:


; Joomla! Project
; Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php
; Note : All ini files need to be saved as UTF-8
PLG_USER_PROFILE5_XML_DESCRIPTION="Плагин профиля пользователей 5"
PLG_USER_PROFILE5="Пользователь - Профиль 5"
PLG_USER_PROFILE5_SLIDER_LABEL="Пользователь - профиль 5"
PLG_USER_PROFILE5_FIELD_NAME_REGISTER_REQUIRE_USER="User profile fields for registration and administrator user profile 5 forms"
PLG_USER_PROFILE5_FIELD_NAME_PROFILE_REQUIRE_USER="User profile fields for profile 5 edit form"
PLG_USER_PROFILE5_FIELD_SOMETHING_DESC="Choose an option for the something filed"
PLG_USER_PROFILE5_FIELD_SOMETHING_LABEL="Something!"
PLG_USER_PROFILE5_FIELD_SOMETHING_MESSAGE="A Message for something!"
PLG_USER_PROFILE5_XML_DESCRIPTION="User Profile 5 Plug-in"

Установив плагин profile5, вы можете добавить новые поля в дополнение к существующим в профиль пользователей. Также возможно управлять правами доступа этих полей. В случае, если возможностей данного плагина будет недостаточно, всегда можно написать более расширенный плагин, в котором возможно назначать права доступа разным группам пользователей.

Удачных экспериментов!

Статья подготовлена по материалам:

Joomla 1.7: Expanded User Profiles

Creating a profile plugin

Eugene Sivokon
Предприниматель, менеджер проектов, Joomla-энтузиаст. Занимаюсь созданием сайтов с 2002 года. Координатор нескольких Joomla проектов. Обожаю путешествовать, интересуюсь историей и изучаю иностранные языки.

Подпишитесь на рассылку новостей CMScafe