Фильтры


Памяти Светланы посвящается. —-
Ссылки

Описание фильтра

Фильтр в InstantCMS находит в контенте статей или пользовательских модулей выражения вроде {ФРАЗА=список параметров}, и заменяет их на то конкретное действие, которое предусмотрено фильтром.

Структура фильтра

1. Все фильтры хранятся в папке filters,
2. Каждому фильтру отведена своя папка. Имя папки - начинающееся на f_ имя фильтра, например, f_replace
3. Имя файла фильтра filter.php

Фильтры в Базе Данных.

Все фильтры описаны в БД в таблице cms_filters. Эта таблица имеет поля:
- id, ключевой параметр
- title - в этом поле хранится имя фильтра
- description - это поле содержит подробное описание фильтра, которое можно прочитать в админке
- link - название папки фильтра, используется для ссылки на фильтр
- published публиковать/не публиковать фильтр (значение поля 1/0)

Как фильтр работает

Как уже сказано, для срабатывания фильтра в тексте статьи или модуля должна появиться конструкция {ФРАЗА=список параметров}.
Здесь:
- ФРАЗА - кодовое слово, вызывающая срабатывание фильтра (обязательный параметр)
- список параметров - необязательный список параметров, который можно передать в фильтр прямо из статьи.

Во фронтэнде компонента content (файл components/content/frontend.php) есть такая строчка

$article['content'] = cmsCore::processFilters($article['content']);

Эта строчка вызывает ядерный метод processFilters(), куда передает контент (значение элемента массива $article['content']). В ядре происходит получение из таблицы cms_filters всех имеющихся на сайте фильтров, которые опубликованы, а затем их поочередный вызов. Когда фильтр вызывается, ему передается контент.

После вызова фильтра он первым делом проверяет, если ли в переданном ему контенте кодовая фраза ФРАЗА. Например:

$phrase = 'ФАЙЛ';

Если фильтр многофункциональный, он может отрабатывать несколько фраз. Пример такого фильтра f_replace. Он содержит массив кодовых фраз. Например:

$phrases = array('photo'=>array('title'=>'ФОТО', 'function'=>'PhotoLink'),
                 'album'=>array('title'=>'АЛЬБОМ', 'function'=>'AlbumLink'),
                 'content'=>array('title'=>'МАТЕРИАЛ', 'function'=>'ContentLink'),
                 'form'=>array('title'=>'ФОРМА', 'function'=>'insertForm'),
                 'blank'=>array('title'=>'БЛАНК', 'function'=>'insertForm'));

Затем, если кодовая фраза ФРАЗА в контенте есть, фильтр выполняет то действие, для которого предназначен. Если фразы в контенте нет, фильтр возвращает вызвавшему его методу контент без изменения.
Можно написать фильтр так, что в него будут из текста статьи переданы параметры. Имена и порядок параметров, их значения по умолчанию определяет автор фильтра. Очень хорошо, если он при этом сопроводит фильтр подробной инструкцией, чтобы автор статьи (как правило, человек без квалификации программиста) имел возможность воспользоваться всеми возможностями фильтра.

Некоторые фильтры, например фильтр f_includes, своим действием имеют вызов скрипта из папки includes/myphp/my_file.php.
В этом случае, как нетрудно догадаться, в качестве параметра из статьи передается имя файла my_file.php. Этот скрипт, при отображении статьи на сайте, уже должен находиться в папке includes/myphp/, чтобы в статье вместо фильтра появилось действие, вызываемое этим скриптом. Поскольку автор статьи и админ сайта не обязательно одно лицо, автору следует согласовать с администратором список скриптов, которые он может вызвать. Таким образом, обеспечивается безопасность сайта - ведь автор статьи, если он не админ, не может залить в эту папку что попало.

Пример. Для того чтобы из статьи вызвать файл my_file.php, в нее надо вставить конструкцию {ФАЙЛ=my_file.php}.

После того, как фильтр вызвал скрипт и получил обратно его действие (например, контент, который скрипт сгенерировал) фильтр заменяет выражение {ФАЙЛ=my_file.php}на полученый контент.

Затем возвращает преобразованный контент обратно в ядро, в метод processFilters(). Этот ядерный метод напомню, вызывает все опубликованные фильтры один за другим, чтобы те могли просмотреть контент и, если встретили кодовую фразу, преобразовать в соответствии со своей задачей.

Замем метод возвращает преобразованный фильтрами контент туда, откуда был вызван. Таким образом, в статье при показе на сайте, вместо выражения {ФРАЗА=список параметров} появляется фрагмент, сгенерированный фильтром.

Недокументированные возможности

1. Ничто не мешает вам написать два фильтра с разным действием, которые срабатывают на одну кодовую фразу. Естественно, срабатывать будет тот фильтр, который первым загрузился из БД. Таким образом, переключать фильтры можно, просто меняя порядок записей в БД.
2. Если закомментировать в первом из таких фильтров строчку

$text = str_replace('{'.$phrase.'='.$context.'}', $picture, $text);

, то работать эти фильтры будут «тандемом» то есть сперва в контент будет вставлен результат работы первого фильтра, а затем второго.


Написал stroller7


Ссылки
 
справочник/фильтр.txt · Последние изменения: 2014/04/11 13:47 От stroller7