Найкращий спосіб видалити поле з типу вмісту


21

Який найкращий спосіб видалити поле Drupal 7 із типу вмісту, визначеного через GUI? Я хочу використовувати kuk_update_N, щоб зміни можна було поширити на декілька серверів після запуску update.php. Однак я не можу знайти рішення. db_drop_table () має сенс для мене для визначених на замовлення схем, але не для типу вмісту / поля, визначеного через GUI.


ви створили спеціальний модуль для визначення типу вмісту?
iStryker

iStryker: створив тип вмісту через інтерфейс адміністратора, додав деякі поля, а потім експортував через функцію. Але зараз я хочу видалити одне з цих полів програмно.
любительська бариста

Помічено, що D5 надає функцію content_field_instan_delete () , задокументовану тут і тут , але ця функція недоступна для D7. Також цікаво, що field.install в ядрі D7 використовує для видалення полів: _update_7000_field_delete_instance () - спеціальна "внутрішня" функція, недоступна для використання іншими. Щось таке важливе, як поля, мені здається, що десь має бути доступна "загальнодоступна" функція, і саме це я шукаю.
любительська бариста

Наразі моя "кандидатська" публічна функція - field_delete_instance ().
любительська бариста

Відповіді:


18

Для видалення полів є дві функції api:

  • field_delete_field Видалити все поле (усі екземпляри поля)
  • field_delete_instance Видалити лише екземпляр поля - саме так він додається до сутності.

Якщо ви не хочете повторно використовувати поле, може бути дещо чистішим, щоб видалити все поле замість того, щоб видалити лише його примірник у відповідному типі вмісту. Тільки ви можете бути суддею цього.


2
Працював як шарм. Функція не повертає жодних аргументів, тому при використанні в поєднанні з moll_update_N () я рекомендую зробити сторожовий дог () для реєстрації змін у оновленнях.
любительська бариста

9

Так, field_delete_instance () - це функція для видалення екземплярів поля.

Зауважте, що field_delete_instance()автоматичні дзвінки, field_delete_field()якщо немає інших екземплярів, так field_delete_instance()це, швидше за все, все, що вам потрібно.

_update_7000_field_delete_instance()призначений для основних функцій оновлення. Приклад: x_update_7000()ви використовуєте функцію оновлення field_delete_instance(). Тоді в x_update_7001(), ви змінюєте {field_config}таблицю непослідовно, і field_delete_instance()очевидно, що це потрібно також змінити.

Але тепер x_update_7000()заклик до field_delete_instance()цього призведе до помилки, оскільки таблиця все ще знаходиться в старій структурі. Однак ситуація з внесеними модулями відрізняється, оскільки вони завжди повинні виконуватися після всіх оновлень ядра, і тому потрібно працювати з останньою версією ядра.

Але це шаблон, який ви можете використовувати для власних функцій API, які ви використовуєте в функціях оновлення.

Крім того, ці функції _update не виконують гачок, оскільки результат не передбачуваний (наприклад, через те, що модуль, для якого виконується оновлення, може бути відключений).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.