войти зарегистрироваться

Drupal whois

индекс
128,53

Модуль для кулинарного сайта

Привет %username%,

В ответ на «Нетривиальная задача для Node Reference поля Drupal», решил подпилить для кулинарии один из кастомных модулей.

Для работы модуля предполагается следующая структура материалов сайта:
Тип материала «Рецепт» — основной контент с описанием рецепта
Типы материалов с ингредиентами:
  1. Ингредиент 1 — Материалы сайта с ингредиентами первой группы (Напр. тип материала «Специи»)
  2. Ингредиент 2 — Материалы сайта с ингредиентами второй группы (Напр. тип материала «Фрукты»)
  3. ...
  4. Ингредиент N — Материалы сайта с ингредиентами N группы

Все ингредиенты в выпадающем списке будут разделены по группам. Так что найти их будет просто.

После включения модуля в списке доступных типов полей появится дополнительный тип — «Ingredient».
Модуль позволяет добавлять референсные ссылки на ноды ингредиентов, устанавливать количество продукта и единицы измерения. Поддерживается множественное добавление строк, drag&drop сортировка.

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

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

function theme_recipe_site_formatter_default($element) {
  $fields = $element['#item'];
  $res = '';
  if (!empty($fields)) {
    $item = explode('[nid:', $fields['ingredient_name']);
    $title = trim($item[0]);
    $nid = drupal_substr($item[1], 0, -1);
    $res = l($title, 'node/'. $nid) .' — '. $fields['ingredient_qty'] .($fields['ingredient_unit'] == '<space>' ? '' : ' '. $fields['ingredient_unit']);
  }

  return $res; 
}


В файле темы template.php создаем свою функцию и формируем переменную $res как ссылку на заранее подготовленный views, которому в качестве аргумента передается nid ингредиента. Это позволит получить список всех рецептов, в которых используется данный ингредиент:

function ИМЯТЕМЫ_recipe_site_formatter_default($element) {
  $fields = $element['#item'];
  $res = '';

  if (!empty($fields)) {
    $item = explode('[nid:', $fields['ingredient_name']);
    $title = trim($item[0]);
    $nid = drupal_substr($item[1], 0, -1);
    $res = l($title, 'ПУТЬ_К_ВЬЮС/'. $nid) .' — '. $fields['ingredient_qty'] .($fields['ingredient_unit'] == '<space>' ? '' : ' '. $fields['ingredient_unit']);
  }

  return $res; 
}

Не забываем сбросить кэш.

Собственно, сам модуль

Как это ни странно — работает ;)

Статья для получения инвайта моим другом, пока что не пользователем Хабрахабра.
Если найдутся добрые люди, отправьте ему на serjik.bozhko@gmail.com, пожалуйста, приглашение =).

_________
Текст подготовлен в ХабраРедакторе

комментарии (6)

  • Views — это конечно хорошо(?), но на мой взгляд если уж дело дошло до написания собственного модуля, то лучше сразу реализовать и функционал views для этой задачи.
    • после добавления поля к материалу он будет доступен во views.
      дальше дело фантазии
  • а для какого сайта делалось?
    • именно этот модуль ни для какого.
      исключительно для всех вас ;)
  • Зачем новые велики?
    А как же recipe?
    • только лишь в качестве примера создания мультиполей.
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.