Создание простого модуля-фильтра для Drupal 7
Primary tabs
Тут я опишу процесс создания простого модуля-фильтра для Drupal 7.
Для начала стоит выбрать имя для модуля. Стоит отметить, что имя модуля должно начинаться с маленькой буквы, иначе он может не заработать. Итак, имя нашего модуля будет html_pre_filter.
Задача перед нами стоит следующая. Drupal фильтрует содержимое постов и комментариев и удаляет (точнее скрывает) большую часть тегов html. Это нужно, чтобы на странице злоумышленники не смогли разместить свою разметку и скрипты. Однако иногда надо выкладывать исходный код страниц в обучающих целях. Для этого мы и создадим наш фильтр, который будет всю информацию заключенную в теги pre превращать в обычный текст, который не встраивается в DOM модель страницы.
Первый шаг.
Внутри \директория в которой лежит Drupal\sites\all\modules\ создайте папку html_pre_filter.
Внутри нее создайте 2 файла html_pre_filter.info и html_pre_filter.module.
Первый файл будет содержать информацию о модуле, которая будет отображена в админке. Во втором файле будет исходный php-код.
(Пока редактируете файлы им можно для удобства задать расширения .txt и .php, но когда будете запускать модуль, надо все вернуть назад).
Откройте html_pre_filter.module в любом текстовом редакторе (рекомендую Notepad++) и поместите туда следующую информацию:
name = html_pre_filter description = filter html tags in pre tag package = MyFilters core = 7.x version = 1.0.0.0 files[]= html_pre_filter.module
Опишим подробнее, что есть что.
- name - имя модуля, отображается в админке
- description - описание, отображается в админке
- package - раздел куда в списке модулей попадет наш
- core - версия Drupal
- version - версия модуля, отображается в админке
- files[] - файлы исходного кода
Теперь сохраните и закройте файл. Если вы все сделали правильно, то модуль должен отобразиться в админке.
Теперь откройте файл html_pre_filter.module и по поместите туда следующий код
<?php /** * hook_filter_info(). */ function html_pre_filter_filter_info() { $filters['filter_html'] = array( 'title' => t('html_pre_filter'), 'description' => t('Filter html in pre tag'), 'process callback' => 'html_pre_filter_filter_process', ); return $filters; } function html_pre_filter_filter_process($text) { $result = preg_match_all("!<pre(.*?)>(.*?)</рre>!si", $text, $matches); foreach ($matches[2] as $item) { $text= str_replace($item, htmlentities($item), $text); } return $text; }
Теперь модуль готов. Осталось только в нем разобраться.
function html_pre_filter_filter_info() { $filters['filter_html'] = array( 'title' => t('html_pre_filter'), 'description' => t('Filter html in pre tag'), 'process callback' => 'html_pre_filter_filter_process', ); return $filters; }
Данная функция является хуком - она автоматически выполняется Drupal'ом, когда он анализирует все подключенные модули. Смысл функции в том, что она регистрирует модуль в системе, добавляя себя в массив $filters. Как видим в коде, системе сообщается имя, описание и функция, которую надо вызывать для фильтрации.
Вторая функция принимает на вход текст, введенный пользователем, заменяет содержимое тегов pre на закодированный html и возвращает системе. В итоге все html теги внутри pre превращаются в обычный текст.
- Log in to post comments
- 4840 reads
vedro-compota
Tue, 07/28/2015 - 10:01
Permalink
отличная заметка.
отличная заметка.
НО:
смелее используйте подсветку кода - и форматирование например область. с тех. информацией моно подсветить (я уже поправил в вашей статье) - то есть:
смотрится намного лучше внутри текста чем просто:
-------------------------------
name = html_pre_filter
description = filter html tags in pre tag
package = MyFilters
core = 7.x
version = 1.0.0.0
files[]= html_pre_filter.module
-------------------------------
друпал-справочник у нас здесь - туда можно и добавлять заметки) вашу статью я уже добавил.
_____________
матфак вгу и остальная классика =)
vedro-compota
Tue, 07/28/2015 - 10:02
Permalink
списки
также обратите внимание на оформление списков при перечислении (тоже уже поправил в вашей заметке).
_____________
матфак вгу и остальная классика =)