При назначении очередного шаблона выводится список всех шаблонов, находящихся папке templates. Однако, было бы удобнее видеть в списке только те шаблоны, которые действительно могут понадобиться. В системе Blox можно управлять списками шаблонов. Это можно делать, например, в комплектах шаблонов, предназначенных для реализации какой-то определенной задачи.
Кроме того, все файлы шаблонов до сих пор мы просто помещали в папку templates. При большом числе файлов, работать будет неудобно — файлы лучше разложить по папкам.
Как управлять списками шаблонов, рассмотрим на примере комплекта шаблонов для интернет-магазина. Допустим, что к комплекте имеется головной компоновочный шаблон shop. В блок с этим шаблоном вкладываются все остальные блоки интернет-магазина. Поместим файлы shop.tdd и shop.tpl, как обычно, в папку templates.
Остальные файлы комплекта мы положим в папку templates/shop/. Однако, после назначения шаблона shop этих файлов в списке мы не увидим, потому что по умолчанию, в список разрешенных шаблонов блока попадают шаблоны той же папки, что и шаблон родительского блока.
То есть, сначала нужно направить в нужную папку. После этого можно работать с шаблонами внутри папки, как обычно.
Вопрос с папками можно решить, указав в параметре templates относительный путь к шаблону.
shop.tdd$types[1]="block template('shop/nav')";
$types[2]="block template('shop/goods')";
Если после назначения шаблона shop, мы попытаемся назначить шаблон первому блоку шаблона shop, мы увидим в списке возможных шаблонов все шаблоны из папки templates, плюс строчку shop/nav. Хотя шаблон shop/nav и находился в другой папке, он попал в список, потому что был указан явно.
Чтобы управлять списками шаблонов более гибко, в block-данных используются два параметра: allow и disallow. Но сначала сделаем небольшое отступление, и разберемся, как записывать пути к шаблонам.
При указании в дескрипторе путей к шаблонам или к папкам, в которых лежат шаблоны, применяется стиль Unix.
/ Корневая папка
.. Родительская папка
. Текущая папка
Применительно к шаблонам, нужно сделать несколько оговорок:
Примеры путей смотрите ниже.
Параметр allow применяется для указания разрешенных шаблонов.
Параметр disallow применяется для указания неразрешенных шаблонов среди уже разрешенных.
Познакомимся с этими параметрами поближе на примере комплекта шаблонов для интернет-магазина.
Головной шаблон нашего интернет-магазина — shop. Компоновка этого шаблона следующая — слева находится панель навигации (шаблон nav), справа — товарный блок (шаблон goods). Шаблон goods, в свою очередь, состоит из двух блоков: блок с информацией о выбранных товарах/товаре (шаблон items) и блок со списком товаров, обычно покупаемых с данным товаром (шаблон complements). Добавим еще один шаблон, не относящийся непосредственно к комплекту интернет-магазина. Это шаблон ads, предназначенный для рекламного блока.
Структура файлов и папок:
• templates/
• shop.tdd контейнер интернет-магазина
• shop.tpl
• shop/
• nav.tdd панель навигации
• nav.tpl
• goods.tdd контейнер для блоков с информацией о товарах
• goods.tpl
• goods/
• items.tdd Информация о товарах
• items.tpl
• complements.tdd Информация о сопутствующих товарах
• complements.tpl
• ads.tdd Шаблон для рекламы
• ads.tpl
$types[1]="block allow('shop/')";
$types[2]="block allow('shop/')";
При попытке назначить шаблон первому блоку из дескриптора, в списке мы увидим только шаблоны из папки shop (то есть, nav и goods).
$types[1]="block allow('goods/')";
$types[2]="block allow('goods/')";
Путь также указывается относительно текущей папки.
$types[1]="block allow('goods/items')";
$types[2]="block allow('goods/complements')";
$types[1]="block template('goods/items') option('new') allow('goods/items')";
$types[2]="block template('goods/complements') option('new') allow('goods/complements')";
Для этого примера существует короткая форма записи:
goods.tdd$types[1]="block('goods/items', 'new', 'allow')";
$types[2]="block('goods/complements', 'new', 'allow')";
$types[3]="block allow('../ads')";
// Перейти к родительской папке текущей папки файла goods.tdd и взять шаблон ads
Путь к этому шаблону можно указать с начала:
goods.tdd
$types[3]="block allow('/ads')"; // Шаблон ads находиться в корневой папке
$types[2]="block allow('/','goods/complements')";
$types[3]="block allow('/') disallow(/shop)";
// Разрешить все шаблоны из папки templates, кроме шаблона shop из этой же папки
В самом начале сборки страницы, то есть, при назначении внешнего шаблона, шаблоны для вложенных блоков являются по сути лишними. Их лучше поместить в отдельную папку, например: subtemplates:
• templates/
• main1.tdd одноколоночный внешний шаблон
• main1.tpl
• main2.tdd двухколоночный внешний шаблон
• main2.tpl
• subtemplates/
все остальные шаблоны
Теперь в начале создания страницы мы будем выбирать только между двумя шаблонами main1 и main2.
При использовании css и js файлов с именем шаблона, пути из этих файлов указываются как обычно, то есть указывается относительный путь от css-файла к нужном файлу.
Файлы:templates/shop/goods.tpl шаблон
templates/shop/goods.css его стилевой файл
templates/shop/goods/cart.png изображение корзины
goods.css
.cart {background: url(goods/cart.png) no-repeat}
<div style="background: url(templates/shop/goods/cart.png) no-repeat"></div>Это связано с тем, что сам файл шаблона самостоятельно не работает, а используется для генерации контента из главного файла index.php. Предпочтительно писать так:
<div style="background: url(<?= Blox::info('templates','url') ?>/shop/goods/cart.png) no-repeat"></div>
Можно ли сделать так, чтобы все файлы комплекта, в том числе головной шаблон, находились в одной папке и, таким образом, изолированы от остальных шаблонов сайта?
Сделать это можно следующим образом. Создайте папку с любым именем, например: shop, и переместите туда все файлы комплекта:
shop/catalog.tpl
shop/catalog.tdd
shop/catalog/...
Однако, в этом случае головной шаблон catalog станет невидимым для назначения. Чтобы исправить это, в соответствующей строке дескриптора контейнера нужно добавить разрешение для папки shop:
$types[1]='block allow(shop/)';