Как сделать элемент для Zoo/JBZoo? — Пример

10.0/10 оценка (3 голосов)

Файл jbint.xml Назовем наш элемент — jbint, который будет принимать и выводить целые числа.

У него будет 3 шаблона:

  • edit.php — форма для редактирования.

  • default.php — обычный вывод целого числа.

  • thousand.php — вывод числа с разделением тысячных через пробел.

Элемент повторяемо-отправляемый. Он будет иметь настройку для выбора шаблона и настройку, которая будет использоваться для теста при ajax запросе.

При подаче материала элемент будет принимать целые числа.

Создайте папку jbint в директории:

media/zoo/elements/

или в

media/zoo/applications/jbuniversal/elements

В первом случае элемент будет доступен любым каталогам для Zoo. Во втором только для JBZoo.

Положите туда следующие 2 файла.

Файл jbint.xml

<?xml version="1.0" encoding="utf-8" ?>
<!--
 type  - Тип элемента. Он должен быть уникальным. 
 group - Группа элемента. Группа определяется позицией при создании новых элементов.
-->
<element type="jbint" group="JBZoo">
    <name>JBInt</name>
    <author>A. Oganov</author>
    <creationDate>2014 April</creationDate>
    <copyright>Copyright (C)</copyright>
    <authorEmail>email автора</authorEmail>
    <authorUrl>url автора</authorUrl>
    <version>1.0</version>
    <params>
 <!--  Параметры выводятся при создании элемента, конфиг элемента -->
              <param name="ajax" type="text" default="ajax" label="Default text" />
    </params>
    <params group="render">
	<!-- параметры выводятся в настройках шаблона вывода - full, teaser и т.д. -->
        <param name="template" type="zoolist" default="default" label="Chose template">
            <option name="JBZOO_ELEMENT_STANDART">default.php</option>
            <option name="JBZOO_ELEMENT_THOUSAND">thousand.php</option>
        </param>
        <param name="separated_by" type="zoolist" default="Space" label="Separated by"
               description="CHOOSE_SEPARATOR_REPEATED_ELEMENTS">
            <option name="Space"><![CDATA[separator=[ ]]]></option>
            <option name="Break"><![CDATA[separator=[<br />]]]></option>
            <option name="Span"><![CDATA[tag=[<span>%s</span>]]]></option>
            <option name="Paragraph"><![CDATA[tag=[<p>%s</p>]]]></option>
            <option name="Div"><![CDATA[tag=[<div>%s</div>]]]></option>
            <option name="List Item"><![CDATA[tag=[<li>%s</li>]]]></option>
            <option name="Unordered List"><![CDATA[tag=[<li>%s</li>] enclosing_tag=[<ul>%s</ul>]]]></option>
            <option name="Ordered List"><![CDATA[tag=[<li>%s</li>] enclosing_tag=[<ol>%s</ol>]]]></option>
            <option name="Warp Item"><![CDATA[tag=[<article class="item">%s</article>]]]></option>
        </param>
    </params>
</element>

Все типы параметров, которые мы можем использовать в элементе, находятся по адресу -

/administrator/components/helpers/fields/ или jbuniversal/joomla/elements/

Тут же можно создавать свои типы, но это уже другая история.

Файл jbint.php

// Запрещаем прямой доступ к файлу
defined('_JEXEC') or die('Restricted access');
// Регистрируем ElementRepeatable class
App::getInstance('zoo')->loader->register('ElementRepeatable', 'elements:repeatable/repeatable.php');
class ElementJBInt extends ElementRepeatable implements iRepeatSubmittable
{
    /**
     * Checks if the repeatables element's value is set.
     */
    public function _hasValue($params = array())
    {
        $value = $this->get('number');
        return !empty($value);
    }
    /**
     * Get elements search data.
     * @return null | int
     */
    public function _getSearchData()
    {
        return (int) $this->get('number');
    }
    /**
     * Renders the edit form field.
     * @return string HTML
     */
    public function _edit()
    {
        if ($layout = $this->getLayout('edit.php')) {
            return $this->renderLayout($layout);
        }
        return false;
    }
    /**
     * Render
     * @param array $params
     * @return null | string HTML
     */
    public function _render($params = array())
    {
        if ($layout = $this->getLayout($params->get('template', 'default.php'))){
            return $this->renderLayout($layout);
        }
        return false;
    }
    /**
     * Renders the element in submission.
     * @param array $params submission parameters
     * @return null | string HTML
     */
    public function _renderSubmission($params = array())
    {
        return $this->_edit($params);
    }
    /**
     * Validates the submitted element
     * @param AppData $value  value
     * @param AppData $params submission parameters
     * @return array
     * @throws AppValidatorException
     */
    public function _validateSubmission($value, $params)
    {
        $value = $this->app->validator->create('integer',
            array(
                'required' => $params->get('required')
            )
        )->clean($value->get('number'));
        return array('number' => $value);
    }

Шаблонизация

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

Шаблоны должны лежать в папке tmpl. Негласное соглашение об именовании гласит — если элемент повторяемый, к названию шаблона надо добавлять нижнее подчеркивание. Это упростит разработку больших и сложных элементов.

Суть разделения логики и представления состоит в том, что эти компоненты могут модифицироваться независимо друг от друга.

Разберем небольшой пример.

 // Проверяем существует ли файл
if ($layout = $this->getLayout('_default.php')) {
    // Буферизация и подключение файла _default.php
    return $this->renderLayout($layout, array(
                  ‘one’ => ‘var1’,
                  ‘two’ => ‘var2’
    ));
}

Теперь в файле _default.php мы можем проводить манипуляции с нашими переменными $one и $two.

Так же мы можем вызывать методы элемента в шаблоне — $this остается объектом класса элемента.

Для любопытных, в классе Element можно посмотреть реализации всех методов —

/media/zoo/elements/element/element.php

API, Создание элемента

У меня остались вопросы, где я могу их задать?

Вы можете обратиться на наш специальный форум техподдержки JBZoo. Если у вас нет активного аккаунта со знаком «плюс» в тарифном плане, то вы можете задать свой вопрос в одном из этих разделов или на любой из наших контактов. Форум специально предназначен для JBZoo, приоритет и скорость ответа там выше.