В статье Стандартные типы XML полей в Joomla 2.5+ мы рассматривали список полей формы которые предоставляет нам наша система.
В этой статье мы рассмотрим случаи когда нам нужно создать свое уникальное поле!

 

Итак допустим нам нужно создать свое уникальное поля которое выполняет какую то задачу, для поля которого нет системе! Для этого нам нужно будет создать отделенный класс поля, и описать его поведение!

Файл с описание класса нашего нового поля мы можем хранить в любой папке, но если это компонент то удобно будет хранить поле в com_component/models/fields/, тогда файлы с полями будут подключаться автоматически.
Если же нам допустим надо использовать одно и тоже поле, но в разных компонентах, или из модуля или из плагина, то нем нужно будет указать в XML файле форму путь к этим полям с помощью атрибута addfieldpath="/components/com_component/models/fields"

Для примера мы создадим поле в котором можно будет генерировать случайный пароль.
Произвольное поле
Итак для начала создам класс с полем:

<?php

/**
 * Class JFormFieldTest класс поля
 */
class JFormFieldTest extends JFormField
{
	/**
	 * @var string Тип поля (Должен называться как файл с полем)
	 */
	protected $type = 'Test';

	/**
	 * Создание поля
	 * @return string
	 */
	protected function getInput()
	{
		//Скрипт для создания случайного пароля
		$script = ' function str_rand(id) {
			var result = "";
			var words = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
			var max_position = words.length - 1;
			for (var i = 0; i < 10; ++i) {
				var position = Math.floor(Math.random() * max_position);
				result = result + words.substring(position, position + 1);
			}
			document.getElementById(id).value = result;
   		 }';
		JFactory::getDocument()->addScriptDeclaration( $script );
		//Инициализация атрибутов поля
		//Класс поля
		$class = $this->element['class'] ? ' class="' . (string)$this->element['class'] . '"' : '';
		//Поле только для чтения
		$readonly = ( (string)$this->element['readonly'] == 'true' ) ? ' readonly="readonly"' : '';
		//Поле недоступно
		$disabled = ( (string)$this->element['disabled'] == 'true' ) ? ' disabled="disabled"' : '';
		//Событие при изменения данных в поле
		$onchange = $this->element['onchange'] ? ' onchange="' . (string)$this->element['onchange'] . '"' : '';
		//Возвращаем сформированное поле
		return '<div class="input-append"><input type="text" name="' . $this->name . '" id="' . $this->id . '"' . ' value="'
		. htmlspecialchars( $this->value, ENT_COMPAT, 'UTF-8' ) . '"' . $class . $disabled . $readonly . $onchange . '/>
		<input type="button" value="Генерировать пароль" class="btn" onclick="str_rand(\'' . $this->id . '\')" /></div>';
	}
}

Имя класса с полем должно быть JFormFieldTest, и унаследовать поле нужно от класса JFormField.
В переменной protected $type = 'Test'; должно быть имя нашего поля.

В методе getInput() происходит формирование нашего поля и установка для него атрибутов и поведения.
Все атрибуты XML формы доступны через $this->!
То есть если у нас поле:

<field name="password" type="test" label="Пароль"></field>

То есть например по $this->name получим имя поля!

Данное поле мы можем использовать в любом месте системы, как для форма, для меню, параметров компонентов модулей или плагинов!