Главная » Joomla » Статьи о Joomla » Создание сайтов » Расширенные профили пользователей в Joomla 1.7
Распечатать статью

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

Расширенные профили пользователей в 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.6

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

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

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

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

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

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

В стандартном, т.н. core функционале Joomla, формы профиля используются в четырех случаях, отображение в каждом из которых можно индивидуально настроить, если требуется. В двух случаях это страница регистрации пользователя и страница редактирования профиля во фронте сайта и режим управления полями профилей, а также режим Мой профиль в панели управления.

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

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

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

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

01.<?xml version="1.0" encoding="utf-8"?>
02.
03.<form>
04.<fields name="profile5">
05.<fieldset name="profile5"
06.label="PLG_USER_PROFILE5_SLIDER_LABEL"
07.>
08.<field
09.name="something"
10.type="text"
11.id="something"
12.description="PLG_USER_PROFILE5_FIELD_SOMETHING_DESC"
13.filter="string"
14.label="PLG_USER_PROFILE5_FIELD_SOMETHING_LABEL"
15.message="PLG_USER_PROFILE5_FIELD_SOMETHING_MESSAGE"
16.size="30"
17./>
18.
19.
20.</fieldset>
21.</fields>
22.</form>

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

001.<?php
002./**
003.* @version       
004.* @copyright    Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved.
005.* @license        GNU General Public License version 2 or later; see LICENSE.txt
006.*/
007.
008.defined('JPATH_BASE') or die;
009.
010./**
011.* An example custom profile plugin.
012.*
013.* @package        Joomla.Plugins
014.* @subpackage    user.profile
015.* @version        1.6
016.*/
017.class plgUserProfile5 extends JPlugin
018.{
019./**
020.* @param    string    The context for the data
021.* @param    int        The user id
022.* @param    object
023.* @return    boolean
024.* @since    1.6
025.*/
026.function onContentPrepareData($context, $data)
027.{
028.// Check we are manipulating a valid form.
029.if (!in_array($context, array('com_users.profile','com_users.registration','com_users.user','com_admin.profile'))){
030.return true;
031.}
032.
033.$userId = isset($data->id) ? $data->id : 0;
034.
035.// Load the profile data from the database.
036.$db = &JFactory::getDbo();
037.$db->setQuery(
038.'SELECT profile_key, profile_value FROM #__user_profiles' .
039.' WHERE user_id = '.(int) $userId .
040.' AND profile_key LIKE \'profile5.%\'' .
041.' ORDER BY ordering'
042.);
043.$results = $db->loadRowList();
044.
045.// Check for a database error.
046.if ($db->getErrorNum()) {
047.$this->_subject->setError($db->getErrorMsg());
048.return false;
049.}
050.
051.// Merge the profile data.
052.$data->profile5 = array();
053.foreach ($results as $v) {
054.$k = str_replace('profile5.', '', $v[0]);
055.$data->profile5[$k] = $v[1];
056.}
057.
058.return true;
059.}
060.
061./**
062.* @param    JForm    The form to be altered.
063.* @param    array    The associated data for the form.
064.* @return    boolean
065.* @since    1.6
066.*/
067.function onContentPrepareForm($form, $data)
068.{
069.// Load user_profile plugin language
070.$lang = JFactory::getLanguage();
071.$lang->load('plg_user_profile5', JPATH_ADMINISTRATOR);
072.
073.if (!($form instanceof JForm)) {
074.$this->_subject->setError('JERROR_NOT_A_FORM');
075.return false;
076.}
077.// Check we are manipulating a valid form.
078.if (!in_array($form->getName(), array('com_users.profile', 'com_users.registration','com_users.user','com_admin.profile'))) {
079.return true;
080.}
081.if ($form->getName()=='com_users.profile')
082.{
083.// Add the profile fields to the form.
084.JForm::addFormPath(dirname(__FILE__).'/profiles');
085.$form->loadFile('profile', false);
086.
087.// Toggle whether the something field is required.
088.if ($this->params->get('profile-require_something', 1) > 0) {
089.$form->setFieldAttribute('something', 'required', $this->params->get('profile-require_something') == 2, 'profile5');
090.} else {
091.$form->removeField('something', 'profile5');
092.}
093.}
094.
095.//In this example, we treat the frontend registration and the back end user create or edit as the same.
096.elseif ($form->getName()=='com_users.registration' || $form->getName()=='com_users.user' )
097.{       
098.// Add the registration fields to the form.
099.JForm::addFormPath(dirname(__FILE__).'/profiles');
100.$form->loadFile('profile', false);
101.
102.// Toggle whether the something field is required.
103.if ($this->params->get('register-require_something', 1) > 0) {
104.$form->setFieldAttribute('something', 'required', $this->params->get('register-require_something') == 2, 'profile5');
105.} else {
106.$form->removeField('something', 'profile5');
107.}
108.}           
109.}
110.
111.function onUserAfterSave($data, $isNew, $result, $error)
112.{
113.$userId    = JArrayHelper::getValue($data, 'id', 0, 'int');
114.
115.if ($userId && $result && isset($data['profile5']) && (count($data['profile5'])))
116.{
117.try
118.{
119.$db = &JFactory::getDbo();
120.$db->setQuery('DELETE FROM #__user_profiles WHERE user_id = '.$userId.' AND profile_key LIKE \'profile5.%\'');
121.if (!$db->query()) {
122.throw new Exception($db->getErrorMsg());
123.}
124.
125.$tuples = array();
126.$order    = 1;
127.foreach ($data['profile5'] as $k => $v) {
128.$tuples[] = '('.$userId.', '.$db->quote('profile5.'.$k).', '.$db->quote($v).', '.$order++.')';
129.}
130.
131.$db->setQuery('INSERT INTO #__user_profiles VALUES '.implode(', ', $tuples));
132.if (!$db->query()) {
133.throw new Exception($db->getErrorMsg());
134.}
135.}
136.catch (JException $e) {
137.$this->_subject->setError($e->getMessage());
138.return false;
139.}
140.}
141.
142.return true;
143.}
144.
145./**
146.* Remove all user profile information for the given user ID
147.*
148.* Method is called after user data is deleted from the database
149.*
150.* @param    array        $user        Holds the user data
151.* @param    boolean        $success    True if user was succesfully stored in the database
152.* @param    string        $msg        Message
153.*/
154.function onUserAfterDelete($user, $success, $msg)
155.{
156.if (!$success) {
157.return false;
158.}
159.
160.$userId    = JArrayHelper::getValue($user, 'id', 0, 'int');
161.
162.if ($userId)
163.{
164.try
165.{
166.$db = JFactory::getDbo();
167.$db->setQuery(
168.'DELETE FROM #__user_profiles WHERE user_id = '.$userId .
169." AND profile_key LIKE 'profile5.%'"
170.);
171.
172.if (!$db->query()) {
173.throw new Exception($db->getErrorMsg());
174.}
175.}
176.catch (JException $e)
177.{
178.$this->_subject->setError($e->getMessage());
179.return false;
180.}
181.}
182.
183.return true;
184.}
185.
186.
187.}

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

