Главная  |  О продукте  |  Пользователям  |  Community

Поиск

 

Оператор file

С помощью оператора file можно организовать публикацию нескольких файлов из одного дизайн-шаблона. Одна из возможных областей применения оператора file - создание внешних дайджестов (например, лента новостей создает свой краткий индекс последних новостей для включения на главную страницу) или же отдельные страницы длинных документов (например, когда список товаров содержит в себе несколько страниц, скажем, по 20 позиций - создаются несколько файлов по 20 единиц информации, один из которых потом включается в зависимости от выбранной страницы).

Синтаксис:

<file name=expr [charset=expr]>

  djemscript

</file>

где,

Параметр

Описание

name

Имя создаваемого файла, указывается путь от корня сайта. Обязательный параметр;

charset

Кодировка выходного фрагмента.( "koi-8", "windows-1251", "utf-8" ). Если параметр отсутствует, используется кодировка текущего документа.

 

Непосредственно перед именем файла может быть указан один из модификаторов поведения:

Модификатор

Описание

Пример использования

+

Текст, указанный внутри тэгов <file> включается в текст исходного документа. По умолчанию текст вырезается

 

<file name="+/a.shtml">текст</file>

 

<

Включает в текст исходного документа содержимое файла на диске.

 

<file name="</a.shtml"></file>

>

Создает файл и осуществляет запись в него

 

<file name=">/a.shtml">текст</file>

>>

Добавляет запись в конец файла, если такой файл уже есть на диске.

 

<file name=">>/a.shtml">текст</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, ваш сайт будет успешно выдерживать нагрузки, фатальные для большинства других сайтов.