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

Drupal whois

индекс
128,53

Создание CCK-мультиполей

Данный топик является своеобразным ответом на Нетривиальная задача для Node Reference поля Drupal и Модуль для кулинарного сайта. Но, в отличие от авторов тех двух топиков, я не собираюсь изобретать велосипед и писать свое решение, а просто покажу как эта задача будет решаться в недалеком будущем (да и сейчас вобщем-то уже можно), и что станет стандартом де-факто в Drupal. Почему я так уверенно завляю о стандарте? Все очень просто — речь пойдет о CCK (Content Construction Kit) 3.



Вообще говоря, насколько мне известно, группировка нескольких CCK полей в одно мультиполе — это главная причина появления CCK 3. Данная функция является востребованной (мне приходится сталкиваться с ней практически в каждом Drupal-проекте) и каждый раз приходится писать новое CCK-поле (либо переиспользовать наработки), чтобы получить новое поле, состоящее из более простых. А написание CCK-поля — это довольно рутинная задача, на которую уходит не так уж мало времени (в зависимости от сложности конечного поля). После того, как данная задача появилась у меня на горизонте в очередной раз, я решил провести небольшое исследование на эту тему в интернете — ибо задача далеко не уникальная, и сталкиваться с ней должны были многие (одно из доказательств тому — 2 топика на эту тему за последнюю неделю на хабре). После непродолжительного гугления я и наткнулся на CCK 3, который сейчас находится в состоянии dev, а ссылка на скачивание даже не вынесена в список Development releases на странице проекта. Выйти на закачку можно двумя путями — либо посмотреть всю историю релизов в соответствующем разделе, либо со страницы Reports -> Available updates любого друпал-проекта, где установлены модули Update status и Content (базовый модуль CCK).

Но, хватит лирики. Давайте уже сделаем свой кулинарный сайт с преферансом и куртизанками, используя CCK3, а если быть немного точнее — Content Construction Kit (CCK) 6.x-3.x-dev (2010-Jan-26).

В качестве заготовки у нас будет 2 контент-тайпа — Ingredient и Recipe — Ингредиент и Рецепт соответственно. Пока что это 2 контент-тайпа с абсолютно стандартными настройками.



Создадим несколько ингредиентов — пригодятся для дальнейшего тестирования (я просто задал нодам заголовки).



Дальше идем в установку модулей, и включаем то, что нам пригодится — а это Content Multigroup, Node Reference и Text. Установщик модулей сам доставит все, что ему не хватает.



Теперь идем в управление полями контент-тайпа Recipe и добавляем 2 поля, которые будут отвечать за 1 ингрединет — собственно сам ингредиент (Node reference на контент-тайп Ingredient) и количество (тут я просто воспользовался полем Text).



А вот с этого момента и начинается особая Multigroup магия. Добавим к полям рецепта группу Ингредиенты, поля Ингредиент и Количество добавим в эту группу, а тип у группы зададим Multigroup.



Еще, для более удобного отображения именно этого примера, я выставил галку Multiple columns в настройках поля — поля в рамках одного мультиполя будут идти не один под другим, как это обычно бывает, а в 1 строку, что для небольшого количества простых полей (как в нашем случае) удобно.

Наконец-то пришло время создать наш первый рецепт. Описывать что и как думаю не стоит — все и так должно быть понятно на скриншоте:



После сохранения ноды мы увидим нечто следующее:



Пока что не очень красиво, но уже работает =) Поколдуем немного с отображением полей:



И получим довольно таки красивый рецепт:



