Система блоков - расставляем точки...
Была потребность разобраться с системой блоков. Очень много чего перечитал с сайта. Например, Система блоков. Ниже будет краткое изложение полученных знаний. Попытаюсь рассказать про систему блоков простым языком, чтобы и новички поняли.
Самое главное, что я выяснил:
1. Блоки можно создавать самостоятельно.
2. Блоки можно размещать в произвольном месте страницы (нужно заранее указать эти места)
3. Блоки могут отображаться в зависимости от Action'ов и Event'ов
4. Блоки могут отображаться в зависимости от адреса страницы. Адрес страницы можно задать с помощью регулярных выражений.
Итак, основные моменты.
Чтобы этот блок отображался — нужно определить его в конфиге. Например, так:
Читается этот код так:
Правило для блока с именем 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/
Например контейнер блоков в дефолтном шаблоне задается в файле sidebar.tpl.
В этом коде выводится контейнер блоков с именем right.
Ее Action — это topic, а Event — это edit.
Выглядят они примерно так: error, registration, profile, my, blog, top, new, topic, people, settings…
Система регулярных выражений для меня сложновата, потому что то, что написано в википедии не всегда срабатывает.
подразумевает ноль или более символов комментарий от ort
$ — конец строки
\ — экранирующий символ, который системные символы делает обычными. В нашем случае обратная косая черта экранирует системный символ точку. Теперь точка воспринимается как точка. А без обратной косой черты точка воспринималась бы как один любой символ.
Пожалуй, на этом все. Вполне возможно, что я не знаю какие-то интересные моменты. Если вы владеете полезной информацией по этому вопросу, то черкните несколько строк в комментариях. Будет интересно перенять опыт.
Пожалуй, самый сложный момент это все-таки момент с регулярными выражениями.
Самое главное, что я выяснил:
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,
);
Система регулярных выражений для меня сложновата, потому что то, что написано в википедии не всегда срабатывает.
Нужно знать, что
* —$ — конец строки
\ — экранирующий символ, который системные символы делает обычными. В нашем случае обратная косая черта экранирует системный символ точку. Теперь точка воспринимается как точка. А без обратной косой черты точка воспринималась бы как один любой символ.
Пожалуй, на этом все. Вполне возможно, что я не знаю какие-то интересные моменты. Если вы владеете полезной информацией по этому вопросу, то черкните несколько строк в комментариях. Будет интересно перенять опыт.
Пожалуй, самый сложный момент это все-таки момент с регулярными выражениями.
24 комментария
Смело можно включить а FAQ
Если уже в чем-то разобрались — то напишите топик.
Новичкам будет интересно узнать, а вы сможете поднимите карму.
Да и сообщество еще некоторые нюансы подскажет, которых вы даже и не знали.
Все через конфиг, все ручками…
Тоже считаю, что нужно интерфейсное решение.
здесь звезда заменяется на что то вроде [\w+], т.е. латинские символы
если указать блок так kvadrat вместо block.kvadrat.tpl, то для такого блока будет вызван его обработчик из каталога /classes/blocks/
Про название правил — подправил.
Про звездочку. Правильно ли я понимаю, что * означает 1 и более латинских символов?
Про /classes/blocks/ тоже дописал.
т.е. здесь * используется как шаблон для замены, а не как квантификатор регулярного выражения
Поставил себе AceBlogExtender. Теперь в шапке хочу добавить менюшку категорий с подкатегориями. Смотрю в сторону блоков, blog_list.tpl (еще буду разбирать что с чем связано). Правильный ли вариант сделать это именно через блоки. В принципе все затачивается под один шаблон, но если сделаю более-менее красиво(чего и хочу), то буду рад выложить в виде плагина для народа.
Пока думаю за основу взять плагин slider. Если кому не сложно в двух словах подскажите общую последовательность для такого дела.
Когда просто kvadrat, что это означает, что будет выводиться код из файла kvadrat.tpl из папки /classes/blocks/
То есть системный, предопределенный разработчиками блок.
'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 и по порядку он в конце!!!
если я правильно понял из примеров, то прописать в конфиге следующее?:
$config['block']['rule_index_main'] = array(
'action' => array(
'mainpage'
),
'blocks' => array(
'content' => array('block.kvadrat.tpl'=>array('priority'=>100))
),
'clear' => false,
);