--=REKLAMA=--
Dodatek profil użytkownika jest pluginem dostępnym od Joomla! 2.5. Umożliwia on dodawanie własnych pól do profilu użytkownika podczas rejestracji oraz do formularza com_user, zarówno od strony frontowej jak i backendu.
Prosty plugin o nazwie User - Profile jest dołączony do podstawowej instalacji Joomla! w celu przedstawienia ogólnej koncepcji. Jednak możliwe jest tworzenie o wiele bardziej złożonych dodatków.
Przykładowy plugin wykorzystuje zdarzenia onContentPrepareForm oraz onUserAfterSave.
Wiele wtyczek tego typu, może być jednocześnie dostępnych. Będą wtedy wykonywane w kolejności zdefiniowanej w menadżerze wtyczek.
Istnieją cztery odseparowane od siebie miejsca, gdzie używany jest formularz profili i każde z nich może być modyfikowane niezależnie od siebie. Dwa z nich to formularz rejestracyjny oraz formularz edycji profilu użytkownika. Dwa pozostałe to formularz edycji użytkownika dostępny w zapleczu administracyjnym oraz widok "Mój profil", dostępny w menu administracyjnym.
Ten poradnik dotyczy modyfikacji drugiej z tych lokacji i będzie nosił nazwę profile5. Będzie on udostępniał dodatkowe pole o nazwie "something".
Oto struktura plików
profile5.php profile5.xml en-GB.plg_user_profile5.ini en-GB.plg_user_profile5.sys.ini index.html /profiles/profile.xml
Dodatkowe pola tworzone są w pliku profile.xml. Zauważ, że nazwa pliku to "profile.xml" a nie "profile5.xml". Niemniej wewnątrz pliku używamy nazwy profile5. Zapamiętaj też, że pierwszym znakiem jaki występuje w pliku jest "<", rozpoczynający tag XML. Otwierając ten plik w przeglądarce będziesz mógł sprawdzić czy jego treść jest poprawna. Wszelkie błędy po otwarciu w przeglądarce, zostaną wykryte i wyświetlone.
<?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 /** * @version * @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; /** * @package Joomla.Plugins * @subpackage user.profile * @version 1.6 */ class plgUserProfile5 extends JPlugin { /** * @param string The context for the data * @param int The user id * @param 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; // Wczytywanie profilu z bazy danych $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(); // Sprawdzanie błędów bazy if ($db->getErrorNum()) { $this->_subject->setError($db->getErrorMsg()); return false; } // Łączenie danych profilu $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 modyfikowany formularz * @param array dane z formularza * @return boolean * @since 1.6 */ function onContentPrepareForm($form, $data) { // Wczytywanie języka pluginu $lang = JFactory::getLanguage(); $lang->load('plg_user_profile5', JPATH_ADMINISTRATOR); if (!($form instanceof JForm)) { $this->_subject->setError('JERROR_NOT_A_FORM'); return false; } // Sprawdzanie czy modyfikujemy poprawny formularz 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') { // Dodawanie pola do formularza JForm::addFormPath(dirname(__FILE__).'/profiles'); $form->loadFile('profile', false); // Ustawiamy przełącznik definiujący czy pole jest wymagane 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'); } } //W tym przykładzie modyfikujemy formularz rejestracji użytkownika, oraz formularz edycji profilu użytkownika elseif ($form->getName()=='com_users.registration' || $form->getName()=='com_users.user' ) { // Dodawanie pola do formularza rejestracji JForm::addFormPath(dirname(__FILE__).'/profiles'); $form->loadFile('profile', false); // Dodawanie przełącznika definiującego czy pole jest wymagane 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'); } } } 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; } /** * Usuwanie wszystkich informacji o użytkowniku o podanym ID * * Metoda jest wywoływana w przypadku usuwania informacji o użytkowniku * * @param array $user tablica z danymi użytkownika * @param boolean $success True jeśli użytkownik został prawidłowo zapisany w bazie * @param string $msg Wiadomość */ 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; } }
W pliku profile5.xml możemy określić czy pole jest wymagane, wyłączone lub opcjonalne.
<?xml version="1.0" encoding="utf-8"?> <!-- $Id: --> <extension version="3.1" 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@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.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="en-GB">en-GB.plg_user_profile5.ini</language> <language tag="en-GB">en-GB.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-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> <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>
en-GB.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="User Profile 5 Plug-in" PLG_USER_PROFILE5="User - Profile 5" PLG_USER_PROFILE5_SLIDER_LABEL="User Profile 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"
en-GB.plg_user_profile5.sys.ini
; $Id: en-GB.plg_user_profile.sys.ini 17052 2010-05-14 14:05:58Z infograf768 $ ; 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="User - Profile 5 " PLG_USER_PROFILE5_XML_DESCRIPTION="User Profile 5 Plug-in"
Po instalacji profile5 możesz dodać nowe pole do formularza, jak i również określić, jaki jest wymagany poziom dostępu, by zobaczyć to pole.
» Robertm,