Как изменить имя машины для поля после его создания?


18

Я набрал интервал, набирая имя поля, и теперь имя машины не соответствует желаемому. Я знаю, это просто раздражение. но мне интересно, есть ли способ изменить имя машины для поля после его создания.

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

Ответы:


15

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

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

Удаление полей можно выполнить в:, admin/structure/types/manage/[machine_name_of_content_type]/fieldsдоступ к которому можно получить на вкладке « Управление полями » любого типа содержимого.


Но поля не остаются в базе данных, например, я создал новое поле с именем popper, однако, когда я иду, чтобы добавить новое поле к типу контента, старое имя поля все еще появляется как опция. Возможно, я не совсем понимаю, как работают поля.
user379468

1
Существует функция, которую я мало изучал, которая удаляет поля и их содержимое с течением времени. Причина состоит в том, чтобы предотвратить остановку сайта при удалении полей с тысячами записей. Если поле нигде не используется, я ожидаю, что оно исчезнет при следующем запуске cron.
Летарион

Я попытался сделать sed -i -es / old_field / new_field / для кода сайта и дампа базы данных. К сожалению, что-то пошло не так, и после восстановления дампа произошел сбой. Есть идеи, как это сделать правильно?
Дмитрий Вял

1
@Dmitry Vyal: имя поля хранится в нескольких местах в сериализованном массиве - замена одной строки другой строкой другой длины нарушит unserialize () массива и, вероятно, сломает следующий загрузчик или Drupal.
Чарли Шлиссер

@Charlie S: Спасибо, позабочусь об этом в будущем.
Дмитрий Вял

16

Моя процедура состоит в том, чтобы сначала использовать drush для клонирования поля, а затем скопировать данные поля с запросами БД в новую таблицу полей. После проверки содержимого клонированного поля я удаляю исходное поле.

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

  1. drush field-clone field_my_field field_my_field_clone
  2. Вставьте строки field_my_field_clone, например, вINSERT field_my_field_clone SELECT * FROM field_my_field;
  3. Проверьте содержание field_my_field_clone.
  4. Удалить поле с помощью пользовательского интерфейса, например, admin/structure/types/manage/my-content-type/fields

1
Это круто! Для D7: INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field; INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field;
Joelpittet

Я не знал, что была команда "клонить в поле"! Круто :)
Lovau

А как насчет видов, панелей и т. Д.? Ручные исправления?
Зкент

если вы используете drush, вы можете удалить это поле, drush field-delete xxxи вам также может понравиться, drush sql-queryкак это предложено neubreed. @zkent, вам придется заново связать новое поле с существующими видами, панелями и т. д.
xaa

10

В Drupal 7 вы можете использовать модуль Field Rename . В Drupal 6 вы можете использовать CCK модуль переименования полей .


1
Теперь есть версия этого модуля для Drupal 7 по адресу drupal.org/project/field_rename
Даррелл Дуэйн,

Оно работает. Просто помните, чтобы длина имени была ниже максимальной.
Франциско Корралес Моралес

6

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

// Set variables
$old_name = 'field_old_name';
$new_name = 'field_new_name';
$entity_type = 'node';
$bundle = 'page';

// Get old field info
$old_field = field_info_field($old_name);

// Create new field
$new_field = $old_field;
$new_field['field_name'] = $new_name;

if (!field_info_field($new_name)) {
  field_create_field($new_field);
}
else {
  field_update_field($new_field);
}

// Get old field instance
$old_instance = field_info_instance($entity_type, $old_name, $bundle);
$new_instance = $old_instance;
$new_instance['field_name'] = $new_name;

if (!field_info_instance($entity_type, $new_name, $bundle)) {
  field_create_instance($new_instance);
}
else {
  field_update_instance($new_instance);
}

// Migrate old fields' data to the new ones
$field_data = db_select('field_data_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($data = $field_data->fetchAssoc()) {
  $data_new = array();
  foreach ($data as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $data_new[$column] = $value;
  }
  db_insert('field_data_' . $new_name)
    ->fields($data_new)
    ->execute();
}

// Migrate old fields' revision data to the new ones
$field_revision = db_select('field_revision_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($revision = $field_revision->fetchAssoc()) {
  $revision_new = array();
  foreach ($revision as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $revision_new[$column] = $value;
  }
  db_insert('field_revision_' . $new_name)
    ->fields($revision_new)
    ->execute();
}

// Delete old instance
field_delete_instance($old_instance);

// Purge fields
field_purge_batch(1000);

2

Я просто должен был сделать это, и нашел, что это не слишком сложно, но мой сайт довольно прост.

Попробуй это:

  1. Создайте новое поле с правильным именем.
  2. Запустите эти запросы в MySQL:
INSERT INTO field_data_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_data_[OLD MACHINE NAME]` cf
INSERT INTO field_revision_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_revision_[OLD MACHINE NAME]` cf

(поменяйте местами [ИМЯ МАШИН] и [ИМЯ СТАРЫХ МАШИН] с помощью field_your_field_names)

  1. Обновите все связанные представления, чтобы использовать новое поле, и любые другие модули, которые указывают на это конкретное поле (в этом случае все может стать уродливым, если ваш сайт сложный). Вы можете увидеть любые виды, которые используют ваше старое поле здесь:/admin/reports/fields/views-fields
  2. Очистить кеш сайта

2

// Изменить имена таблиц хранения полей. Здесь мы меняем имя старой таблицы новым именем.

db_rename_table($data_table_name, 'field_data_' . $new_field_name);
db_rename_table($revision_table_name, 'field_revision_' . $new_field_name);

// Изменить имена полей в таблицах field_config и field_instance_config.

db_update('field_config')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();

db_update('field_config_instance')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();

1

С помощью приведенного выше ответа «drush field-clone» вы также можете выполнить последний шаг MySQL с Drush (пример D7):

drush sql-query "INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field"

drush sql-query "INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field"

0

Если вы не хотите возиться в mysql, вы можете попробовать написанный мной сценарий drush, который называется Field value copy.

Сначала вам нужно будет настроить новое поле, а затем позвонить

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

Это переместит существующие данные в новое поле, как только удалит старое поле.



-3

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


1
Пропустил ваш комментарий, потому что этот подход нанесет ущерб вашей установке Drupal, поскольку в базе данных есть несколько мест, где имена полей сериализованы в PHP. Для получения дополнительной информации об этом см. Комментарии @CharlieS (и других) под принятым ответом выше.
Hargobind
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.