Что нужно: вывести значение поля в котором содержится токен так, чтобы это поле было пропущено через фильтр token и вместо, скажем [node: nid] на экран выводился айдишник данной ноды.
У меня есть таблица, в которой нода с номером 2 содержит поле field_otvet с текстом [node: nid].
Есть собственный фильтр otvet, который работает с токенами
Как я вывожу поле.
<?php
$node = node_load(2);
$output = field_view_field('node', $node, 'field_otvet', array(
'label' => 'hidden',
'settings' => array('format' => 'otvet'),
));
echo (drupal_render($output));
?>
Этот код работает, в смысле того что значение поля выводится на экран, но оно не пропускается через фильтр. Т.е. выводится именно [node: nid] а не 2.
Я знаю, что связь с форматом указывается в строке 'settings' => array('format' => 'otvet'), но как именно нужно написать не знаю, уже по-всякому пробовал. Что скажете друзья?
p.s. Еще хочу уточнить, что в поле field_otvet_format напротив ноды 2 значение otvet я вбил вручную, в саму таблицу. По умолчанию, когда обновляешь тип материала в котором есть это поле формат стоит NULL.
Комментарии
https://api.drupal.org/api/drupal/modules!filter!filter.module/function/...
Большое спасибо за ответ, это то что нужно, только у меня почему-то это не работает. Уже как только не пробовал.
Пишу такой код:
<?php
$node = node_load(2);
$output = field_view_field('node', $node, 'field_otvet', array('label' => 'hidden'));
$output = drupal_render($output);
$output = check_markup($output, 'otvet');
echo ($output);
?>
Но выдает он [node: nid].
Я пробовал так:
<?php
$output = '[user:uid]';
$output = check_markup($output, 'otvet');
echo ($output);
?>
Но это тоже не работает. Токены вообще не работают.
Странно, конечно, но есть подозрение, что у фильтра токенов могут быть ограничения, например, он может работать только на страницах нод. Надо смотреть код фильтра.
Попробуйте напрямую https://api.drupal.org/api/drupal/includes%21token.inc/function/token_re..., а не просто фильтр
Дело не только в токенах. Я пробовал экспериментировать с обычными тегами.
Если в фильтр 'otvet' добавить тег < b > и написать такой код:
<?php
$output = '<b>текст</b>';
$output = check_markup($output, 'otvet');
echo ($output);
?>
то тогда работает, текст выводится жирным без тегов. Но вот если такой же текст ввести в таблицу и написать так же как в первом коде предыдущего моего поста
<?php
$node = node_load(2);
$output = field_view_field('node', $node, 'field_otvet', array('label' => 'hidden'));
$output = drupal_render($output);
$output = check_markup($output, 'otvet');
echo ($output);
?>
, то не работает. Т.е. дело не только в токенах, проблемы с вот этим кодом.
Я бы глянул в каком виде оно всё уходит в drupal_render(), а то может там уже [ ] > < заменены на HTML-сущности
$output = drupal_render($output);
Это первая мысль которая у меня возникла. Но там все нормально. Если в предыдущем коде закомментировать строчку $output = check_markup($output, 'otvet'); , то выдается < b >текст, т.е. содержимое поля.
Если посмотреть именно, как вы говорите, что уходит в drupal_render(), то тут еще интереснее, вот что туда уходит (я оставил только то, что касается вопроса):
<?php
array(16) {
["field_otvet"]=>
array(1) {
["und"]=>
array(1) {
[0]=>
array(3) {
["value"]=>
string(17) "текст"
["format"]=>
NULL
["safe_value"]=>
string(29) "<b>текст</b>"
}
}
}
}
?>
Т.е. значение value содержит уже отфильтрованный текст. Я думал, что когда мы выводим поле, то значение берется именно отсюда. Почему тогда мне выдается значение с тегами вообще не понятно.
В вашем случае, значение берётся из настроек виджетов в display mode, как я понимаю.