Как стать автором
Обновить

Нетривиальная задача для Node Reference поля Drupal

Время на прочтение2 мин
Количество просмотров985
Одно из самых полезных полей, которое предоставляет CCK модуль — это Node Reference. Задача его тривиальна и понятна — связать контент сайта отношениями, что легко понять на примерах:
  • Компания, у которой в контенте должны быть ссылки на Рабочих
  • Футбольный игрок, со связью на ноду его Статистики

Задача, с которой пришлось столкнутся мне состоит в том, как показывать это поле:

  • Реценты, которые состоят из различных ингридиентов(1 курица, 2 апельсина, 50гр специй)

CCK по умолчанию сам оформляет множественный или одиночный выбор node reference, как список или просто ссылку на соответствующий нод. Задача вывода рецепта предполагает, что рецепт и ингридиент являются нодами.

Соответственно, при рендеринге контента Views`ами мы получим:

Курица по болгарски(Рецепт)

  1. Курица(Ингридиент)
  2. Апельсин(Ингридиент)
  3. Специи(Ингридиент)

Вместо:

Курица по болгарски(Рецепт)

  1. 1 курица(Ингридиент)
  2. 2 апельсин(Ингридиент)
  3. 50гр специй(Ингридиент)

Решение данной задачи к сожалению на Google и Drupal.org я не нашел, а потому пришлось выкручиваться, и получилось это довольно просто и красиво.

Для ноды Продукта добавляем еще одно мультиполе Текст, которое в Fields вьюхи ставим после Node Reference.

А в темплейте views-view-fields.tpl.php (или конкретной вьюхи как Вам нужно) пишем магию:

<?php
$nids = array();
?>
<?php foreach ($fields as $id => $field): ?>
<?php
if($id == 'field_product_nid') {
$nids = array_shift($field->handler->field_values);
continue;
}

if($id == 'field_product_title_value') {
$items = array();
$index = 0;
$titles = array_shift($field->handler->field_values);
foreach($titles as $title) {
$items[] = l($title['value'], 'node/' . $nids[$index++]['nid']);
}
// TODO: theming here
$field->content = theme('item_list', $items);
}
?>
<?php if (!empty($field->separator)): ?>
<?php print $field->separator; ?>
<?php endif; ?>

<<?php print $field->inline_html;?> class="views-field-<?php print $field->class; ?>">
<?php if ($field->label): ?>
<?php print $field->label; ?>:

<?php endif; ?>
<?php
// $field->element_type is either SPAN or DIV depending upon whether or not
// the field is a 'block' element type or 'inline' element type.
?>
<<?php print $field->element_type; ?> class="field-content"><?php print $field->content; ?></<?php print $field->element_type; ?>>
</<?php print $field->inline_html;?>>
<?php endforeach; ?>


Это позволит отрендерить вьюху подменяя титл поля Node Reference. Есть ли у Вас решение для данной задачи?
Теги:
Хабы:
Всего голосов 20: ↑2 и ↓18-16
Комментарии12

Публикации

Ближайшие события