--=REKLAMA=--

Tworzenie dodatku Profil użytkownika

Z Joomla!WikiPL

Wersja Robertm (dyskusja | edycje) z dnia 10:59, 21 kwi 2014

(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

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.

Dziękujemy za wkład

» Robertm,