xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Простая вставка в текст динамического контента (без использования PHP filter)

Опубликовано в

Часто нужно вставить в середину содержимого ноды или блока какой-нибудь контент, сгенерированный с помощью php, например вьюху или переменную. Для решения задачи можно либо вывести контент используя php фильтр, либо сделать str_replace() в preprocess функции, либо накидать простой текстовый фильтр, заменяющий токены [function:function_name] на результат выполнения функции:

/**
 * Implements hook_filter_info().
 */
function modulename_filter_info() {
  $filters['token_function'] = array(
    'title' => t('Replace [function:*] to function result'),
    'process callback' => 'modulename_filter_process',
    'cache' => FALSE,
  );
 
  return $filters;
}
 
/**
 * Filter process callback.
 */
function modulename_filter_process($text, $filter, $format, $langcode, $cache, $cache_id) {
  $text = preg_replace_callback('/\[function:(.+?)\]/', function ($matches) {
    $token_params = explode(':', $matches[1]);
    $function = 'token_function__' . preg_replace('/[^a-z0-9_]/', '', $token_params[0]);
 
    if (function_exists($function)) {
      $arguments = isset($token_params[1]) ? explode(',', $token_params[1]) : array();
      return call_user_func_array($function, $arguments);
    }
 
    return $matches[0];
  }, $text);
 
  return $text;
}

Использование:

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

2. Написать функцию с префиксом token_function__, например:

function token_function__current_date($format = 'r') {
  return date($format);
}

3. Добавить в текст токен в формате [function:FUNCTION_NAME], например [function:current_date].

Profit.

Дополнения:

Передать аргументы в функцию можно третьим параметром через запятую [function:FUNCTION_NAME:ARG1,ARG2], например [function:current_date:d.m.Y].

Для фильтра лучше создать отдельный текстовый формат, которым сможет пользоваться только администратор и только в определённых нодах/блоках, так как фильтр отключает кэширование текста, прошедшего через формат.

Код доступен в виде модуля.

Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Другой вариант: поставить Token filter и сделать свой токен.

Это очень круто, cпасибо!

Спасибо за статью.
Пригодилось.

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании