Drupal 7 перенос поля field из одного типа в другой
В Drupal 7 гибкое управление полями достигается за счёт продуманной структуры информации о полях (field) (отличается от структуры CCK в друпал 6, хотя принципы node и taxonomy сохранились). Сохранение полей происходит в базе (да-да) и под каждое поле создаётся как минимум 2 таблицы - об этом чуть ниже.
Добавить поле можно отредактировав (в админке, конечно) соответствующий тип ноды (admin/structure/types). Допустим, требуется добавить поле Страна к определённому типу нод. Машинное имя пусть будет в транслитерации (тут кому как нравится, но в ряде случаев - особенно когда требуется учитывать особенности импортируемых данных с хитрыми названиями - проще использовать транслит нежели перевод). При этом в таблицу prefix_field_config будет добавлена информация о типе данных, которое хранится в боле, в таблицу prefix_field_config_instance -информация о том, к какому типу данных привязано это поле.
Кроме того будут созданы 2 таблицы для хранения данных и ревизий:
prefix_field_revision_field_strana
prefix_field_data_field_strana
Обе таблицы имеют схожую структуру с небольшим отличием - у ревизий поле revision_id NOT NULL
entity_type
bundle
deleted
entity_id
revision_id
language
delta
field_strana_value
field_strana_format
Логика вполне очевидна - для сущности типа entity_type (node, commerce_product, commerce_line_item), у которой bundle (тип контента, тип товара) сохраняем id сущности, id ревизии, язык
Сделаем так, чтобы все поля типа “страна” относились к типу контента hotel. Но торопиться не нужно! Т.к. следует сопоставить старое значение entity_id новому!! Возможно, это будет дополнительное поле контента(?) или связь через термин таксономии или название.. в общем, следует выполнять запрос после обновления соответствия entity_type
UPDATE `sv_field_data_field_strana` set entity_type='node', bundle='hotel'
При этом имеет смысл, если конечно, сопоставление нельзя получить при помощи арифметической функции (new_value = old_value + 5) сохранить сопоставление в отдельную временную таблицу (old_value new_value). Скорее всего, сделать это можно одним несложным запросом - выбрав и сохранив id соответствующих сущностей (новая и старая).
Задача несложная, однако может возникнуть при реорганизации информации на сайте, когда данные потерять (и тем более получить неверные соответствия - путаница с адресами, рейтингами или другими свойствами) ой как неприятно. Поэтому предварительно делаем бэкап. И помним, что вероятность возникновения ошибок при “ручном” изменении базы (напрямую, не средствами CMS) чревато ошибками (например,
drupal - EntityMetadataWrapperException: Unable to get the data property data as the parent data structure is not set)
Метки: drupal
Давно искал эту инфу. Спасибо