Система блоков - расставляем точки...

Была потребность разобраться с системой блоков. Очень много чего перечитал с сайта. Например, Система блоков. Ниже будет краткое изложение полученных знаний. Попытаюсь рассказать про систему блоков простым языком, чтобы и новички поняли.

Самое главное, что я выяснил:
1. Блоки можно создавать самостоятельно.
2. Блоки можно размещать в произвольном месте страницы (нужно заранее указать эти места)
3. Блоки могут отображаться в зависимости от Action'ов и Event'ов
4. Блоки могут отображаться в зависимости от адреса страницы. Адрес страницы можно задать с помощью регулярных выражений.
Итак, основные моменты.

1. Блоки можно создавать самостоятельно.

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

$config['block']['block_kvadrat'] = array(
	'path' => array('___path.root.web___/blog/*/*\.html$'),
	'action'  => array('people', 'blog' => array('add','edit')),
        'blocks' => array('right' => array('block.kvadrat.tpl'=> array('priority'=>95))),
	'clear' => false,
			);

Читается этот код так:
Правило для блока с именем block_kvadrat
Берет данные из файла block.kvadrat.tpl
Выводит с приоритетом 95
Выводит в группе (контейнере) блоков, которая у нас называется right
Выводит на страницах с экшеном people
Выводит на страницах с экшеном blog и евентами либо add либо edit
Выводит на страницах такого типа
livestreet.ru/blog/название_блога/название_топика.html
Под такой шаблон подходят, например, эти странички:
livestreet.ru/blog/dev_documentation/8443.html
livestreet.ru/blog/dev_documentation/8444.html
livestreet.ru/blog/themes/8893.html

Здесь остановлюсь на одном моменте: имя правила для блока должно быть уникально. Я по незнанию дал двум правилам одинаковые имена и долго не мог понять почему блоки не выводятся там, где нужно.

И еще, как видно из кода, параметры можно указывать через запятую. То есть можно указать несколько экшнов, эвентов, несколько путей и даже несколько блоков.

ort подсказывает: если указать блок так kvadrat вместо block.kvadrat.tpl, то для такого блока будет вызван его обработчик из каталога /classes/blocks/

2. Блоки можно размещать в произвольном месте страницы.

Однако, места эти нужно задать предварительно.
Например контейнер блоков в дефолтном шаблоне задается в файле sidebar.tpl.
<!-- Sidebar -->
<div id="sidebar">
{if isset($aBlocks.right)}
	{foreach from=$aBlocks.right item=aBlock}
		{if $aBlock.type=='block'}
			{insert name="block" block=$aBlock.name params=$aBlock.params} 
		{/if}
		{if $aBlock.type=='template'}						 
			{include file=$aBlock.name params=$aBlock.params}
		{/if}	
	{/foreach}			
{/if}	
</div>
<!-- /Sidebar -->

В этом коде выводится контейнер блоков с именем right.

3. Блоки могут отображаться в зависимости от Action'ов и Event'ов.

Очень интересный момент. Если кратко, то система LiveStreet имеет так называемый роутер. Он позволяет из адреса странички вычленить Action и Event. Возьмем для примера страничку livestreet.ru/topic/edit/10343/
Ее Action — это topic, а Event — это edit.

Какие есть Action'ы?
Их можно посмотреть в конфиге примерно на 333 строчке.
Выглядят они примерно так: error, registration, profile, my, blog, top, new, topic, people, settings…

Какие есть Event'ы?
add, edit, index, delete (пока я знаком только с этими).

4. Блоки могут отображаться в зависимости от адреса страницы.

Адрес страницы можно задать с помощью регулярных выражений. Это вот как раз то, что передается со словом path.
$config['block']['block_kvadrat'] = array(
	'path' => array('___path.root.web___/blog/*/*\.html$'),
	'action'  => array('people', 'blog' => array('add','edit')),
        'blocks' => array('right' => array('block.kvadrat.tpl'=> array('priority'=>95))),
	'clear' => false,
			);

Система регулярных выражений для меня сложновата, потому что то, что написано в википедии не всегда срабатывает.

Нужно знать, что
* — подразумевает ноль или более символов комментарий от ort
$ — конец строки
\ — экранирующий символ, который системные символы делает обычными. В нашем случае обратная косая черта экранирует системный символ точку. Теперь точка воспринимается как точка. А без обратной косой черты точка воспринималась бы как один любой символ.

Пожалуй, на этом все. Вполне возможно, что я не знаю какие-то интересные моменты. Если вы владеете полезной информацией по этому вопросу, то черкните несколько строк в комментариях. Будет интересно перенять опыт.
Пожалуй, самый сложный момент это все-таки момент с регулярными выражениями.

24 комментария

