web-dev-qa-db-ja.com

作成されたフィールドのマシン名を変更するにはどうすればよいですか

私はフィールド名を入力している間にスペースを空けましたが、マシン名は私が望んでいたものではありません。私はそれがただの煩わしさであることを知っています。しかし、フィールドが作成されたら、そのフィールドのマシン名を変更する方法があるかどうか疑問に思っています。

これが私の質問の2番目の部分につながると思います。フィールドを作成し、そのフィールドが使用されなくなった場合、それを削除するにはどうすればよいですか、これはデータベースから実行する必要がありますか、それともUIのどこかで実行できますか。

20
user379468

つまり、マシン名を変更することはできません。理論的には、それは明らかに可能ですが、データベースをいじくり回す必要があります。フィールドを作成したばかりの場合は、フィールドを削除して新しいフィールドを作成する方がはるかに簡単です。

基本はfield_configfield_config_instanceのすべてのエントリの名前を変更することですが、フィールドの使用を開始するとすぐに、マシン名が100の異なる場所に保存されます。 ビュー設定、パネル設定、機能以上、そしてそれまでに、それを変更することはない楽しいです。

フィールドの削除はadmin/structure/types/manage/[machine_name_of_content_type]/fieldsで実行できます。これは、任意のコンテンツタイプの[フィールドの管理]タブからアクセスできます。

16
Letharion

私の手順は、drushを使用してフィールドを最初に複製してから、DBクエリを使用してフィールドデータを新しいフィールドテーブルにコピーすることです。クローンフィールドの内容を確認した後、元のフィールドを削除します。

フィールドを複製する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. UIを使用してフィールドを削除します(例:admin/structure/types/manage/my-content-type/fields
16
keithm

Drupal 7では、 Field Rename モジュールを使用できます。Drupal 6では、 CCK field rename モジュール。

10
uwe

私は実際に新しいフィールドとインスタンスを新しいマシン名で作成し、すべての古いフィールドデータを新しいフィールドにコピーし、最後に古いインスタンスを削除する更新スクリプトを記述しました。

// 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);
6
Елин Й.

私はこれをしなければならなかっただけで、それほど難しくはないことがわかりましたが、私のサイトはかなり単純です。

これを試して:

  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

([NEW MACHNIE NAME]と[OLD MACHINE NAME]をfield_your_field_names

  1. 関連するすべてのビューを更新して、新しいフィールドを使用し、その特定のフィールドを指す他のモジュールを更新します(サイトが複雑な場合、ここで問題が発生する可能性があります)。古いフィールドを使用するすべてのビューをここで確認できます:/admin/reports/fields/views-fields
  2. サイトのキャッシュをクリアする
2
tmsimont

//フィールドストレージテーブル名を変更します。ここでは、古いテーブルの名前を新しい名前に変更しています。

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();
2
sneha surve

上記のDrushフィールドクローンの回答を使用すると、Drushでも最後のMySQLステップを実行できます(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"
1
neubreed

Mysqlをいじりたくない場合は、 drushスクリプト を試すことができます。Fieldvalue copyと呼びます。

最初に新しいフィールドを設定してから呼び出す必要があります

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

これにより、既存のデータが新しいフィールドに移動し、古いフィールドが削除されます。

0
Pontus Nilsson