Вы здесь

Как в шаблоне ноды вывести содержание поля после применения форматера, но без подключения шаблона поля?

0

Языком друпал массивов: надо вывести $content['field_my_field'][0]['#markup'] в node.tpl.php.

Варианты:

  1. Напрямую:
if(isset($content['field_my_field'])) {
    print $content['field_my_field'][0]['#markup'];
}

Плюсы: понятный код, форматер достается из управления отображением
Минусы: лишний if, некрасивая подозрительная конструкция ['field_my_field'][0]['#markup']

2. Своя функция рендера:

MODULE_my_render(&$element) {
    if(isset($element) && count($element)) {
        // а) просто рендрить дочерние элементы, которые в моем случае #markup
        return drupal_render_children($element); 

        // б) или, как у токенов - удалить #theme у элемента, благодаря чему отрендрятся только дочерние
        unset($element['#theme']);
        return drupal_render($element);
    }
}

// Вызов в node.tpl.php
print MODULE_my_render($content['field_my_field']);

Плюсы: одна строка в шаблоне без проверок, универсальность, форматер достается из управления отображением.
Минусы: нестандартная функция.

Неудобные для меня варианты, которые усложняют код с каждым новым полем:
3. field_view_value для каждого поля в preprocess с передачей форматера как параметр
4. Прописать для каждого поля в theme_hook_suggestions чистый шаблон

Посоветуйте, на чем остановиться. Или есть более правильный способ?

Версия Drupal: 
7.x
Вопрос задан 14.08.2015 - 20:58

Ответы

0

В шаблоне ноды доступен объект $node. Список значений поля можно получить так

$items = field_get_items('node', $node, 'field_my_field');

С этим уже делайте, что нужно

Ответ дан 15.08.2015 - 01:11

Видимо, я не смог понятно описать вопрос. :-)
В шаблоне ноды не то, что объект $node доступен.
Даже $content доступен с готовым рендер массивом.
Вопрос - можно ли доставать напрямую значения $content['field_my_field'][0]['#markup'].

Комментарий оставлен 15.08.2015 - 10:25

Ну раз оно там есть, значит можно ))
Хотя в общем случае стоило бы в hook_preprocess_node вынести значение в отдельную переменную и потом ее использовать в шаблоне.

Комментарий оставлен 15.08.2015 - 13:45
0
$wrapper = entity_metadata_wrapper('node', $node);
print $wrapper->field_name->value(array('sanitize' => TRUE));

В общем погляди ф-ю entity_metadata_wrapper();

Ответ дан 16.08.2015 - 00:44

Спасибо за отзыв!
С удовольствием пользовался, если бы врапперы умели текущий форматер подключать. :-)
Пока на кастомной функции остановился.

Комментарий оставлен 16.08.2015 - 09:46