Динамические таблицы полей для CakePHP - PullRequest
3 голосов
/ 05 февраля 2012

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

Данные, вводимые в поля, должны быть различных типов, например, текст, валюта и логическое значение, поэтому это будет возможнодобавить суффикс, такой как $, или отобразить изображение для логических значений.Также Поля должны быть назначены на Группы (для разделения их в HTML-наборах полей).Наконец, элемент имеет одно значение для каждого поля.

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

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

  • Item (значение hasMany)
  • Field (принадлежит FieldGroup & FieldType (также имеет значение много ??))
  • FieldGroup (поле hasMany)
  • FieldType (hasMany Field)
  • Value (относится к Item & Field)

, чтобы получить то, что мне нужно?

Часть Iна самом деле не знаю, как это сделать: разрешено иметь только одно значение на элемент, но поскольку модель Item имеет множество значений, их может быть больше одного.

А как мне получить поля с группами и типами для формы в Item?Я пытаюсь получить их с помощью loadModel('Group'); (правильно?), А затем назначить массив $fieldsByGroups = $this->Group->find('all') для шаблонов добавления / редактирования и выполнить foreach($fieldsByGroups) для создания входных данных формы.Это подходящий метод?

Таблица значений имеет 4 поля: id, item_id, field_id, value (LongText, как я видел в структуре таблицы WordPress. Мне не нужноразные таблицы для каждого FieldType, как предлагается в некоторых статьях eav (из которых ни одна не то, что мне нужно)).В основном мне не нужно id, но я думаю, что CakePHP нужен primaryKey и он не может обрабатывать индексы item_id и field_id.

спасибо,

manuel

1 Ответ

1 голос
/ 13 марта 2012

Решение, которое я недавно встроил в поведение, будет использовать модель CustomField для описания дополнительных полей в глобальном масштабе для всей модели или конкретных записей в этой модели. У меня также было бы текстовое поле с именем custom_fields в каждой модели, в которой использовалось поведение, в котором сохранялся бы массив json с данными пользовательских полей.

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

Это было быстрое и простое решение, которое я принял, но если вы делаете это в качестве основной части вашего приложения, вам следует рассмотреть возможность просмотра баз данных No-SQL. Существует хороший источник данных для CakePHP, который работает с MongoDB на http://github.com/ichikaway/cakephp-mongodb

...