RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

Создание своего типа поля

Создание типа

Бывают ситуации, когда стандартные типы полей для формы не подходят. В 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>
...

Смотрите также:
Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.