Как создать layout плагин для модуля Panels

Сегодня я покажу как создать layout плагин для модуля Panels. Layouts плагины принято подключать через тему оформления, но можно и через модуль.

Подключение layout плагина через тему оформления

Примерная структура каталогов будет следующей:

themeName
  panels
    layouts
      first_layout
        first_layout.css
        first_layout.inc
        first_layout.png
        layout-sample-first-layout.tpl.php

Первым делом открываем themeName.info и добавляем туда следующую строку:

plugins[panels][layouts] = panels/layouts

Этой строкой мы указали путь к каталогу, в котором будут находится наши плагины (не забываем почистить кэш после добавления данной строки). Теперь нам необходимо в корне темы создать каталог panels, а внутри него каталог layouts. Все наши layouts плагины будут находится в этом каталоге.

Переходим непосредственно к созданию первого плагина. Идем в каталог layouts и создаем каталог "first_layout". Далее заходим в этот каталог и создаем в нем файл first_layout.inc. Содержимого этого файла:

<?php

$plugin = array(
  'title' => t('First Layout'), // Название плагина.
  'icon' => 'first_layout.png', // Графическое представление плагина. Используется для демонстрации регионов при выборе макета.
  'theme' => 'layout_sample_first_layout', // Шаблон плагина. При создании шаблона все подчеркивания необходимо заменить на тирэ.
  'css' => 'first_layout.css', // CSS файл, содержащий стили для нашего плагина при отображении и редактировании панели.
  'admin css' => 'first_layout_admin.css', // Этот CSS файл особенно полезен. Он подключается только в административных разделах сайта, что позволяет избежать некоторых проблем с отображением панели.
  'regions' => array(
    'main' => t('Main region'), // Объявление "main" региона. 
    'right' => t('Right region'), // Оъявление "right" региона.
  ),
);

Теперь необходимо создать шаблон layout-sample-first-layout.tpl.php. Он очень похож на любой другой файл шаблона. Его содержимое:

<div class="panel-display clearfix" <?php if (!empty($css_id)) { print "id=\"$css_id\""; } ?>>
  <div id="content"><div class="section clearfix">
    <?php print $content['main']; ?>
  </div></div>

  <div id="right"><div class="section clearfix">
    <?php print $content['right']; ?>
  </div></div>
</div>

Затем необходимо создать first_layout.css. Этот файл ничем не отличается от других css файлов. Его содержимое:

#content {
  width: 100%;
  float: left;
  margin: 0 -100% 0 0;
}
#content > .section {
  margin: 0 280px 0 0;
}
#right {
  width: 280px;
  float: right;
}

Далее рисуем графическое представление плагина. Называем его first_layout.png.
Все, наш плагин готов к использованию.

Подключение layout плагина через модуль

Примерная структура каталогов будет следующей:

layout_sample
  layout_sample.info
  layout_sample.module
  plugins
    layouts
      first_layout
        first_layout.css
        first_layout.inc
        first_layout.png
        layout-sample-first-layout.tpl.php

Создаем в каталоге sites/all/modules каталог layout_sample. Внутри него создаем файл layout_sample.info. Содержимое этого файла:

name = Layout Sample
description = Layout plugin example.
core = 7.x
package = "Panels"

dependencies[] = panels

Затем создаем файл layout_sample.module. Его содержимое:

<?php

/**
 * Implements hook_ctools_plugin_directory().
 */
function layout_sample_ctools_plugin_directory($module, $plugin) {
  if ($module == 'panels' && $plugin == 'layouts') {
    return 'plugins/layouts';
  }
}

Дальнейший процесс аналогичен подключению плагина через тему.

Комментарии (2)

Аватар пользователя Дмитрий
Дмитрий

Господа у вас опечатка/ошибка если вы делаете через модуль, вы возвращаете путь plugins/layouts а если через темы то panels/layouts, собственно если вы делаете через модуль то укажите в теме такой же путь как и в модуле иначе работать не будет.

Аватар пользователя Benya
Benya

Проверять надо, прежде чем писать о надуманных ошибках/опечатках. Модуль к теме не имеет никакого отношения и если сделать по примеру - все будет работать нормально. Соответственно, если у вас не работает - ищите ошибку у себя