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


14

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

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

Мой рабочий процесс выглядит так:

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

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

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


1
Используйте команду drush fu test -y --version-increment для автоматического увеличения номера версии
Mike

Ответы:


9

Это обоюдоострый меч, он предотвращает удаление данных, что всегда хорошо. Там на самом деле ничего не решить, это ожидаемое поведение.

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


А если я действительно хотел удалить поле? Должен ли я посмотреть на обновления хуки? (Я новичок в D7).
Черувим

3
Обновление хуков было бы идеальным, или его вручную удалили.
цифровая

2
Хорошо, я мог бы также сделатьdrush field-delete field
cherouvim

@cherouvim Так что вам придется делать это каждый раз, когда вы воссоздаете функцию?
AlxVallejo

Hook_update_N () в файле .install функции будет работать.
Майк

10

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


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


Почему? Не будет drush field-delete fieldработать хорошо?
Черувим

5
Конечно, это будет работать, и может быть более простым решением. Но основная идея с функциями заключается в управлении конфигурацией с помощью кода. Использование hook_update()согласуется с этим, поскольку удаление поля выполняется в коде (которым можно управлять с помощью контроля версий), тогда как команда drush не вызывается из управляемого кода; это отдельный шаг командной строки, который вам нужно выполнить (и запомнить, чтобы выполнить).
Smokris

В каком файле функции я буду использовать hook_update ()? hook_update () принимает объект узла в качестве параметра, поэтому невозможно предоставить ему объект узла при включении функции.
subhojit777

@ subhojit777: К сожалению, я ссылаюсь на неправильную страницу документации о хуках. Я только что исправил ссылку; пожалуйста, смотрите документы для hook_update_N.
Smokris

@smokris :) Я упомянул этот хук в своем ответе
subhojit777

2

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

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

Запустите update.php, и поля будут удалены.


0

Если вы используете его field_phoneв других областях, вы можете просто удалить его из своего типа контента Person, но не удалять его полностью с вашего сайта. Вручную создайте 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');
}

Если бы вы удаляли это из Персонального абзаца вместо Персонального типа контента, вы могли бы изменить первый условный оператор на что-то вроде этого:

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.