|
Оператор fileС помощью оператора file можно организовать публикацию нескольких файлов из одного дизайн-шаблона. Одна из возможных областей применения оператора file - создание внешних дайджестов (например, лента новостей создает свой краткий индекс последних новостей для включения на главную страницу) или же отдельные страницы длинных документов (например, когда список товаров содержит в себе несколько страниц, скажем, по 20 позиций - создаются несколько файлов по 20 единиц информации, один из которых потом включается в зависимости от выбранной страницы). Синтаксис: <file name=expr [charset=expr]> djemscript </file> где,
Непосредственно перед именем файла может быть указан один из модификаторов поведения:
Оператор file обладает рядом особенностей: Система автоматически обьединяет в один файл несколько последовательных записей в файл с одним и тем же именем в рамках одной публикации. При самом первом вызове файл создается, а каждый последующий вызов просто дописывает тело оператора к уже существующему файлу. Пример:
<file name="/a.shtml">Hello</file> <file name="/b.shtml">Tatsuya Ishida</file> <file name="/a.shtml"> world</file> В результате мы получим два файла - a.shtml, в котором будет "Hello world", и файл b.shtml, в котором будет "Tatsuya Ishida". Однако, если мы выполним этот скрипт ещё раз - файл a.shtml будет содержать текст "Hello world", а не "Hello world Hello world".
Создаваемые посредством оператора file файловые фрагменты контролируются Сборщиком Мусора - это значит, что при удалении документа будут также удалены созданные при его публикации файловые фрагменты (подробная работа описания работа Сборщика Мусора описана в разделе ...), а также, если в процессе публикации документы будут созданы другие файловые фрагменты взамен текущих. Например, если в процессе предыдущей публикации ваш дизайн-шаблон создал файлы a.shtml и b.shtml, а при текущей - b.shtml и c.shtml, то файл a.shtml будет автоматически удален, как потерявший актуальность.
Оператор file по умолчанию вырезает содержимое тэгов <file> из исходного дизайн-шаблона, но это поведение может быть переопределено добавлением знака "+" перед именем файла - в этом случае тело оператора file остается в публикуемом документе. Например, если дизайн-шаблон ленты новостей делает сводку из нескольких последних новостей и при этом сама лента новостей также содержит данный фрагмент - можно создавать дайджест с указанием "+" перед именем файла, при этом он останется в исходном документе. Пример:
Мы хотим <file name="+/keywords.shtml">купить DJEM</file> у правильного дилера. В результате мы получим основной документ, содержащий "Мы хотим купить DJEM у правильного дилера.", и файл keywords.shtml, содержащий слова "купить DJEM".
Операторы file могут быть вложены друг в друга. Это очень полезно для формирования сразу нескольких файлов, использующих один и тот же элемент информации в одинаковом обрамлении. Например, товар может публиковаться как в ленту товаров, так и в ленту новинок. Пример:
<foreach name=x path="main.goods.$"> <file name="/goods/index.shtml"> <file name="+/goods/newitems.shtml"> Товар <foreach[x]._name>, цена <foreach[x].price> </file> </file> </foreach>
Разумеется, при этом все внутренние операторы file должны указывать "+" перед именем выходного файла, а самый верхний - указывать или не указывать в зависимости от того, хотите ли вы оставить фрагмент в теле основного документа или нет.
Пример использования: Разбиение списка публикаций по 10 элементов на странице и включение нужной страницы в зависимости от параметра, используя DJEM-script и SSI.
<set perPage=10> <!-- по 10 на странице --> <foreach name=x path="main.publications.$" where="_publish_time!=0" sort="-_publish_time"> <!-- выбираем все опубликованные материалы --> <set curPage=((<foreach[x]._count> - 1) / <var[perPage]>) + 1> <!-- определяем номер страницы элемента, начиная с единицы --> <file name=<#_url.replace(".shtml", "_page<var[curPage]>")#>> <!-- вырезаем элемент в соответствующий файл --> <!-- тело элемента --> <a href="<foreach[x]._url>"><foreach[x]._name></a><br> <p><foreach[x].intro></p> <a href="<foreach[x]._url>">Подробнее...</a> </file> </foreach>
<!-- Строим строку номеров страниц --> <set totalPages=(<foreach[x]._total> + <var[perPage]> - 1) / <var[perPage]>> <!-- определяем общее количество страниц --> <loop i=1 to <var[totalPages]>> <!-- делаем цикл по страницам --> <a href="?page<loop[i]>"><loop[i]></a> <!-- расставляем ссылки на страницы --> </loop>
<!-- А теперь включаем нужный фрагмент - в зависимости от переданного параметра --> <!--#if expr="$QUERY_STRING=''" --> <!--#set var="qs" value="page1" --> <!--#else --> <!--#set var="qs" value="$QUERY_STRING" --> <!--#endif --> <!-- Описанная выше SSI конструкция запишет в переменную qs данные из переменной QUERY_STRING (параметр запроса к странице), а если переменная QUERY_STRING не указана, то в переменную qs будет записан код первой страницы -->
<!--#include virtual="<#_url.replace(".shtml", "_")#>$qs.shtml" --> <!-- Включим нужную страницу! --> Пояснения к примеру: Примененные манипуляции с методом replace весьма практичны при создании имени файлового фрагмента, зависящего от имени основного документа. Например, если основная лента документов у вас находится по имени /rus/news/ferrari.shtml, то оператор <#_url.replace(".shtml", "_page1.shtml")#> сформирует от этого урла путем замены урл /rus/news/ferrari_page1.shtml. Язык вебсервера SSI - мощный инструмент. Он позволяет создавать легкие, с точки зрения производительности, динамические страницы. Если вы правильно используете DJEM-скрипт и SSI, ваш сайт будет успешно выдерживать нагрузки, фатальные для большинства других сайтов. |