Taxonomy + CCK = Taxonomy Fields

Главные вкладки

Аватар пользователя tema tema 18 мая 2007 в 10:03

Модуль Taxonomy Fields

Какая связь между CCK и Taxonomy? Эти модули занимаются разным делом: CCK конструирует типы контента, Taxonomy упорядочивает контент. Полезный и уже привычный функционал. Зачем придумывать еще что-то? Может не стоит умножать сущности?

Оказывается, принцип таксономии удобен не только для группировки материалов, но и для организации структуры материала. Каждому элементу таксономии (некоторые переводят слово 'term' как 'термин', хотя здесь на мой взгляд лучше подойдет слово 'элемент') можно сопоставить список полей из обычного набора CCK. Материал, принадлежащий этому элементу, получит его поля (они будут доступны для заполнения после сохранения материала с новым значением поля таксономии), как если бы вы вручную добавили их для данного типа материала, но изменения коснутся лишь материалов, принадлежащих данному элементу. Изменение положения материала в таксономии может привести к потере данных из утраченных полей, необходимо это учитывать.

При древовидной структуре таксономии элементы-потомки могут наследовать поля предков (фраза попахивает сельским хозяйством :). Можно назначить 'универсальное' поле, значение которого будет постоянным для всех материалов элемента и не будет доступно из формы редактирования материала.

Такой вариант архитектуры данных очень полезен при большом разнообразии контента. Один и тот же тип материала может иметь разный набор полей в зависимости от положения в таксономии. Перемещаясь по таксономии, материал может 'обрастать' новыми данными, добавляя их к уже имеющимся.

Интерфейс модуля плохо подходит для древовидных таксономий, при большом числе элементов и полей становится очень путаным. Предлагаю попробовать мой патч для версии 5.x-1.4-dev и функции для template.php (функцию 'theme_taxonomy_fields_list_output' надо переименовать в '<имя_вашей_темы>_taxonomy_fields_list_output' или 'phptemplate_taxonomy_fields_list_output').

Патч добавляет в массив данных, передаваемых модулем теме, дополнительную информацию об элементе таксономии, не увеличивая число запросов к базе.

Функции темы отображают дерево таксономии и добавляют унаследованные (inherited) поля к таблице элемента.

Планирую добавить к элементам комбо-боксы 'add existing field' и 'add new field', чтобы обойти лишний переход с неудобным диалогом выбора элемента.

Комментарии

Аватар пользователя tema tema 18 мая 2007 в 12:52

я тоже не сразу. требуется серьезная ревизия идеи CCK. область применения практически та же, что и у CCK – то есть неограниченная. кроме статичного набора полей у вас есть несколько дополнительных, иерархически организованных.

Аватар пользователя sas@drupal.org sas@drupal.org 18 мая 2007 в 11:09

А вот конкретный вопрос из теории БД есть сущности и связь между ними один к одному - пример заказ товара и товарные позиции в нем. Вопрос следующий подойдет ли это поле ( о котором Вы пишете) для организации связки подчиенния материала - "товарная строка заказа" -> "заказ" , чтобы потом можно было через views отображать "товарные строки" к конкретному заказу (связь по аргументу) ?

Аватар пользователя Dan Dan 18 мая 2007 в 13:40

То есть это, по сути, как статические данные в классах объектно-ориентированных языков?
То есть один (или несколько) элементов являются общими для всех экземпляров данного класса (данного типа CCK)?
И при его изменении, значение обновляется для всех экземпляров (материалов)?
Так?

Аватар пользователя tema tema 18 мая 2007 в 15:44

каждое поле тоже как бы класс, его экземпляры можно добавлять к типам контента, которые типа тоже класс, экземпляром которого является контент.

если добавить новое поле вручную (admin/content/types), оно возникнет как класс и как его пока единственный экземпляр для редактируемого типа контента. для всех экземпляров данного типа контента (материалов) это поле будет доступно вне зависимости от позиции материала в таксономии.

интересная деталь – настройки виджета (набор зависит от типа поля: widget_type, label, weight, description, ...). они настраиваемы для каждого экземпляра поля отдельно. т.е. если добавить поле руками, внутри этого типа контента его настройки виджета постоянны. они могут быть другими у другого экземпляра поля в другом типе контента.
спасибо автору, что решил нас не пугать: получить в одном материале 2 экземпляра одного поля с разными виджетами мне не удалось – статические поля приоритетнее таксономных.

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

про 'универсальное' поле я уже писал – его значение устанавливается для терма и его потомков (если включить наследование), все материалы терма содержат это поле как константу.

Аватар пользователя kiev1 kiev1 19 мая 2007 в 4:25

как я понял все очень просто - когда надо сделать много разных типов контента но у них есть одинакового типа поля - то что-б не плодить много всего - этот патч позволяет объединять одинаковые поля в одно, а разные выстраиваются в дерево, да? только таксономии при чем?

Аватар пользователя tema tema 19 мая 2007 в 15:32

для того, о чем вы говорите, достаточно просто поставить CCK (а с 6-й версии ничего ставить не надо).

модуль предлагает организовывать типы контента в дерево с различными наборами полей.

патч и функции темы делают этот процесс более наглядным.

Аватар пользователя sas@drupal.org sas@drupal.org 19 мая 2007 в 12:53

Нет использование cck_field разными content встроено, а вот насчет чтобы не плодить вы правы, дело в том, что это следующий уровень абстракции типов Smile

Аватар пользователя aRDee aRDee 26 мая 2007 в 15:04

отличное развитие...
только есть одна ошибка...
когда выбираешь терм к которому нужно добавить поле, select listы словарей выводятся с учетом параметров словарей, т.е. получается если отмечено что должен быть выбран хотяб один термин, то он уже автоматическии выбран при добавлении!!! т.е. поле добавляется еще к термам которые не нужны, приходится удалять вручную

Аватар пользователя 5851998 5851998 19 июня 2008 в 10:02

Попробовал модуль, он не очень вписывается в философию Drupal, по идее должна быть иерархия Типов Материалов, а не приписывание полей Категориям. В любом случае хоть что-то...
И еще хотел резюмировать/спросить работу модуля:

1. Мы должны создать базовый Тип Материала, без добавления в него доп. свойств
2. Мы должны включить этот Тип Материала в Категорию
3. Добавляем свойства уже к иерархии Терминов

Таким образом у нас получается, что Тип Материала, созданного нами лишь номинально присутствует в системе лишь для того, чтобы иметь возможность создавать материал ЛЮБОГО ТИПА из иерархии терминов, так?

Аватар пользователя Tkhorev Tkhorev 24 июля 2009 в 12:35

Вот он высокий порог вхождения: когда даже Drupal-разработчик еле сдерживается, чтобы не сказать "Пиздец!" Smile

Аватар пользователя kiev1 kiev1 28 июля 2009 в 2:19

ну а еще был модуль category кажется который делал нодами все - и таксономии и что-то еще, в общем надо что бы не очень усложнять