before

Ранее были внесены изменения в файлы.

копируем из

components/com_users/views/registration/tmpl/        в
templates/protostar/html/com_users/registration/      файлы

default.php и default.xml и меняем им названия, к примеру на approval.php и approval.xml

approval.php

<h1><?php echo JText::_('MY_NEW_REGISTRATION'); ?></h1>
// здесь большое количество кода
// ..... 
<div class="form-actions">
			<fieldset>
				<legend><?php echo JText::_('TERMS_OF_SERVICE'); ?></legend>
				<p><input type="checkbox" /> <?php echo JText::_('AGREE'); ?></p>
				<?php if ($this->params->get('show_age_checkbox')):?>
				<p><input type="checkbox" /> <?php echo JText::_('AGE'); ?></p>
				<?php endif; ?>
			</fieldset>
			<button type="submit" class="btn btn-primary validate"><?php echo JText::_('JREGISTER');?></button>
			<a class="btn" href="/<?php echo JRoute::_('');?>" title="<?php echo JText::_('JCANCEL');?>"><?php echo JText::_('JCANCEL');?></a>
			<input type="hidden" name="option" value="com_users" />
			<input type="hidden" name="task" value="registration.register" />
			<?php echo JHtml::_('form.token');?>
		</div>

 approval.xml

<?xml version="1.0" encoding="utf-8"?>
<metadata>
	<layout title="MY_NEW_REGISTRATION_TITLE" option="COM_USER_REGISTRATION_VIEW_DEFAULT_OPTION">
		<help
			key="JHELP_MENUS_MENU_ITEM_USER_REGISTRATION"
		/>
		<message>
			<![CDATA[COM_USER_REGISTRATION_VIEW_DEFAULT_DESC]]>
		</message>
	</layout>
	<!--Добавляем поля в объект параметров для компоновки-->
	<fields name="params">
	<!--Основные параметры-->
		<fieldset name="basic" label="COM_MENUS_BASIC_FIELDSET_LABEL">
			<field
				name="show_age_checkbox"
				type="radio"
				label="SHOW_AGE_CHECKBOX"
				description="SHOW_AGE_CHECKBOX_DESCRIPTION"
				default="0">
				<option value="0">AGE_CHECKBOX_DESCRIPTION_HIDE</option>
				<option value="1">AGE_CHECKBOX_DESCRIPTION_SHOW</option>
			</field>	
		</fieldset>
	</fields>
</metadata>

 Добавлены языковые замещения

фронт

language/overrides/en-GB.override.ini

MY_NEW_REGISTRATION="Registration form with additional fields"
TERMS_OF_SERVICE="Terms of service"
AGREE="I agree to the terms of use"
AGE="I am at least 18 years old"

language/overrides/ru-RU.override.ini

MY_NEW_REGISTRATION="Регистрационная форма с дополнительными параметрами"
TERMS_OF_SERVICE="Условия обслуживания"
AGREE="Я согласен с условиями обслуживания"
AGE="Мне уже есть 18 лет"

бэкенд

administrator/language/overrides/en-GB.override.ini

MY_NEW_REGISTRATION_TITLE="Registration form with additional fields"
SHOW_AGE_CHECKBOX="Show Age Checkbox"
SHOW_AGE_CHECKBOX_DESCRIPTION="Show or hide the age checkbox"
AGE_CHECKBOX_DESCRIPTION_HIDE="Hide"
AGE_CHECKBOX_DESCRIPTION_SHOW="Show"

administrator/language/overrides/ru-RU.override.ini

MY_NEW_REGISTRATION_TITLE="Регистрационная форма с дополнительными параметрами"
SHOW_AGE_CHECKBOX="Показывать подтверждение <br/>возраста при регистрации"
SHOW_AGE_CHECKBOX_DESCRIPTION="Показывать / скрывать подтверждение возраста при регистрации"
AGE_CHECKBOX_DESCRIPTION_HIDE="Скрыть"
AGE_CHECKBOX_DESCRIPTION_SHOW="Показать"

 Для отправки в суперглобальный массив переменных $_REQUEST методом POST значений полей формы необходимо, чтобы у каждого поля был уникальный атрибут name. Дополним поля флажков данным атрибутом в файле approval.php

