Як змінити ім'я машини поля, коли воно буде створене


18

Я розставив під час введення назви поля, тепер ім'я машини - це не те, що я хотів, щоб це було. Я знаю, що це просто роздратування. але мені цікаво, чи є спосіб змінити ім’я машини поля, як тільки воно буде створене.

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

Відповіді:


15

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

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

Видалення полів можна здійснити на:, до admin/structure/types/manage/[machine_name_of_content_type]/fieldsякого можна дійти на вкладці " Керування полями " будь-якого типу вмісту.


Але чи не залишаються поля в базі даних, наприклад, я створив нове поле з ім'ям попперу, однак, коли я йду додати нове поле до типу вмісту, стара назва поля все ще з’являється як опція .. Можливо, я не розумію, як саме працюють поля.
користувач379468

1
Є функціональність, яку я багато не досліджував, яка з часом видаляє поля та їх вміст. Причина полягає в тому, щоб запобігти зупинці сайту при видаленні полів з тисячами записів. Якщо поле ніде не використовується, я б очікував, що воно піде в наступний цикл.
Летаріон

Я намагався зробити sed -i -es / old_field / new_field / для скидання коду сайту та бази даних. На жаль, щось пішло не так, і після того, як майданчик відновлення сміття не працював. Будь-які ідеї, як це зробити правильно?
Дмитро Вяль

1
@Dmitry Vyal: Ім'я поля зберігається в декількох місцях в серіалізованому масиві - заміна однієї рядка іншою рядком різної довжини призведе до порушення несеріалізації () масиву і, ймовірно, порушення наступного завантажувального або Drupal.
Чарлі Шліссер

@Charlie S: Спасибі, подбати про це в майбутньому.
Дмитро Вяль

16

Моя процедура полягає в тому, щоб спочатку використовувати кнопову кнопку для клонування поля, а потім скопіювати дані поля із запитами БД у нову таблицю поля. Після перевірки вмісту клонованого поля я видаляю вихідне поле.

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

  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

Я не знав, що є команда "Клун польового клонування"! Дивовижно :)
Ловау

Що з видами, панелями тощо? Виправлення вручну?
zkent

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

10

У Drupal 7 можна використовувати модуль перейменування поля . У Drupal 6 можна використовувати модуль перейменування поля CCK .


1
Зараз версія цього модуля Drupal 7 розміщена за адресою drupal.org/project/field_rename
Darrell Duane

Це працює. Просто пам’ятайте, щоб тримати ім’я під максимальним.
Франциско Корралес Моралес

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_instan_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

За допомогою відповіді «клонування поля» на свердління вище ви можете зробити останній крок 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 fieldcopy OLDFIELDNAME NEWFIELDNAME

Після переміщення існуючих даних у нове поле після видалення старого поля.



-3

Експортуйте файл SQL вашої бази даних, використовуйте командний рядок, sedщоб замінити всі виникнення терміна, щоб змінити, та повторно імпортуйте свою базу даних.


1
Відхиливши свій коментар, оскільки такий підхід спричинить хаос у вашій установці Drupal, оскільки в базі даних є кілька місць, де імена полів PHP серіалізовані. Для отримання додаткової інформації про це, дивіться коментарі від @CharlieS (та інших) під прийнятою відповіддю вище.
hargobind
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.