Het aanmaken van een profiel plugin

From Joomla! Documentation

This page is a translated version of the page Creating a profile plugin and the translation is 100% complete.
Other languages:
English • ‎Nederlands • ‎español • ‎français • ‎中文(台灣)‎
Joomla! 
2.5
Joomla! 
3.x

De profiel plugin is een nieuwe extensie in Joomla! 2.5. Het voegt extra velden toe in de registratie- en profielformulieren van com_user in de front-end en bij de gebruiker creëren/bewerken in de back-end.

Een eenvoudig voorbeeld plugin met de naam Gebruiker - Profiel is in de basisinstallatie van Joomla! toegevoegd als een bewijs dat dit werkt. Meer complexe plugins zijn mogelijk.

De voorbeeld plugin maakt gebruik van de onContentPerpareForm en onUserAfterSave events.

Meerdere profielplugins kunnen worden opgenomen en zullen worden in volgorde worden weergegeven .

Er zijn vier afzonderlijke plaatsen waar de profielformulieren worden gebruikt in de core-extensies en elk van deze vier kan afzonderlijk worden gemanipuleerd indien dat gewenst is. De twee locaties in de front-end zijn het gebruikers-registratieformulier en de gebruikersprofiel bewerken-formulier. In de back-end zijn de locaties zijn het bewerkscherm voor gebruikers in de gebruikersmanager en de Mijn profielweergave in het menu Administratie.

Deze pagina toont een voorbeeld van een tweede plugin, genaamd profile5. Het voegt een enkele veld toe met de naam something.

Dit is het bestandsstructuur:

profile5.php
profile5.xml
en-GB.plg_user_profile5.ini
en-GB.plg_user_profile5.sys.ini
index.html
/profiles/profile.xml

De extra velden worden gecreëerd in het profile.xml bestand in de "profiles" folder. Let op dat de bestandsnaam profile.xml is en NIET profile5.xml, maar in het bestand zijn de velden en de 'fieldset' "profile5". Let ook op dat de eerste karakter "<" in de xml-tag moet zijn. Als de profile5.xml in een browser tab is ingevuld kun je zien dat de structuur van het bestand juist is opgebouwd.

<?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;

  /**
   * An example custom profile plugin.
   *
   * @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;

		// 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');
			}
		}			
	}

	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
	 */
	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 bepaalt of het veld vereist, gedepubliceerd of optioneel is in de formulieren. Omdat profile5.php zegt dat het creëren/bewerken in de backend het zelfde is als registreren er alleen maar twee opties nodig zijn, registreren en profiel. Let op: het eerste karakter van het bestand met "<" zijn. Plaats profile5.xml in een browsertab en het laat de structuur van het bestand correct zien.

 <?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!"

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"

Bij het installeren van profile5 can je nieuwe velden toevoegen naast die al in het profiel zitten. Je kan ook bepalen voor welke view levels deze velden zichtbaar zijn.