<fieldset>
	<legend><?php echo JText::_('TERMS_OF_SERVICE'); ?></legend>
	<p><input type="checkbox" name="tos_agree" /> <?php echo JText::_('AGREE'); ?></p>
	<?php if ($this->params->get('show_age_checkbox')):?>
	<p><input type="checkbox" name="old_enough" /> <?php echo JText::_('AGE'); ?></p>
	<?php endif; ?>
</fieldset>

 

code

Теперь перейдем собственно к созданию самого плагина.

Назовем его myregistration. Создадим для него папку plugins/user/myregistration, в ней файлы myregistration.php и myregistration.xml. Не забываем про заглушку index.html

myregistration.xml

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.0" type="plugin" group="user">
	<name>plg_user_myregistration</name>
	<author>Mark Dexter and Louis Landry feat Taatshi</author>
	<creationDate>March 2012</creationDate>
	<copyright>(C) 2012 Mark Dexter and Louis Landry</copyright>
	<license>GNU General Public License version 2 or later; See License.txt</license>
	<authorEmail>admin//dog//joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>2.5.0</version>
	<description>PLG_USER_MYREGISTRATION_XML_DESCRIPTION</description>	
	<files>
		<filename plugin="myregistration">myregistration.php</filename>
		<filename>index.html</filename>
		<folder>language</folder>	
	</files>
	<config>
	</config>
</extension>

 myregistration.php

<?php 

defined('JPATH_BASE') or die;
/* для joomla 1.5 был необходим импорт родительского класса для подключаемого плагина
* jimport('joomla.plugin.plugin');
*/
/*Это специальный класс подключаемого плагина регистрации для проверки установки флажков подтверждения согласия с правилами сервиса и достижения возрастного порога в 18 лет.
*/
class plgUserMyRegistration extends JPlugin
{
/*Метод для обработки события OnUserBeforeSave и определения достоверности введенных данных - проверяется, сохраняются ли введенные рег данные нового пользователя и установлены ли флажки подтверждения.
* В нем используются
* @param array $previousData - сохраняемые в настоящий момент рег данные пользователя
* @param boolean $isNew - Истинно, если данные сохраняются
* @param array $futureData - Вновь сохраняемые рег данные
* @return boolean - Истинно, если требуется продолжить сохранение, ложно - если нужно прекратить процесс
* @since 1.0
*/
function onUserBeforeSave($previousData, $isNew, $futureData)
	{
	// Если рег данные не сохраняются - то есть пользователь не новый
	// или это не пользовательская часть сайта
	// проводим сохранение без прерывания процесса
	if (!$isNew || !JFactory::getApplication()->isSite()){
	return true;
	}
	// загружаем файл языковой поддержки
	$this->loadLanguauge();
	$result = true;
	
	// проверить, установлен ли флажок согласия с условиями обслуживания
	if (!JRequest::getBool('tos_agree')){
		JError::raiseWarning(1000,
			JText::_('PLG_USER_MYREGISTRATION_TOS_AGREE_REQUIRED'));
			$result = false;
	}
	
	// проверить установку флажка на подтверждение достижения 18 лет
	if (!JRequest::getBool('old_enough')) {
		JError::raiseWarning(1000,
			JText::_('PLG_USER_MYREGISTRATION_OLD_ENOUGH_REQUIRED'));
			$result = false;
	}
	return $result;
	}
}

Имя класса указываем в соответствии с принятыми обозначениями

plgUserMyRegistration

plg (подключаемый плагин), User (пользовательский тип подключаемого плагина), MyRegistration (название плагина). Этот класс расширяет класс JPlugin.

У данного класса имеется один метод, обозначаемый по имени обрабатываемого события - onUserBeforeSave(). Данное событие инициируется при попытке сохранить данные нового пользователя в админке или зарегистрировать его в пользовательской части.

JRequest::getBool() вызывается для получения элемента ввода tos_agree или old_enough из суперглобальной переменной $_REQUEST языка PHP. Возвращает false или true.

