Drupal

индекс
142,25

Создание 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к+ сайтах, у которых включена функция автоматической проверки состояния модулей, и не факт, что все они живут исключительно для ознакомителения =)
+23
6 февраля 2010, 18:16
30

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

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

И доступных релизов у модуля нет.
0
Anonym #
Если честно, не знаю откуда он у меня
; $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!

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

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

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

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

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

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.