Конструктор контента Publicator

В качестве конструктора контента объектов можно использовать публикатор, позволяющий не только форматировать текст, загружать изображения, но и добавлять видео в свой контент, делать цитаты и заголовки.

Таблица для конструктора

Для работы с компонентом Publicator достаточно создать два поля типа TEXT в таблице объектов (например публикаций):

CREATE TABLE `bff_test_posts` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT, -- ID объекта (публикации)
  `content` longtext NOT NULL,                   -- контент публикации
  `content_search` longtext NOT NULL,            -- поле поиска по текстовой составляющей контента
  -- другие поля
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Настройки и инициализация компонента конструктора

Контент компонента Publicator по умолчанию мультиязычен, также можно задавать разрешенные типы контентных блоков и другие настройки компонента. Рассмотрим пример таких настроек:

/**
 * Настройки конструктора контента
 * @return array
 */
public function publicatorSettings()
{
    $aSettings = array(
        'title' => false,
        'langs' => $this->locale->getLanguages(),            # список используемых языков
        'images_path' => \bff::path('posts', 'images'),      # путь к папке с изображениями публикатора, вместо posts название модуля(дополнения) для работы с объектами
        'images_path_tmp' => \bff::path('tmp', 'images'),    # путь к папке с временным хранилищем изображений
        'images_url' => \bff::url('posts', 'images'),
        'images_url_tmp' => \bff::url('tmp', 'images'),
        # gallery params                                     # настройки галереи
        'gallery_sz_view' => array(
            'width' => 750,
            'height' => false,
            'vertical' => array('width' => false, 'height' => 640),
            'quality' => 95,
            'sharp' => array()
        ), 
        # video params                                       # настройки видео
        'video_width'  => 330,
        'video_height' => 240,
    );
    
    return $aSettings;
}

Обязательно необходимо создать папку для хранения изображений, а затем указать путь к ней. В настройках указываем путь bff::path(module_name, folder_title), где будут храниться изображения, и url для их получения bff::url(module_name, folder_title). Также задаем характеристики блоков, например ширину загружаемых изображений галереи и блока видео.

Инициализируем компонент Publicator $publicatorComponent задав настройки конструктора.

/**
 * Инициализируем компонент \bff\db\Publicator
 * @return \bff\db\Publicator компонент
 */
public function initPublicator()
{
    $aSettings = $this->publicatorSettings();
    # Подключаем конструктор контента
    $publicatorComponent = $this->attachComponent('publicator', new \bff\db\Publicator($this->module_name, $aSettings));
    return $publicatorComponent;
}

Использование объекта в админ-панели

Развернуто о порядке применения данного компонента в формах вы найдете в данной статье

Вывод контента конструктора

После добавления контента, есть необходимость его вывода. Рассмотрим пример вывода контента на страницу публикации.

В методе, отвечающим за отрисовку страницы публикации на фронтенде, подготавливаем данные конструктора из поля 'content' таблицы БД, сохраненные в админ панели. Выполняет подготовку данных метод view(data, record_id, template, template_dir) компонента Publicator, параметрами являются:

  • данные публикатора, сохраненные в поле content
  • ID объекта (публикации)
  • шаблон отрисовки
  • путь к директории шаблона
$publicatorComponent = $this->initPublicator();
$content = $publicatorComponent->view($item['content'], $item['id'], 'view.content', $this->module_dir_tpl);

Шаблон отрисовки контента публикатора может иметь следующий вид:

 <?php
 
 use \bff\db\Publicator;
 
 if( ! empty($aData['b']))
 {
     $galleryIndex = 0;
     foreach($aData['b'] as $v)
     {
         switch($v['type'])
         {
             case Publicator::blockTypeSubtitle: # блок "Подзаголовок" h2, h3 ...
             {
                 $size = 'h'.$v['size'];
                 ?><div class="block block-subtitle"><<?= $size ?>><?= $v['text'][LNG]; ?></<?= $size ?>></div><?
             } break;
             case Publicator::blockTypeText: # блок "Текст"
             {
                 ?><div class="block block-text"><?= $v['text'][LNG]; ?></div><?
             } break;
             case Publicator::blockTypePhoto: # блок "Фото"
             {
                 ?><div class="faq-help-img">
                     <img src="<?= $v['url'][Publicator::szView]; ?>" alt="<?= $v['alt'][LNG] ?>" />
                     <?= ( ! empty($v['text'][LNG]) ? '<div>'.$v['text'][LNG].'</div>' : ''); ?>
                   </div><?
             } break;
             case Publicator::blockTypeGallery: # блок "Фотогалерея"
             {
                 $galleryIndex++;
                 ?><div class="txt-gallery">
                     <div class="fotorama" id="imageGallery<?= $galleryIndex ?>" data-auto="false">
                     <? foreach($v['p'] as $gp) { ?>
                         <a href="<?= ($gp['url'][Publicator::szView]) ?>" data-thumb="<?= ($gp['url'][Publicator::szThumbnail]) ?>" data-caption="<?= $gp['alt'][LNG] ?>" alt="<?= $gp['alt'][LNG] ?>"></a>
                     <? } ?>
                     </div>
                   </div>
                   <script type="text/javascript">
                     <? js::start(); ?>
                     $(function(){
                         $('#imageGallery<?= $galleryIndex ?>').fotorama({
                           width: '100%', maxwidth: '100%', maxheight: 640,
                           allowfullscreen: false,
                           thumbmargin: 10,
                           thumbborderwidth: 1,
                           ratio: 750/640,
                           nav: 'thumbs', fit: 'contain',
                           keyboard: true,
                           loop: true, click: true, swipe: true
                         });
                     });
                     <? js::stop(); ?>
                   </script>
                 <?
             } break;
             case Publicator::blockTypeVideo: # блок "Видео"
             {
                 ?><div class="block block-video">
                     <object width="<?= $this->sett['video_width']; ?>" height="<?= $this->sett['video_height']; ?>">
                         <param name="allowfullscreen" value="true" />
                         <param name="allowscriptaccess" value="always" />
                         <param name="wmode" value="transparent" />
                         <param name="movie" value="<?= $v['video']; ?>" />
                         <embed src="<?= $v['video']; ?>" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" wmode="transparent" width="<?= $this->sett['video_width']; ?>" height="<?= $this->sett['video_height']; ?>"></embed>
                     </object>
                   </div><?
             } break;
         }
     }
 
     if( $galleryIndex > 0 ) {
         # javascript для блока "Фотогалерея"
         tpl::includeJS(array('fotorama/fotorama'), false);
         tpl::includeCSS('/js/fotorama/fotorama', false);
     }
 } 
?>