Создание своего типа поля
рейтинг: 9.5/10, голосов: 2
Создание типа
Бывают ситуации, когда стандартные типы полей для формы не подходят. В Joomla можно создавать свои типы параметров в расширениях.
Основной код для создания типа будет, примерно, такой:
<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('Restricted access');
// Подключение требуемых файлов
jimport('joomla.form.formfield');
/**
* Создаем класс. Fieldname - имя типа
*/
class JFormFieldFieldname extends JFormField
{
/**
* @var $type Имя типа
*/
protected $type = 'Fieldname';
/**
* Метод, определяющий что будет выводить параметр
*
* @return Результат вывода типа
*/
protected function getInput()
{
$html = '';
// ...
// Какой-то код, в котором определяется что нужно выводить
// ...
return $html;
}
}
Получение атрибутов
Как видно из кода выше в данном случае используется родительский класс JFormField, для получения атрибутов достаточно взять родительский объект $element:
protected function getInput()
{
// Получение атрибута some-attr
$this->element['some-attr']);
// ...
Получение потомков
Если предполагается использовать сложный тип, состоящий из нескольких элементов, например:
<field name="some-name" type="fieldname">
<some-action value="1">One</some-action>
<some-action value="2">Two</some-action>
</field>
Общий код для получения потомков будет примерно такой:
protected function getInput()
{
foreach ($this->element->children() as $action) {
// Берем только нужные элементы, в данном случае some-action
if ($action->getName() != 'some-action') {
continue;
}
// Здесь будут значения value
$action['value'];
// Здесь будут значения содержащиеся между тегов some-action
$action;
//...
}
Расширение или изменение стандартных типов
Бывают ситуации, когда нужно дополнить или изменить стандартный тип, используемый в Joomla. Для этого не стоит заново переписывать нужный тип, можно просто его расширить. Допустим, нужно изменить стандартный тип list, это будет выглядеть так:
<?php
// Защита от прямого доступа к файлу
defined('_JEXEC') or die('(@)|(@)');
// Подключение требуемых файлов
jimport('joomla.form.formfield');
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');
/**
* Создаем класс. Fieldname - имя типа
*/
class JFormFieldFieldname extends JFormFieldList
{
/**
* @var $type Имя типа
*/
protected $type = 'Fieldname';
/**
* Метод, заменяющий родительский JFormFieldList::getOptions()
*
* @return $options;
*/
protected function getOptions()
{
// ...
// Какой-то код, в котором определяется что нужно выводить
// ...
return $options;
}
}
Подключение в Компоненте
Допустим, в модели компонента подключается форма:
-com_component
--models
----forms
-----some-form.xml
----some-model.php
И в форме (some-form.xml) нужно добавить свой тип для поля. Для этого достаточно создать файл /com_component/models/fields/fieldname.php, где fieldname — это имя нужного типа.
После того как данный файл будет создан, можно добавлять этот тип в форму (/com_component/models/forms/some-form.xml)
...
<field name="some_name" type="fieldname" />
...
Подключение в Модуле или Плагине
Если нужно добавить нужный тип поля в модуле или плагине, то для этого достаточно указать в XML файле директорию, в которой надо искать нужный тип.
Допустим, в модуле есть группа параметров:
...
<fieldset name="Some-Name">
...
<field name="name1" type="text" />
<field name="name2" type="fieldname" />
...
</fieldset>
...
Чтобы определить тип fieldname, нужно указать путь в fieldset, где искать данный тип. И Joomla автоматически найдет данный файл, если такой будет существовать.
...
<fieldset name="Some-Name" ad...
...
<fieldset name="Some-Name" addfieldpath="/administrator/components/com_component/models/fields">
...
<field name="name1" type="text" />
<field name="name2" type="fieldname" />
...
</fieldset>
...