JError::raiseWarning() - вывод ошибки. В качестве аргументов указываются: код ошибки и текст ошибки. В данном случае код не используется и может быть любым, а текст выводим из файла языковой поддержки плагина.

lang files

Файлы языковой поддержки

Предпочтительно создавать их в папке с плагином.Русскоязычные должны быть в кодировке UTF-8 без BOM - иначе система их не подхватит.

Первые предназначены для всех переменных, которые используются на фронте и для вывода настроек самого плагина
plugins\user\myregistration\language\en-Gb\en-Gb.plg_user_myregistration.ini
plugins\user\myregistration\language\ru-RU\ru-RU.plg_user_myregistration.ini

Вторые используются для вывода названия плагина в менеджере плагинов и вывода сообщения после установки расширения
plugins\user\myregistration\language\en-Gb\en-Gb.plg_user_myregistration.sys.ini
plugins\user\myregistration\language\ru-RU\ru-RU.plg_user_myregistration.sys.ini

Содержание файлов для данного плагина

en-Gb.plg_user_myregistration.ini

PLG_USER_MYREGISTRATION_TOS_AGREE_REQUIRED="You must agree to the terms of service"
PLG_USER_MYREGISTRATION_OLD_ENOUGH_REQUIRED="You must be at least 18 years old"

en-Gb.plg_user_myregistration.sys.ini

PLG_USER_MYREGISTRATION="User - My Registration"
PLG_USER_MYREGISTRATION_XML_DESCRIPTION="Check that the Terms and Age boxes have been checked"

ru-RU.plg_user_myregistration.ini

PLG_USER_MYREGISTRATION_TOS_AGREE_REQUIRED="Вы должны согласиться с условиями обслуживания"
PLG_USER_MYREGISTRATION_OLD_ENOUGH_REQUIRED="Вам должно быть не менее 18 лет"

ru-RU.plg_user_myregistration.sys.ini

PLG_USER_MYREGISTRATION="Юзер - Моя регистрация"
PLG_USER_MYREGISTRATION_XML_DESCRIPTION="Проверка на согласие с условиями обслуживания и достижения пользователем возраста 18 лет"

 

stand-alone

Полностью автономная версия плагина.

Установочный архив

Используется класс JForm для замещения регистрационной формы перед выводом на форму с допполями и проверки достоверности, что избавляет от необходимости иметь альтернативные пункт меню и шаблон вывода модуля.

Имя нового плагина myregistrationall. Состоит:

forms/form.xml
language/en-Gb/en-Gb.plg_user_myregistrationall.ini
language/en-Gb/en-Gb.plg_user_myregistrationall.sys.ini
language/ru-RU/ru-RU.plg_user_myregistrationall.ini
language/ru-RU/ru-RU.plg_user_myregistrationall.sys.ini
myregistrationall.php
myregistrationall.xml

Основной myregistrationall.xml файл плагина. В разделе конфигурации установлены поля для отображения в настройках плагина

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.0" type="plugin" group="user" methid="upgrade">
	<name>plg_user_myregistrationall</name>
	<author>Mark Dexter and Louis Landry feat Taatshi</author>
	<creationDate>March 2012</creationDate>
	<copyright>(C) 2012 Mark Dexter and Louis Landry</copyright>
	<license>GNU General Public License version 2 or later; See License.txt</license>
	<authorEmail>admin//dog//joomla.org</authorEmail>
	<authorUrl>www.joomla.org</authorUrl>
	<version>2.5.0</version>
	<description>PLG_USER_MYREGISTRATIONALL_XML_DESCRIPTION</description>	
	<files>
		<filename plugin="myregistrationall">myregistrationall.php</filename>
		<filename>index.html</filename>
		<folder>language</folder>
		<folder>forms</folder>
	</files>
	<config>
		<fields name="params">
			<fieldset name="basic">
				<field name="show_age_checkbox" 
				type="radio"
				label="PLG_USER_MYREGISTRATIONALL_SHOW_AGE"
				description="PLG_USER_MYREGISTRATIONALL_SHOW_AGE_DESC"
				default="0"
				>
				<option value="0">JHIDE</option>
				<option value="1">JSHOW</option>				
				</field>
			</fieldset>		
		</fields>
	</config>