Вот, в общем-то, и все, что я собирался рассказать о новой фиче CCK3. Остается добавить только одно — модуль находится в состоянии dev, и использование его на продакшн не рекомендуется авторами модуля. Хотя, если верить статистике, модуль уже используется на 6.5к+ сайтах, у которых включена функция автоматической проверки состояния модулей, и не факт, что все они живут исключительно для ознакомителения =)

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

  • Content Multigroup есть и для cck2
    • Если вы про него, то
      To be deleted. To get Content Multigroup, go to the CCK project page, and wait for CCK3.

      И доступных релизов у модуля нет.
      • Если честно, не знаю откуда он у меня
        ; $Id: content_multigroup.info,v 1.1 2009/11/25 14:10:06 ndeschildre Exp $
        THIS MODULE IS STILL EXPERIMENTAL AND NOT READY FOR PRODUCTION!

        Но работает неплохо в принципе
        • Ну достать модуль не так уж и сложно — например из CVS.
          Я имелл ввиду что нет именно релизов, хотя бы dev.

          К тому же, вероятно, релиз был, но его убрали, и вывесили объявление о том что модуль будет удален.
  • Вот это здорово! Немогли бы вы переложить куда-нибудь картинки в более удобное место? А превью уж больно мелкое, а когда нажимаешь, там тоже не фулсайх картинка :(
    • Например куда?
      Раньше я все складывал на удобный во всех отношениях ipicture.ru — можете посмотреть что стало с моими статьям.
      Теперь все складываю на imageshack и надеюсь что он не отправится вслед за ипикчером.
      • На fastpic хотя бы.
      • pict.com, tinypic.com
    • Там можно изменить масштаб, достаточно кликнуть на значок с увеличительным стеклом под изображением.
      • Полноразмерную картинку там можно увидеть, кликнув и по миниатюре — но это два лишних клика на каждую картинку, а картинок тут много. И оба клика по миниатюре — сначала мелкой тут, потом средней там — норовят открыться прямо в текущем окне, доставляя ожидания при переходах назад.

        Вот если здесь вставить картинки-миниатюры средние, и ссылки с них сделать в новое окно и сразу на картинки большие — это будет на порядок удобнее для восприятия. А если с картинок пообрезать совершенно неинформативные поля — может быть их и вовсе увеличивать не придётся.
  • Спасибо за статью.
  • Спасибо. Скоро серьезно возьмусь за Друпал. Ибо ту задачу которую передо мной поставили, wordpress не осилит :)
  • Можно включить модуль Devel и копипастом опубликовать что он пишет по запросам когда добавляем такой материал и отображаем. Любопытно.
  • Отличная статья, надо поэксперементировать. Подобные задачи встречаются действительно очень часто
  • давно на эту возможность смотрю, но побаиваюсь использовать на продакшне — вдруг какие-то резкие изменения схемы будут. И, насколько читал, в Д7 эти мультигруп могут не очень легко переноситься.

    Вы ближе к теме — поправьте, если не прав и апдейт обещает быть гладким.
    • Про Д7 думать пока еще рано, да и перенос крупных проектов на новые версии (Д4-Д5, Д5-Д6 и т.д.) это отдельная тема.

      Но лично я собираюсь на новом проекте попробовать ССК 3 в действии. Посмотрел сейчас дифом отличия 3 от 2 — все они связаны с поддержкой мультиполей и фичей, связаной с удалением значений в полях с несколькими значениями. Причем попробую в первй же итерации, чтобы тестер (а он у нас хороший =)) мог тут же все прокликать и не поздно было откатиться до ццк2.
      • Я бы все же побоялся тащить в продакшн модуль, у которого дажа альфа релиза не было. Но раз так хочется экстрима, почему бы тогда не использовать сразу Д7 альфа где CCK почти полностью были внесены в ядро?
        • Я думал об этом, но для Д7 нет многих нужных мне модулей =)
          Да и не в первой нам пользоваться дев версиями модулей — к моменту релиза проекта, глядишь, и модуль зарелизиться, возмжно и не без нашей помощи — патчи штука удобная =)
  • Ох, как же мне не нравится создание отдельной ноды под название ингридиента.
    Неужели по другому нельзя?
    • Это всего лишь пример.
  • Мне надо было как-то множественное поле составное. Без всяких сложностей и связей, просто «название — единицы измерения — цена». Очень удивился когда не нашел решения. Давненько было, но и сейчас едва ли найду. Хотя живой пример перед глазами — тот же imagefield… Никто не наталкивался на менее experimantal решения?
    • Менее experimental — это написать ссвое поле, которое будет использовать несколько более простых полей.
    • Тоже мучаюсь с этой же проблемой, ставить CCK3 боюсь т.к. возможно полетит всё остальное, что на CCK2 пока чудесным образом работает ;) Получилось найти какое-нибудь готовое решение? А то руками это с нуля писать как-то не айс… ;(
      • Нет, да я больше и не искал. krig прав, оптимально будет сделать самому. За образец можно взять, скажем, составное cck «поле» из модуля Location. Там и управление вводом-выводом есть — какие «запчасти» использовать, а какие нет. Можно сделать дjвольно универсальное решение.
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.