01.; Joomla! Project
02.; Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
04.; Note : All ini files need to be saved as UTF-8
05.PLG_USER_PROFILE5_XML_DESCRIPTION="Плагин профиля пользователей 5"
06.PLG_USER_PROFILE5="Пользователь - Профиль 5"
07.PLG_USER_PROFILE5_SLIDER_LABEL="Пользователь - профиль 5"
08.PLG_USER_PROFILE5_FIELD_NAME_REGISTER_REQUIRE_USER="User profile fields for registration and administrator user profile 5 forms"
09.PLG_USER_PROFILE5_FIELD_NAME_PROFILE_REQUIRE_USER="User profile fields for profile 5 edit form"
10.PLG_USER_PROFILE5_FIELD_SOMETHING_DESC="Choose an option for the something filed"
11.PLG_USER_PROFILE5_FIELD_SOMETHING_LABEL="Something!"
12.PLG_USER_PROFILE5_FIELD_SOMETHING_MESSAGE="A Message for something!"
13.PLG_USER_PROFILE5_XML_DESCRIPTION="User Profile 5 Plug-in"

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

1.; $Id: ru-RU.plg_user_profile.sys.ini 17052 2010-05-14 14:05:58Z infograf768 $
2.; Joomla! Project
3.; Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
5.; Note : All ini files need to be saved as UTF-8
6.PLG_USER_PROFILE5="Пользователь - профиль 5 "
7.PLG_USER_PROFILE5_XML_DESCRIPTION="Плагин профилей пользователей 5"

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

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

Источник:  joomlablog.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи