Укажите шаблон для узлов, на которые имеются ссылки


Мне было интересно, как указать конкретный шаблон для визуализации узла, когда на него ссылаются из другого типа контента.

Например, у меня есть тип контента (продукт), и я использую шаблон node--product.tpl.php для визуализации узлов этого типа. Затем у меня есть тип контента с именем container, в котором есть поле node reference, которое может быть связано с рядом узлов product.
Я хотел бы использовать другой шаблон при отображении product, когда на продукт ссылаются из container тип контента.

Я только что установил модуль theme developer и проверил предложенные шаблоны, затем я создал новый шаблон с именем node-reference--product.tpl.php в той же папке, что и node--product.tpl.php, но этот файл используется только в том случае, если node--product.tpl.php удален.

Я предполагаю, что одним из подходов было бы использовать какой-то крючок theme_preprocess и загрузить узел на основе значения arg(1), а затем проверить, является ли тип container, и если это так, добавьте предложение шаблона в параметр $variables.

Author: Cyclonecode, 2012-02-20

2 answers

Самое простое, что вы можете сделать, это предоставить новый "Режим просмотра" для узлов, чтобы вы могли использовать его с опцией отображения "Отображаемый узел" для поля ссылки на узел.

Это будет сделано в небольшом пользовательском модуле с использованием hook_entity_info_alter() вот так:

function MYMODULE_entity_info_alter(&$info) {
  $info['node']['view modes']['node_reference_product'] = array(
    'label' => 'Node Reference Product',
    'custom settings' => TRUE
  );
}

После установки модуля у вас появится новый режим просмотра в параметрах формата отображения "Отображаемый узел":

enter image description here

Теперь вы можете просто использовать тот же файл шаблона node--product.tpl.php, что и обычно, и просто протестировать для режима просмотра, чтобы определить, что вы хотите отобразить:

<?php if ($view_mode == 'full') : ?>

  <!-- HTML output for the full view mode -->

<?php elseif ($view_mode == 'teaser') : ?>

  <!-- HTML output for the teaser view mode -->

<?php elseif ($view_mode == 'node_reference_product') : ?>

  <!-- HTML output for your new view mode -->

<?php endif; ?>

Конечно, у вас все еще есть доступ к режиму просмотра в любой функции hook_preprocess_node, поэтому вы можете вместо этого поместить туда свою логику:

function MYTHEME_preprocess_node(&$vars) {
  if ($vars['view_mode'] == 'product_node_reference') {
    $vars['content'] = array('#markup' => 'Some other content');
  }
}

Но, возможно, лучшая часть решения вашей проблемы таким образом заключается в том, что Drupal поддерживает новый режим просмотра в пользовательском интерфейсе, поэтому для каждого типа контента теперь у вас будет новый режим просмотра, для которого вы можете выбрать параметры как обычно:

enter image description here

Точно так же, как стандартный вид full и teaser режимы вы сможете решать, какие поля будут отображаться, а также порядок и формат, в котором они будут отображаться. Вполне возможно, что после написания этого крошечного однофункционального модуля вам не нужно будет писать еще одну строку кода для решения проблемы.

Этот режим просмотра также будет доступен во всей системе для использования, например, в представлениях/панелях и т.д.

 5
Author: Clive, 2012-02-28 00:56:46

Возможно, проще всего создать другой форматировщик полей для ссылки на сущность на узле контейнера. Вместо стандартного "Заголовок(ссылка)" или "Визуализированный узел" вы можете добавить один и оформить его, как бы вы ни оформляли отдельный шаблон узла, который вы пытались создать. Смотрите запись здесь: http://www.computerminds.co.uk/articles/creating-new-field-formatters-drupal-7 . В вашем hook_theme() вы можете указать шаблон вместо функции. Я бы предпочел это создание проверки в theme_preprocess(), так как ею легче манипулировать, если вы хотите изменить ее в будущем.

Я мог бы также проверить модуль Display Suite, если вы еще этого не сделали, который позволит вам перемещать части узла в форме настройки типа контента. Он имеет некоторые сходные функции с панелями, но гораздо более легкий. Это может вообще избавить вас от создания отдельных шаблонов узлов.

 2
Author: acouch, 2012-02-20 15:07:05