Как воссоздать типы контента с помощью модуля функций, который удаляет удаленные поля?


Я изучал модуль Функции , чтобы перенести изменения с разработки на промежуточную стадию, не переделывая все.

На своем сайте разработчиков я внес изменения в типы контента (добавил новые поля, удалил некоторые поля). Затем я экспортировал все типы контента как функцию и импортировал в промежуточную среду. Но все равно я вижу удаленные поля при постановке.

Я думал удалить все типы контента на промежуточной стадии и включить модуль, экспортируемый функцией, но удаления нет опция в типах контента.

Правильно ли я это делаю?

enter image description here enter image description here

 3
Author: Pierre.Vriens, 2015-12-06

4 answers

Ответ на ваш вопрос сводится к тому, что упоминается сопровождающим функций в этом комментарии , т.Е.:

Наконец-то я отмечу это как "не исправлю", пока кто-нибудь не предложит что-нибудь получше.

1) Функции никогда не будут делать ничего, что могло бы привести к потере контента на вашем сайте. Это включает в себя удаление полей. То, что вы удалили поле из функции, не означает, что у вас может не сохраниться содержимое, которое было бы потеряно, если функции автоматически удаляют его. Я никогда не был сторонником какого-либо автоматического удаления.

2) Теперь, когда поля разделены на базы и экземпляры, это становится еще более сложным.

Следующий комментарий в том же выпуске содержит ссылку на процесс из 32 шагов, в котором описывается Удаление поля Drupal, сохраненного в функциях. ИМХО, сегодня это "настолько хорошо, насколько это возможно" (и я рекомендовал обойти это до дальнейшего уведомления).

 2
Author: Pierre.Vriens, 2015-12-06 19:48:22

Правильный способ развертывания изменений в среде, включая операции удаления, может быть достигнут с помощью команды drush или hook_update() в рамках вашего развертывания, поскольку автоматическое удаление любого содержимого модулем функций невозможно избежать потери содержимого (что является последним, что вы хотите сделать в своей рабочей среде). Видишь: #649298 для получения более подробной информации.

Обновление Hook_update

Вот пример использования hook_update():

/** 
 * Deletes fields.
 */
function MYMODULE_update_7001() {
  $fields = array(
    'field_foo',
    'field_bar',
  );
  foreach($fields as $field) {
    if (field_info_field($field)) { 
      field_delete_field($field);
      field_purge_batch(10);
      drupal_is_cli() ? drush_log("Deleting field $field", "ok") : NULL;
    };
  }
}
?>

Или этот опубликовано в GH gist от insparrow:

<?php
/**
 * Remove a shared field from a content type.
 */
function custom_module_update_7027() {

  // Fetch instance info.
  $entity_type = drush_field_get_entity_from_bundle('custom_content_type');
  $instance = field_info_instance($entity_type, 'field_to_remove', 'custom_content_type');

  // Mark field for deletion.
  field_delete_instance($instance);

  // Remove field marked for deletion.
  field_purge_batch(10);

  watchdog('custom_module', 'Removed field_to_remove instance from custom_content_type', array(), WATCHDOG_INFO);
}
  • field_delete_field

    Помечает поле, его экземпляры и данные для удаления.

  • field_purge_batch

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

Драш

Используйте drush, который может быть вызван как часть процесса развертывания и его field-delete команда.

Например:

drush field-delete field_name

Для удаления поля и его экземпляров.

Чтобы удалить только экземпляр, прикрепленный к определенному пакету, попробуйте:

field-delete field_name --bundle=bundle

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

Вот пример код, опубликованный Chi:

<?php

/**
 * @file
 * Drush command to find all abandoned fields.
 *
 * @see http://drupal.org/node/649298
 */

/**
 * Implements hook_drush_command().
 */
function abandoned_fields_drush_command() {

  $items['abandoned-fields'] = array(
    'description' => 'Find all abandoned fields',
    'drupal dependencies' => array('features'),
    'aliases' => array('af'),
  );

  return $items;
}

/**
 * Drush command callback;
 */
function drush_abandoned_fields() {
  module_load_include('inc', 'features', 'features.export');

  $commited_fields = array();
  foreach (features_get_default('field') as $id => $field) {
    if (!in_array($field['field_config']['field_name'], $commited_fields)) {
      $commited_fields[] = $field['field_config']['field_name'];
    }
  }

  $rows[] = array('Field name', 'Location');
  $rows[] = array('-------------', '----------');
  foreach (field_info_fields() as $field_name => $field) {
    if (!in_array($field_name, $commited_fields)) {
      $bundle_strs = array();
      foreach ($field['bundles'] as $entity_type => $bundles) {
        $bundle_strs[] = $entity_type . ' (' . implode(',', $bundles) . ')';
      }
      $rows[]= array(
        $field_name,
        implode(' ', $bundle_strs),
      );
    }
  }
  drush_print_table($rows);
}

Для получения более подробной информации вы можете прочитать Удаление поля Drupal, сохраненного в функциях.

 1
Author: kenorb, 2016-03-11 17:34:40

Итак, на этапе подготовки вы обновили папку/файлы функций пользовательского типа контента и сделали drush fr machine_name_of_your_content_type_feature -y правильно? Это предполагает, что на вашем промежуточном сайте уже установлена функция пользовательского типа контента.

drush fr следует применить все новые изменения из кода в базу данных вашего промежуточного сайта.

Также, если вы удаляете поля на промежуточном сайте, может потребоваться дважды проверить, нужно ли вручную удалять поле с помощью hook_upadte_n. Пример и обсуждение можно найти здесь https://www.drupal.org/node/649298#comment-10219951 . Он также может быть основой для кода, который вы хотите выполнить.

 0
Author: Leolando Tan, 2015-12-06 16:22:12

Вы можете попробовать Функции модуля очистки песочницы ( GH fork) в качестве дополнения к функциям, которые могут выполнять очистку полей, словарей, узлов панелей, мини-панелей и стилей изображений, которые находятся в базе данных, но не в каком-либо включенном модуле функций.

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

Этот модуль разделен на две разные задачи:

  • Устранение переопределений

    У вас появится новая опция Разрешить все переопределения в нижней части экрана обзора функции, которая попытается очистить все переопределения, удалив существующие компоненты базы данных (в основном поля). После этого он вернет эту функцию.

  • Удалите существующие компоненты, которых нет ни в каких функциях модули

    Сюда входят: типы контента, мини-панели, панели узлов, словари таксономии, стили изображений и т.д.

    Перед этим вам необходимо включить все функции, с которыми вы хотите сравнить. Затем нажмите Очистка функций на экране со списком функций.

Этот модуль также имеет интеграцию с drush и предоставляет следующие команды:

  • drush fca/drush features-cleanup-all

    Удаляет все типы контента, страницы панелей, мини-панели, словари и стили изображений из базы данных на основе существующих включенных функций и запустите features-revert-all после этого. Это полезно включить в процесс развертывания перед резервным копированием базы данных.

  • drush fcf/drush features-cleanup-feature [feature name] [component list]

    Пытается разрешить все переопределения в одном функциональном модуле. Запустите функции - вернитесь после этого.

 0
Author: kenorb, 2016-03-14 11:48:57