</extension>

form.xml

<?xml version="1.0" encoding="utf-8"?>
<form>
	<fieldset name="tos" label="PLG_USER_MYREGISTRATIONALL_TERMS_OF_SERVICE">
		<field name="tos_agree" 
			type="checkbox"
			default="0"
			filter="bool"
			label="PLG_USER_MYREGISTRATIONALL_AGREE"
			required="true"
			value="1"
		/>
		<field name="old_enough"
			type="checkbox"
			default="0"
			filter="bool"
			label="PLG_USER_MYREGISTRATIONALL_AGE"
			required="true"
			value="1"
		/>	
	</fieldset>
</form>

myregistrationall.php

<?php
defined('JPATH_BASE') or die;
/*
*@package     Joomla.Plugins
*@subpackage  User.Myregistrationall
*@since       1.0
*/
class plgUserMyRegistrationall extends JPlugin
{
/* Обработка события onContentPrepareForm и внесение изменений в форму регистрации пользователя.
* Проверяем, является ли форма регистрационной, и, если да, xml загружается в объект формы для добавления в нее соответствующих полей.
*@param    JForm $form    Изменяемая форма
*@param    array $data    Данные, связанные с формой
*@return   boolean
*@since    1.0
*/
public function onContentPrepareForm($form, $data)
	{
	// Если это не регистрационная форма - проигнорировать
	if ($form->getName()!='com_users.registration') {
	return;
		}
	// Загрузить файл языковой поддержки
	$this->loadLanguage();	
	// Загрузить xml-файл в форму регистрации пользователя - обратить внимаение - вокруг FILE идет ДВОЙНОЕ ПОДЧЕРКИВАНИЕ
	$form->loadFile(dirname(__FILE__).'/forms/form.xml');
	// Проверка установки параметра показа чекбокса для проверки возраста в настройках плагина
		if (!$this->params->get('show_age_checkbox', '1')) {
		$form->removeField('old_enough');
		// Если мы захотим сделать поле подтверждения возраста необязательным, достаточно будет добавть строку:
		// $form->setFieldAttribute('old_enough', 'requried', 'false');
		}
	}
}

en-Gb.plg_user_myregistrationall.ini

PLG_USER_MYREGISTRATIONALL_TERMS_OF_SERVICE="Added Fields for Terms of Service Agreement"
PLG_USER_MYREGISTRATIONALL_AGREE="I agree to the terms"
PLG_USER_MYREGISTRATIONALL_AGE="I am at least 18 years old"
PLG_USER_MYREGISTRATIONALL_SHOW_AGE="Show Age Checkbox"
PLG_USER_MYREGISTRATIONALL_SHOW_AGE_DESC="Whether to Hide or Show the Show Age Check box. If it is shown, it will be required."

ru-RU.plg_user_myregistrationall.ini

PLG_USER_MYREGISTRATIONALL_TERMS_OF_SERVICE="Согласие с правилами обслуживания"
PLG_USER_MYREGISTRATIONALL_AGREE="Я согласен с условиями обслуживания"
PLG_USER_MYREGISTRATIONALL_AGE="Мне уже есть 18 лет"
PLG_USER_MYREGISTRATIONALL_SHOW_AGE="Подтверждение возраста"
PLG_USER_MYREGISTRATIONALL_SHOW_AGE_DESC="Показывать или скрывать чекбокс для подтверждения возраста"

en-Gb.plg_user_myregistrationall.sys.ini

PLG_USER_MYREGISTRATIONALL="User - My Registration - stand-alone"
PLG_USER_MYREGISTRATIONALL_XML_DESCRIPTION="Check that the Terms and Age boxes have been checked - stand-alone"

ru-RU.plg_user_myregistrationall.sys.ini

PLG_USER_MYREGISTRATIONALL="Юзер - Моя регистрация - автономка"
PLG_USER_MYREGISTRATIONALL_XML_DESCRIPTION="Проверка на согласие с условиями обслуживания и достижения пользователем возраста 18 лет - автономка"