Drupal → Как изменить переменную $content до её вывода в page.tpl.php

26.04.2010

Самый простой способ, это в template.php добавить функцию предварительной обработки страницы:

/**
 * Preprocess function for page.tpl.php
 */
function phptemplate_preprocess_page(&$vars) {
  $vars['content'] = '<h1>Новый заголовок</h1>' . $vars['content'];
}

Если же переменную нужно изменить в своём модуле, то префикс phptemplate заменяется на имя модуля:

/**
 * Preprocess function for page.tpl.php
 */
function MODULENAME_preprocess_page(&$vars) {
  $vars['content'] = '<h1>Новый заголовок</h1>' . $vars['content'];
}

А вот так можно изменить контент только на определённой странице, в данном случае — на странице таксономии (taxonomy/term/[tid]):

/**
 * Preprocess function for page.tpl.php
 */
function MODULENAME_preprocess_page(&$vars) {
  if (arg(0) == 'taxonomy' && arg(1) == 'term') {
    $vars['content'] = '<h1>Новый заголовок</h1>' . $vars['content'];
  }
}

Бонусом, порядок запуска функций темизации:

Подробнее про preprocess функции.

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

Комментарии

Петров Николай
10.08.2011, 22:21

Не подскажешь, как в семерке в своем модуле достучаться до переменной $node?

Хочу сделать тэг meta description с кратким описанием страницы, у меня есть CCK поле, текст которого подходит для этого тэга, но в своем модуле я не смог получить доступ ни к каким из этих переменных: $node, $content, $vars, $variables

Моя примитивная попытка не увенчалась успехом:

$element = array(
  '#tag' => 'meta', // The #tag is the html tag - <link />
  '#attributes' => array( // Set up an array of attributes inside the tag
    'description' => 'description',
    'content' => $node->field_descr['und'][0]['value'],
  ),
);

drupal_add_html_head($element, 'meta_description');

// <meta name="description" content="Мета-теги в Википедии" />

Приведенный в этой статье пример получения доступа к переменным тоже не работает, хотя в API семерки насколько я понял по сравнению с шестеркой изменений нет

function моймодуль_preprocess_page(&$vars) {
  print_r($vars);
}

не работает и этот вариант:

function моймодуль_preprocess_html(&$vars) {
  print_r($vars);
}

В чем я не прав?

Петров Николай
10.08.2011, 22:24

Пробовал еще так:

$n = variable_get($node);

но эта функция похоже для других целей

Петров Николай
11.08.2011, 21:35

как оказалось, arg() возвращает составные куски алиаса, а не системного пути ноды. Решения пока не нашел, гуглю

http://api.drupal.ru/api/function/arg/6

Примечание: Функция работает с внутренним путем друпала, а не с конечным адресом, поэтому если вы находитесь на странице "blog/some-post", а ее настоящим адресом является "node/123", то arg(1) будет равен "123", а не "some-post".

Петров Николай
11.08.2011, 21:46

да, в шестом так и было, но в седьмом видимо поменяли.

Петров Николай
11.08.2011, 22:29

Специально обновил друпал до версии 7.7 чтобы проверить.

arg(0) - ничего не возвращает (или возвращает пустую строку)
arg(1) - возвращает алиас

(у меня путь всего из одного звена, без слешей)

Как-то так...

Задачу свою я решил, может не очень красивым способом, но вроде работает. Когда будет время переделать по уму - займусь гуглением, а пока так:

$systemPath =  drupal_lookup_path( 'source', arg(0));
$nid = substr($systemPath, 5); 
$nodeLoad = node_load($nid);

да, на орге рекомендуют использовать menu_get_object(), но пока не разобрался как ее использовать

When attempting to use this function to load an element from the current path, e.g. loading the node on a node page, please use menu_get_object() instead.

цитата отсюда: http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/arg/7

Петров Николай
12.08.2011, 09:06

Забавное различие: если вызвать arg() внутри шаблона, допустим page.tpl.php - он вернет системный путь (ну как в шестом друпале и было), а если вызвать в своем модуле - вернет алиас.

не может этого быть :)

includes\path.inc:

/**
 * Initialize the $_GET['q'] variable to the proper normal path.
 */
function drupal_path_initialize() {
  if (!empty($_GET['q'])) {
    $_GET['q'] = drupal_get_normal_path($_GET['q']);
  }
  else {
    $_GET['q'] = drupal_get_normal_path(variable_get('site_frontpage', 'node'));
  }
}

includes\common.inc:

function _drupal_bootstrap_full() {
  ...
  // Initialize $_GET['q'] prior to invoking hook_init().
  drupal_path_initialize();
  ...
}

hook_menu

function intens_prod_menu() {
  $items = array();
  $items['calc/zzz'] = array(
    'title' => 'Калькулятор цен',
    'description' => 'Тут можно проверить цену',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('intens_prod_form'),
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
  );

calc/zzz — внутренний путь, ф-я arg работает согласно документации

Петров Николай
12.08.2011, 20:45

я проверил на втором сайте, который тоже на седьмом друпале.

У него есть термин таксономии с алиасом: program/firefox

этот код в своем модуле:

print arg(0);
print ' ';
print arg(1);

выводит вместо ожидаемого «taxonomy term» - куски алиаса: «program firefox»

Потом не поленился, и поставил свежую установку друпала, чтобы проверить, и опять, вместо системного пути arg() возвращает алиас:
http://clip2net.com/clip/m22095/1313167138-clip-32kb.png

Попробуй вставь в свой модуль вызов этих функций, я думаю у тебя тоже будут возвращаться алиасы.

этот код в своем модуле

а точнее?

Петров Николай
12.08.2011, 20:53

Просто без всяких функций, прямым текстом так и пишу.

содержимое файла _customp.module:

<?php

print arg(0);
print ' ';
print arg(1);

впрочем на скриншоте в моем предыдущем комменте видно то-же самое

Гость
07.02.2014, 19:43

Уважаемый xandeadx! Помогите советом: столкнулся с проблемой вывода полей в переменной $content суть такова имеется код в node.tpl.php
<?php
$block = module_invoke('search', 'block', 'view', 0);
$serch = "".$block['content']."";
?>

<?php

$content_array = explode("

",$content);
$content_array_half_size = count($content_array) / 3;
if($content_array_half_size<=1){

print $content;

}else{
$added_string = $serch;
array_splice($content_array, $content_array_half_size, 0, $added_string);
$final_content = implode("

", $content_array);

print $final_content;

}
?>
код выводит блок поиска в середину статьи. Вопрос такого плана: как изменить данный код чтобы блок выводился именно после последнего абзаца или перед последним полем?

ищите позицию последнего параграфа с помощью strpos
вставляйте туда текст с помощью substr_replace

Гость
07.02.2014, 19:58

Спасибо за быстрый ответ! Буду пробовать

Добавить комментарий