Полевых данных в одной таблице не много. для drupal7 - PullRequest
3 голосов
/ 05 октября 2011

Я работаю с коммерческим модулем, чтобы создать интернет-магазин.Я изменяю файл .install для продуктов, чтобы создать тип контента (как мне сказали, это необходимо), и как часть этого типа контента мне нужно создать множество полей.Список будет содержать около 50-60 различных частей информации.

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

Я заметил, что модуль «Адрес», который также используется с коммерцией, создает тип поля, который имеет около 15 различных значений, которые хранятся в одном и том же блоке.Как это возможно?Я заметил, что если я установлю количество элементов, например, до 5, это создаст разные строки.Мне просто нужна таблица со следующим:

ID - значение1 - значение2 - значение3 и т. Д. И т. Д.

Мне также не нужны никакие модули / расширения, так как все это должно быть записано вфайлы.Я также не думаю, что переход на mongoDB (я думаю) - это вариант, так какие у меня варианты в этой ситуации?

1 Ответ

6 голосов
/ 05 октября 2011

Боюсь, это не так, как работает система полей Drupal, one field == one table (ну, на самом деле, 2 таблицы, если вы включите таблицу ревизий для каждого поля).

Модуль адреса использует hook_field_schema() для определения нескольких столбцов для этого конкретного поля (посмотрите address.install, и вы поймете, что я имею в виду).

Так что, если вы хотите поместить все вВ одной таблице вам просто нужно определить свой собственный тип поля (см. модуль примеров *1013*, в частности, field_example, чтобы помочь с этим).

Имейте в виду, что количество столбцоввы определите в hook_field_schema(), что будет статичным после установки модуля, и единственный способ увеличить / уменьшить его - это использовать _update ловушку для вашего пользовательского модуля.

Также, если вы взламываете файлы, включенные в модуль Commerce ... stop! : коммерция все еще находится в зачаточном состоянии, и вам, вероятно, придется обновить ее в ближайшее время ... как только вымы сделали, что изменения в вашем коде пропадут, и естьвелика вероятность того, что ваш сайт будет в несовместимом состоянии.

Весь смысл Drupal в том, что все подключено / обработано так, что оно может быть изменено другими частями системы.В product.install вы ничего не можете изменить, чего нельзя добиться, реализовав ловушку Drupal в другом модуле.

Если вы не уверены, опубликуйте еще один вопрос, подробно описывающий, что вы пытаетесь сделать, непосредственно редактируя файл модуля contrib, и один из гуру Drupal в SO укажет вам правильное направление: -)

РЕДАКТИРОВАТЬ

Просто сказать, что я уже довольно давно работаю с Ubercart в Drupal 7 и считаю его очень и очень хорошим решением.(многие модули, входящие в состав Commerce, все еще находятся в dev / alpha / beta; это не так для модулей, добавленных Ubercart).Возможно, стоит взглянуть.

Дополнительная информация

Я думаю, что у вас есть два варианта, но в любом случае вам нужно создать собственный модуль.( отличный набор инструкций здесь ).

Вариант 1. Создание настраиваемого поля

Если вы новичок в Drupal-кодировании, я бы предположил, что это, вероятно, самый простойспособ выполнить то, что вы хотите, но это все еще не совсем прямо.Возьмите модуль field_example из ссылки на модуль Примеры Drupal выше и посмотрите в файл .install, в частности, функцию field_example_field_schema().Это определяет столбцы, которые будут в таблице для этого поля.Затем взгляните на field_example.module ... почти все функции, которые комментируются с Implements hook_x, - это та, которую вы захотите скопировать в свой модуль и настроить для своих собственных нужд.

Я думаю,это будет проще, потому что Drupal будет обрабатывать создание полей таблицы / формы, чтобы вам не приходилось связываться с базой данных, схемой или API-интерфейсами форм.

Вариант 2. Создание пользовательского модуля

Эта опция предполагает реализацию вашей собственной таблицы (как вы предлагаете в своем комментарии), где первичный ключ будет идентификатором сущности продукта, а также будет содержать все ваши пользовательские столбцы.(Для получения справки см. Документацию API схемы .)

Затем вы реализуете hook_form_alter(), чтобы добавить поля формы, необходимые пользователю для вводаdata, а затем внедрите hook_node_insert() и hook_node_update(), чтобы сохранить эти данные в таблице базы данных.Трудно вдаваться в подробности без написания кода, и это совсем немного кода!

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

...