Разработка

Концепции WordPress для разработчиков Joomla: Сайдбары и виджеты

WordPress
Концепции WordPress для разработчиков Joomla: Сайдбары и вид...

Этот материал является переводом второй части серии материалов о концепциях WordPress для разработчиков Joomla автора Cory Webb - WordPress concepts for Joomla developers: Sidebars and Widgets.

В этом материале я рассмотрю сайдбары (sidebars) и виджеты (widgets). Если проводить аналогии с Joomla, то сайдбары и виджеты можно сравнить с позициями модулей и модулями. У них много общего, но также есть различия, которые могут заставить разработчика Joomla чесать затылок.

Сайдбары и позиции модулей

Сайдбары по сути являются контейнером для виджетов, также как позиции модулей являются контейнером для модулей. Сайдбар - это область в теме, где рендерятся виджеты с определённым набором правил макета. Позиция модуля - это область в шаблоне, где ренедерятся модули с определённым набором правил макета, которые называются хром модуля (module chrome).

Регистрация сайдбаров и регистрация позиций модуля

Чтобы выполнить рендеринг сайдбара, его сначала необходимо зарегистрировать. Это большое отличие от Joomla. Ведь, несмотря на то, что большинство шаблонов регистрируют позиции модулей в файле templateDetails.xml, технически это делать не обязательно.

Сайдбары регистрируются в файле functions.php темы, при помощи функции register_sidebar(). Ниже пример типичного вызова такой функции:

register_sidebar( array(
    'name' => __( 'Some Sidebar', 'theme-slug' ),
    'id' => 'some-sidebar',
    'description' => __( 'Widgets in this area will be shown on all posts and pages.', 'theme-slug' ),
    'before_widget' => '<div id="%1$s" class="widget %2$s">',
    'after_widget'  => '</div>',
    'before_title'  => '<h2 class="widgettitle">',
    'after_title'   => '</h2>',
) );

Функция принимает единственную переменную $args, которая является ассоциативным массивом аргументов с информацией о сайдбаре. Первый аргумент name – это имя сайдбара, которое отображается в списке сайдбаров. id – это уникальный идентификатор сайдбара. description – это описание сайдбара.

Остальные аргументы before_widget, after_widget, before_title и after_title являются WordPress эквивалентом module chrome. Они определяют HTML обёртку (wrapper) для каждого заголовка виджета. По моему мнению, это менее гибко, чем module chrome, но намного компактнее, и возможно проще для новичков.

Больше информации о функции register_sidebar() вы можете получить здесь.

Рендеринг сайдбаров и рендеринг позиций модуля

Сайдбары рендерятся через тэг шаблона, а позции модулей обычно рендерятся с помощью тэга jdoc разметки:

<jdoc:include type="modules" name="some-module-position" style="some-module-chrome-style" />

Тэг шаблона для рендеринга сайдбара – это dynamic_sidebar(). Функция принимает единственный параметр, ID сайдбара. Например, если мы хотим вывести сайдбар, зарегистрированный выше, то это выглядело бы вот так:

<?php if ( is_active_sidebar( 'some-sidebar' ) ) : ?>
    <div class="some-class">
        <?php dynamic_sidebar( 'some-sidebar' ); ?>
    </div>
<php endif; ?>

Обратите внимание на функцию is_active_sidebar('some-sidebar'). В Joomla для этого используется $this->countModules('some-module-position'). В WordPress функция вернёт true или false, в зависимости от того, есть ли в сайдбаре активные виджеты. В Joomla мы получим количество активных модулей в позиции. Эффект одинаков, так как обе используются для проверки, отображать или нет сайдбар или позицию модуля.

Виджеты и модули

Виджеты и модули практически идентичны по назначению и функциональности. Оба являются блоками HTML, которые должны быть отрендерены в определённых областях темы или шаблона. Оба могут использоваться для рендеринга меню, форм, кастомного HTML контента.

Виджеты могут быть отображены где угодно при помощи shortcodes, если у виджета есть соответствующий шорткод. Модули могут быть отображены с помощью тэга {loadmodule} плагина Load Modules, но ограничены только материалами и не работаю везде.

Виджеты обычно определяются в плагинах с помощью API виджетов, но они также могут быть определены в файле functions.php темы. Я не большой сторонник определения виджетов в теме, потому что это нарушает моё правило держать логику представления отдельно от логики данных. В Joomla модули всегда определяются как отдельные типы расширений. Каждый модуль является своего рода контейнером кода, который находится в папке /modules. Это различие делает разработку виджетов более гибкой, и как разработчик Joomla, вы должны быть готовы к тому, что в WordPress не существует жёсткой структуры, когда дело доходит до разработки виджета.

Публикация на конкретных страницах

Одним огромным отличием между Joomla и WordPress, которое, как правило, расстраивает разработчиков Joomla, это невозможность в WordPress публиковать виджеты на конкретных страницах. В Joomla вы можете указать, какие модули, и на каких страницах публиковать, а в WordPress, опубликованный виджет публикуется на всех страницах, которые рендерят сайдбар с этим виджетом. Если честно, я не уверен, почему это до сих пор не решили в ядре WordPress.

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

Итоги и что дальше?

Сайдбары и виджеты очень похожи на позиции модулей и модули, но пока вы не поймёте различия, вы можете быстро разочароваться. Есть плюсы и минусы обоих подходов, и я верю в то, что Joomla и WordPress могут научиться друг у друга, реализовав лучшее в этой области.

Пока что я рассмотрел темы, а также сайдбары и виджеты. Но я всего лишь поцарапал поверхность. В следующем материале я рассмотрю иерархию шаблона WordPress и сопоставлю её с переопределениями в шаблонах Joomla.

Dmitry Rekun
Работаю в банковской сфере, а с веб-разработкой (непосредственно с Joomla) столкнулся в 2007 году. Теперь это моё хобби и время от времени вторая работа. Какое-то время вёл свой блог, но решил попробовать работать в команде. И вот c 2012 года я здесь :)

Последние комментарии