Особенности проблема рабочего процесса с удалением поля
Предположим, у меня есть тип контента Person
с полями: Name
, Age
, Email
Этот тип контента управляется функцией под названием test
, поэтому я могу управлять его исходным кодом и отправлять его на живой сайт.
Мой рабочий процесс выглядит следующим образом:
- Я добавляю новое поле в
Person
под названиемPhone
- локально я делаю:
drush fu test -y
- Я редактирую
test.info
, чтобы увеличить номер версии - Я фиксирую изменения в своем репозитории
- Я нажимаю на функция для живого сайта (скопируйте файлы функций)
- на живом сайте я делаю:
drush fr test -y
- на живом сайте я делаю:
drush cc all
Затем новое поле появится на живом сайте Person
.
Если на первом шаге я удалю поле Person
, поле не будет удалено с живого сайта. Как мне решить эту проблему? Я не хочу вручную удалять его из пользовательского интерфейса на живом сайте.
Верен ли этот рабочий процесс?
4 answers
Это палка о двух концах, это похоже на то, чтобы предотвратить удаление данных, что всегда хорошо. На самом деле решать нечего, это ожидаемое поведение.
Это тот же рабочий процесс, который мы используем и делаем уже более года, и он работает очень хорошо. Я бы сказал, что это правильно, но это очень субъективный ответ.
Правильный способ удалить контент, созданный функциями, - это с помощью hook_update_N (который должен быть реализован в файле your_module.install
).
Основная идея функций заключается в управлении конфигурацией с помощью кода. Использование hook_update_N
согласуется с этим, поскольку удаление поля выполняется в коде (которым можно управлять с помощью управления версиями), тогда как эквивалентная команда drush field-delete field
не вызывается из управляемого кода; это отдельный шаг командной строки, который вам нужно выполнить (и не забыть выполнять).
Создайте новый файл с именем "your_feature_name.install"
Внутри файла объявите hook_update_N, там вы можете использовать field_delete_field() и указать имя поля, которое вы хотите удалить в качестве параметра.
Выполнить update.php и поля будут удалены.
Если вы используете field_phone
в других областях, вы можете просто удалить его из своего личного типа контента, но не удалять его полностью со своего сайта. Вручную создайте файл YOUR_FEATURE_NAME.install
в папке вашего компонента следующим образом:
/**
* Implements hook_update_N().
*
* Removes field_phone from Person content type.
*/
function YOUR_FEATURE_NAME_update_7001() {
if ($instance = field_info_instance('node', 'field_phone', 'person')) {
field_delete_instance($instance);
}
field_purge_batch(500);
features_revert_module('YOUR_FEATURE_NAME');
}
Если бы вы удаляли это из абзаца Person вместо типа контента Person, вы могли бы изменить первый условный оператор на что-то вроде этого:
if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
...
}