Особенности проблема рабочего процесса с удалением поля


Предположим, у меня есть тип контента Person с полями: Name, Age, Email

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

Мой рабочий процесс выглядит следующим образом:

  • Я добавляю новое поле в Person под названием Phone
  • локально я делаю: drush fu test -y
  • Я редактирую test.info, чтобы увеличить номер версии
  • Я фиксирую изменения в своем репозитории
  • Я нажимаю на функция для живого сайта (скопируйте файлы функций)
  • на живом сайте я делаю: drush fr test -y
  • на живом сайте я делаю: drush cc all

Затем новое поле появится на живом сайте Person.

Если на первом шаге я удалю поле Person, поле не будет удалено с живого сайта. Как мне решить эту проблему? Я не хочу вручную удалять его из пользовательского интерфейса на живом сайте.
Верен ли этот рабочий процесс?

 13
Author: kiamlaluno, 2012-04-04

4 answers

Это палка о двух концах, это похоже на то, чтобы предотвратить удаление данных, что всегда хорошо. На самом деле решать нечего, это ожидаемое поведение.

Это тот же рабочий процесс, который мы используем и делаем уже более года, и он работает очень хорошо. Я бы сказал, что это правильно, но это очень субъективный ответ.

 9
Author: digital, 2013-09-05 10:30:45

Правильный способ удалить контент, созданный функциями, - это с помощью hook_update_N (который должен быть реализован в файле your_module.install).


Основная идея функций заключается в управлении конфигурацией с помощью кода. Использование hook_update_N согласуется с этим, поскольку удаление поля выполняется в коде (которым можно управлять с помощью управления версиями), тогда как эквивалентная команда drush field-delete field не вызывается из управляемого кода; это отдельный шаг командной строки, который вам нужно выполнить (и не забыть выполнять).

 10
Author: smokris, 2012-06-12 14:10:10

Создайте новый файл с именем "your_feature_name.install"

Внутри файла объявите hook_update_N, там вы можете использовать field_delete_field() и указать имя поля, которое вы хотите удалить в качестве параметра.

Выполнить update.php и поля будут удалены.

 2
Author: subhojit777, 2012-06-12 08:36:06

Если вы используете 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')) {
  ...
}
 0
Author: jimafisk, 2017-11-02 19:45:43