Вложенные шаблоны

При назначении очередного шаблона выводится список всех шаблонов, находящихся папке 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.

  • Путь строится перечислением всех названий папок, встретившихся при движении к искомой папке или файлу. Разделителем служит слеш (/).
  • Если строка начинается со слеша, она означает полный (абсолютный) путь от корневой папки. Во всех остальных случаях мы имеем относительный путь от текущей папки.
  • Специальное обозначение папок:
    /   Корневая папка
    ..  Родительская папка
    .   Текущая папка
    

Применительно к шаблонам, нужно сделать несколько оговорок:

  • Корневой папкой считается папка templates (сама она при записи не указывается, так как она может находиться вообще на другом сайте).
  • Так как при указании шаблонов, расширение tpl не используется, то может возникнуть путаница между именами папок и файлов. По этой причине, если нужно путь закончить именем папки, пишите в конце символ '/'. Это будет интерпретировано, как все шаблоны, находящиеся в этой папке. Если символа '/' на конце нет, то это будет интерпретировано как путь к конкретному шаблону.

Примеры путей смотрите ниже.

Параметры allow и disallow

Параметр 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

Примеры

  1. shop.tdd
    $types[1]="block allow('shop/')";
    $types[2]="block allow('shop/')";
    
    При попытке назначить шаблон первому блоку из дескриптора, в списке мы увидим только шаблоны из папки shop (то есть, nav и goods).
  2. Шаблоны на более глубоком уровне можно организовать аналогично.

    goods.tdd
    $types[1]="block allow('goods/')";
    $types[2]="block allow('goods/')";
    
    Путь также указывается относительно текущей папки.
  3. Можно указывать не папки, а конкретные шаблоны. Тогда в списке на назначение будет единственный шаблон

    goods.tdd
    $types[1]="block allow('goods/items')";
    $types[2]="block allow('goods/complements')";
    
  4. В последнем примере шаблоны имеет смысл сделать шаблонами по умолчанию.

    goods.tdd
    $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')";
    
  5. Попробуем добавить блок с рекламой в товарный блок

    goods.tdd
    $types[3]="block allow('../ads')";
    // Перейти к родительской папке текущей папки файла goods.tdd и взять шаблон ads
    
    Путь к этому шаблону можно указать с начала:

    goods.tdd
    $types[3]="block allow('/ads')"; // Шаблон ads находиться в корневой папке
    
  6. Разрешить шаблоны из двух папок.
    $types[2]="block allow('/','goods/complements')";
  7. Применение параметра disallow аналогичное, только он, наоборот, отменяет возможность назначить шаблоны из указанного в нем перечня шаблонов или папок. Параметр disallow можно применять совместно с параметром allow, причем, параметр disallow имеет приоритет над параметром allow.
    $types[3]="block allow('/') disallow(/shop)";
    // Разрешить все шаблоны из папки templates, кроме шаблона shop из этой же папки

Совет

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

• templates/
	• main1.tdd одноколоночный внешний шаблон
	• main1.tpl
	• main2.tdd двухколоночный внешний шаблон
	• main2.tpl
	• subtemplates/
		все остальные шаблоны

Теперь в начале создания страницы мы будем выбирать только между двумя шаблонами main1 и main2.

Пути в файлах css, js

При использовании 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}

Если же стиль записывается в файле шаблона, то путь к картинке придется указать от главной страницы:

goods.tpl
<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/)';

Примечания

  • Вложенные папки, могут иметь любое имя, но рекомендуется придерживаться имен головных шаблонов.
  • В папке assigned повторяется та же структура папок шаблона, что и в папке templates.

См. также