avatar
Спасибо, очень полезная наработка понятным языком
avatar
Мне, как новичку, ценнейший материал! Спасибо!
Смело можно включить а FAQ
avatar
внес
avatar
Спасибо!
avatar
Да действительно полезная информация.
avatar
Однозначно +, не могу плюсануть, кто мне рейтинг подрезал (за что?)
avatar
Та же фигня.
avatar
Будете создавать подобные топики — будет и рейтинг. wronglane получил уже более 5 единиц кармы за этот топик :)
avatar
Это правда. Раньше в минусах был.
Если уже в чем-то разобрались — то напишите топик.
Новичкам будет интересно узнать, а вы сможете поднимите карму.
Да и сообщество еще некоторые нюансы подскажет, которых вы даже и не знали.
avatar
Еще немножко плюсиков и перенесу топик в блог Tips & tricks
avatar
Супер топик! Нормальный мануал, на нормальном языке — надо помнить, что программист — не единственная в мире профессия. Спасибо! :)
avatar
а у самого уже мысль рождается о плагине, который создавал бы блоки не правкой файлов, а кликом мышки...)) с учетом всех вышеперечисленных моментов :)
avatar
О да! Этого действительно не хватает.
Все через конфиг, все ручками…
Тоже считаю, что нужно интерфейсное решение.
avatar
коллективный заказ может все решить! я думаю, вы, как человек, имеющий представления о всех необходимых требованиях к созданию блоков, можете его составить и предложить. Один участник заказа считайте уже есть)
avatar
Блог с именем block_kvadrat
это не имя блока, это название правила для блоков, самих блоков в одном правиле может быть несколько
* — подразумевает ноль или более символов
здесь звезда заменяется на что то вроде [\w+], т.е. латинские символы

если указать блок так kvadrat вместо block.kvadrat.tpl, то для такого блока будет вызван его обработчик из каталога /classes/blocks/
  • ort
  • +3
avatar
Спасибо за комментарий.
Про название правил — подправил.

Про звездочку. Правильно ли я понимаю, что * означает 1 и более латинских символов?
Про /classes/blocks/ тоже дописал.
avatar
Правильно ли я понимаю, что * означает 1 и более латинских символов?
только применительно к параметру path — в нем происходит замена * на [\w+]
т.е. здесь * используется как шаблон для замены, а не как квантификатор регулярного выражения
avatar
Спасибо за идею. Теперь просьба совета.
Поставил себе AceBlogExtender. Теперь в шапке хочу добавить менюшку категорий с подкатегориями. Смотрю в сторону блоков, blog_list.tpl (еще буду разбирать что с чем связано). Правильный ли вариант сделать это именно через блоки. В принципе все затачивается под один шаблон, но если сделаю более-менее красиво(чего и хочу), то буду рад выложить в виде плагина для народа.

Пока думаю за основу взять плагин slider. Если кому не сложно в двух словах подскажите общую последовательность для такого дела.
avatar
Тоже очень помогло, спасибо! Только до конца не ясно в чем принципиальная разница «если указать блок так kvadrat вместо block.kvadrat.tpl, то для такого блока будет вызван его обработчик из каталога /classes/blocks/». Понял что если прописывать правило полностью, отпадает необходимость подключение обработчика из /classes/blocks/. О как!
  • Yra
  • 0
avatar
Я понял немного иначе.
Когда просто kvadrat, что это означает, что будет выводиться код из файла kvadrat.tpl из папки /classes/blocks/
То есть системный, предопределенный разработчиками блок.
avatar
$config['block']['rule_index_blog'] = array(
'path' => array(
'___path.root.web___/blog$',
'___path.root.web___/blog/*$',
'___path.root.web___/blog/*/page\d+$',
'___path.root.web___/blog/*/*\.html$',
'___path.root.web___/blog/*\.html$',
'___path.root.web___/top(|(/.+))$',
),
'action' => array(
'index', 'new'
),
'blocks' => array(
'right' => array('stream'=>array('priority'=>100),'blogs'=>array('params'=>array(),'priority'=>50),'tags'=>array('priority'=>1))
),

почему блок tags над блоком blogs в просмотре топика??? и по priority и по порядку он в конце!!!
avatar
vse ok, plugin perezapisyval, sorry
avatar
Вопрос от начинающего: установил плагин Main Page, каким образом в нём можно вывести тот же блок kvadrat? и что должно быть описано в самом kvadrat.tpl?

если я правильно понял из примеров, то прописать в конфиге следующее?:

$config['block']['rule_index_main'] = array(
'action' => array(
'mainpage'
),
'blocks' => array(
'content' => array('block.kvadrat.tpl'=>array('priority'=>100))
),
'clear' => false,
);
avatar
Каким образом можно получить ID текущего топика в самом PHP коде Блока?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.