Joomla: если нужна кнопка в настройках модуля

Современные CMS в большинстве случаев созданы, чтобы облегчить жизнь разработчиков, упростить и без того сложный процесс создания сайта. Они содержат стандартные инструменты для решения типовых задач разработки сайтов. Но очень часто стандартных возможностей CMS не хватает, чтобы реализовать поставленные задачи и нам приходится придумывать собственные инструменты.

Сегодня я хочу поделиться своим скромным опытом в области расширения набора стандарных возможностей CMS Joomla, но сначала немного отойду от темы и расскажу о том, что меня побудило написать эту статью. Итак, любой кто работал с этой CMS, знает, что в Joomla можно расширить набор стандартных возможностей, установив дополнителные плагины, модули или компоненты. Этим успешно пользуются многие разработчики, создавая свои плагины модули и компоненты. Большинство таких дополнений имеют свои собственные настройки, которые хранятся в xml файле и могут быть изменены в админке сайта. Каждый xml файл содержит ряд настроек сайта и, в частности, стандартные типы полей для настройки модуля или компонента. Среди этих типов и текстовые поля и списки и еще много чего, но вот стандартного типа поля для создания кнопки по умолчанию нет. Всвязи с этим на многих тематических форумах периодически кто-нибудь задает вопрос "А как создать кнопку в настройках модуля Joomla?" и далеко не всегда получает ответ на этот вопрос. Ну, а раз это кому-нибудь нужно, то постараюсь ответить на этот вопрос и привести простой пример.

А как все же создать кнопку в настройках модуля Joomla? Если отвечать коротко, то для того, чтобы быстро и без проблем создавать кнопки нужно просто добавить к стандартным типам полей свой собственный тип. Я решил не мудрить с названием и назвал его просто - Button. Опишу подробнее процесс создания такого типа для CMS Joomla 3.x.
В папке "libraries\joomla\form\fields" лежат файлы, ответственные за создание стандартных типов полей в xml файле. Названия файлов соответствуют названиям полей, поэтому перейдем вданную папку и создадим там еще один файл button.php. Добавим в файл button.php следующий код:

defined('JPATH_PLATFORM') or die; //выставляем запрет на прямое чтение файла
jimport('joomla.form.formfield'); //подключаем необходимые файлы
//Далее создаем собственный класс JFormFieldButton
class JFormFieldButton extends JFormField
{

    protected $type = 'Button'; //указываем тип - Button
    // далее напишем очень простую функцию для вывода нашей кнопки
    protected function getInput()
    {
        $mybutton = '<input name="mybutton" type="button" value="Создать">';
        return $mybutton;
    }
}

Думаю содержимое функции getInput() комментировать нет смысла все и так понятно.
Сохраняем и закрываем файл button.php. Теперь при создании нашего модуля нам просто нужно будет добавить в xml файл следующую строку:

<field type="button" />

.. и в настройках модуля мы увидим кнопку Создать.

Отлично, теперь у нас в настройках модуля есть кнопка, но она, пока что бесполезна. Попробуем сделать ее немного более функциональной. Для этого снова откройте файл button.php и измените строку:

    $mybutton = '<input name="mybutton" type="button" value="Создать">';

на:

    $mybutton = '<input name="mybutton" type="button" class="btn" value="Создать" onClick="myFunction();">';

Мы добавили класс btn - стандартный класс для кнопок Joomla и событие onClick. Теперь наша кнопка выглядит более привлекательно, и, что более важно, теперь по клику на ней мы можем вызвать функцию, а это уже хорошо.

Попробуем еще немного изменить нашу кнопку. Немного доработаем функцию getInput(). Нам нужно изменить код функции таким образом, чтобы мы могли создавать кнопку с любым именем, классом, значением и указывать произвольную функцию. Наша функция должна брать все эти параметры из файла xml. Этого можно добиться командой $this->element['АТРИБУТ']; где атрибут - это один из атрибутов поля field:

protected function getInput()
    {
        $name = $this->element['name']; //получаем имя кнопки
        $value = $this->element['value']; // получаем value
        $myclass = $this->element['class']; //получаем класс кнопки
        $click = $this->element['onclick']; //получаем функцию для события onClick
        $mybutton = '<input name="'.$name.'" type="button" value="'.JText::_($value).'" class=".$myclass." onClick="'.$click.'();">';
        return $mybutton;
    }

Теперь в xml файле можно изменить поле <field type="button" /> на <field name="mybutton" type="button" value="MOD_MYBUTTON_VALUE" class="myclass" onclick="myFunction" label="MOD_MYBUTTON_LABEL" description="MOD_MYBUTTON_DESC"  />


Ну вот и готова наша кнопка.


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