crear un plugin de perfil

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 • ‎español • ‎français • ‎Nederlands
Joomla! 
2.5
Joomla! 
3.x

Plugin de perfil es una nueva extensión de Joomla! 2.5. Permite la adición de campos extras en los formularios de registro y perfil en el lado cliente del com_user parte y en el lado servidor en el formulario crear/editar usuarios.

Un ejemplo sencillo de un plugin con el nombre User - Profile está incluido en la instalación básica de Joomla! como una prueba de concepto. Son posibles plugins muchos más complejos.

El plugin de ejemplo toma provecho de los eventos onContentPrepareForm y onUserAfterSave.

Plugins de múltiples perfiles pueden ser incluidos y serán reproducidos en secuencia.

Hay cuatro lugares donde se usan los formularios de perfiles en las principales extensiones, y cada uno de estos cuatro pueden ser manipulados por separado si se desea. Los dos lugares en el lado cliente son, el formulario de registro de usuario y el formulario de edición del perfil de usuario. En el lado servidor son, la pantalla de edición de los usuarios en el administrador de usuarios y la vista Mi Perfil que se encuentra en el menú de Administración.

Esta página muestra un ejemplo de un segundo plugin, llamado profile5. Se agrega un campo que se llama something.

Esta es la estructura de archivos:

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

El campo adicional se crea dentro del archivo profile.xml en la carpeta "profiles". Ten en cuenta que el nombre del archivo es profile.xml NO profile5.xmlpero dentro del archivo los nombres del campo y fieldset SON "profile5". Ten en cuenta también que el primer carácter del archivo debe ser "<" a partir de la etiqueta xml. Sólo tienes que arrastrar elprofile5.xml a una pestaña del navegador y si muestra la estructura del archivo tiene el formato correcto.

<?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 controla si el campo es requerido, deshabilitado u opcional en los formularios. Desde que profile5.php se usa para tratar crear/editar el mismo registro del lado servidor sólo dos conjuntos de opciones son necesarias, registro y perfil. Nota: el primer carácter del archivo debe ser "<". Sólo tienes que arrastrar elprofile5.xml a una pestaña del navegador y si muestra la estructura del archivo tiene el formato correcto.

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

Mediante la instalación de profile5 puedes agregar nuevos campos, además de los de perfil. También puedes controlar el nivel de la vista en que los campos se pueden ver. Alternativamente, puedes escribir un plugin más complejo, con diferentes controles, que sea común a los diferentes grupos.