Skip to content
butschster edited this page Jun 24, 2015 · 4 revisions

Виджеты

Модуль виджеты используется для вывода данных из разделов Админ панели в шаблон страниц сайта.

Шаблон страницы в KodiCMS представляет собой HTML каркас в котором размечены блоки для вставки данных.

Пример шаблона

<!DOCTYPE html>
<html lang="en">
<head>
	{!! Meta::build() !!}

	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css">
	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
</head>
<body>
	<div class="container">
		<div class="header clearfix">
			@block('header')
		</div>

		@block('content.before')

		<div class="row marketing">
			@block('content', ['comments' => false])
		</div>

		@block('content.after')

		<footer class="footer">
			@block('footer')
		</footer>
	</div>
</body>
</html>

@block... будет интерпретироваться системой как место, куда можно поместить виджеты, которые могут представлять из себя как HTML так и php код.

Блоки можно размечать двумя способами:

  1. <?php Block::run('block_name', array $params)
  2. @block('block_name', array $params) используется для Blade шаблонизатора

array $params - параметры, которые можно передать в шаблон виджета, они могут влиять на вывод данных из шаблона (Например: выключение кеширования виджетов в блоке или отключение комментариев обрамляющих HTML код).

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

Виджеты в системе разделяются на типы и каждый тип соотносится с классом через конфиг файл modulename/config/widgets.php (Пример), что позволяет делать разные типы виджетов выполняющие различные логические операции и следовательно выводить в шаблон страницы информацию в зависимости от типа. В качестве шаблонов используются также PHP файлы или Blade шаблоны, которые по умолчанию располагаются в папке /resources/snippets

Помимо типов виджеты могу иметь различные интерфейсы:

  • Widget данные интерфейс должны реализовать все виджеты системы
  • WidgetCacheable - используется для виджетов, содержимое которых можно кешировать
  • WidgetCorrupt - интерфейс дает понять, что виджет поврежден, (например он загружен из БД, но для него не найден класс или тип)
  • WidgetDatabase - данные виджета хранятся в БД
  • WidgetHandler - виджет обработчик, виджет который не может иметь шаблона и не может быть выведен на страницу, а имеет свой уникальный URL на который необходимо передать POST|GET|... данные для последующий обработки их (Например отправить письмо, сохранить данные в БД и т.д.)
  • WidgetPaginator - виджет выводит список документов и он может иметь постраничную навигацию
  • WidgetRenderable - виджет имеет шаблон и его можно вывести как HTML

Для упрощения работы для различных интерфейсов были созданы трейты и декораторы

  • Trait WidgetCache - реализует кеширование виджета
  • Trait WidgetHandler - реализует обработчик виджета
  • Trait WidgetPaginator - реализует постраничную навигацию
  • Trait WidgetRender - реализует рендеринг шаблона
  • Decorator Decorator - содержит в себе всю основную логику виджета, от него можно наследовать все будущие виджеты
Пример простейшего виджета, который имеет шаблон и кешируется
<?php namespace KodiCMS\Widgets\Widget;

use KodiCMS\Widgets\Contracts\WidgetCacheable;
use KodiCMS\Widgets\Traits\WidgetCache;

class HTML extends DatabaseDecorator implements WidgetCacheable
{
	use WidgetCache;

	/**
	 * @return array
	 */
	public function prepareData()
	{
		return [

		];
	}
}
Пример простейшего виджета обработчика
<?php namespace KodiCMS\Widgets\Widget;

use KodiCMS\Widgets\Contracts\WidgetHandler as WidgetHandlerInterface;
use KodiCMS\Widgets\Traits\WidgetHandler;

class Handler extends Decorator implements WidgetHandlerInterface
{
	use WidgetHandler;

	/**
	 * @return array
	 */
	public function prepareData()
	{
		return [

		];
	}
}

Жизненный цикл загрузки виджетов на страницу

  1. Запрос страницы
  2. Если страница найдена запуск события и создание коллекции виджетов PageWidgetCollection
  3. Инициализация класс Block и помещение в него коллекции виджетов и и затем вызов метода placeWidgetsToLayoutBlocks, который распределяет виджеты по блокам шаблона.
  4. Срабатывание в шаблоне Block::run, которые по названию блока ищет связанные с ним виджеты
  5. Рендеринг виджетов