Как перед выводом пропустить поле через фильтр?

Главные вкладки

Аватар пользователя Антоха82 Антоха82 31 июля 2018 в 14:57

Что нужно: вывести значение поля в котором содержится токен так, чтобы это поле было пропущено через фильтр 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.

Комментарии

Аватар пользователя Антоха82 Антоха82 31 июля 2018 в 19:07

Большое спасибо за ответ, это то что нужно, только у меня почему-то это не работает. Уже как только не пробовал.
Пишу такой код:

<?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);
?>

Но это тоже не работает. Токены вообще не работают.

Аватар пользователя Semantics Semantics 31 июля 2018 в 19:14

Странно, конечно, но есть подозрение, что у фильтра токенов могут быть ограничения, например, он может работать только на страницах нод. Надо смотреть код фильтра.

Попробуйте напрямую https://api.drupal.org/api/drupal/includes%21token.inc/function/token_re..., а не просто фильтр

Аватар пользователя Антоха82 Антоха82 31 июля 2018 в 19:23

Дело не только в токенах. Я пробовал экспериментировать с обычными тегами.
Если в фильтр '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);    
?>

, то не работает. Т.е. дело не только в токенах, проблемы с вот этим кодом.

Аватар пользователя Антоха82 Антоха82 31 июля 2018 в 19:41

Semantics wrote:

Я бы глянул в каком виде оно всё уходит в drupal_render(), а то может там уже [ ] > < заменены на HTML-сущности

Это первая мысль которая у меня возникла. Но там все нормально. Если в предыдущем коде закомментировать строчку $output = check_markup($output, 'otvet'); , то выдается < b >текст, т.е. содержимое поля.

Аватар пользователя Антоха82 Антоха82 31 июля 2018 в 19:54

Если посмотреть именно, как вы говорите, что уходит в 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 содержит уже отфильтрованный текст. Я думал, что когда мы выводим поле, то значение берется именно отсюда. Почему тогда мне выдается значение с тегами вообще не понятно.