Создание простого модуля-фильтра для Drupal 7

Тут я опишу процесс создания простого модуля-фильтра для 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

Опишим подробнее, что есть что.

  1. name - имя модуля, отображается в админке
  2. description - описание, отображается в админке
  3. package - раздел куда в списке модулей попадет наш
  4. core - версия Drupal
  5. version - версия модуля, отображается в админке
  6. 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 превращаются в обычный текст.

vedro-compota's picture

отличная заметка.
НО:
смелее используйте подсветку кода - и форматирование например область. с тех. информацией моно подсветить (я уже поправил в вашей статье) - то есть:

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 = 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's picture

также обратите внимание на оформление списков при перечислении (тоже уже поправил в вашей заметке).

_____________
матфак вгу и остальная классика =)