私はフィールド名を入力している間にスペースを空けましたが、マシン名は私が望んでいたものではありません。私はそれがただの煩わしさであることを知っています。しかし、フィールドが作成されたら、そのフィールドのマシン名を変更する方法があるかどうか疑問に思っています。
これが私の質問の2番目の部分につながると思います。フィールドを作成し、そのフィールドが使用されなくなった場合、それを削除するにはどうすればよいですか、これはデータベースから実行する必要がありますか、それともUIのどこかで実行できますか。
つまり、マシン名を変更することはできません。理論的には、それは明らかに可能ですが、データベースをいじくり回す必要があります。フィールドを作成したばかりの場合は、フィールドを削除して新しいフィールドを作成する方がはるかに簡単です。
基本はfield_config
とfield_config_instance
のすべてのエントリの名前を変更することですが、フィールドの使用を開始するとすぐに、マシン名が100の異なる場所に保存されます。 ビュー設定、パネル設定、機能以上、そしてそれまでに、それを変更することはない楽しいです。
フィールドの削除はadmin/structure/types/manage/[machine_name_of_content_type]/fields
で実行できます。これは、任意のコンテンツタイプの[フィールドの管理]タブからアクセスできます。
私の手順は、drushを使用してフィールドを最初に複製してから、DBクエリを使用してフィールドデータを新しいフィールドテーブルにコピーすることです。クローンフィールドの内容を確認した後、元のフィールドを削除します。
フィールドを複製するDrushメソッドは、自分で作成したすべての複製コードと少なくとも同じくらい信頼できると思うので、この方法で行います。データコピークエリは非常に単純で、元のフィールドを削除する前に新しいフィールドを確認できます。
drush field-clone field_my_field field_my_field_clone
field_my_field_clone
に行を挿入します(例:INSERT field_my_field_clone SELECT * FROM field_my_field;
)field_my_field_clone
の内容を確認します。admin/structure/types/manage/my-content-type/fields
)Drupal 7では、 Field Rename モジュールを使用できます。Drupal 6では、 CCK field rename モジュール。
私は実際に新しいフィールドとインスタンスを新しいマシン名で作成し、すべての古いフィールドデータを新しいフィールドにコピーし、最後に古いインスタンスを削除する更新スクリプトを記述しました。
// 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);
私はこれをしなければならなかっただけで、それほど難しくはないことがわかりましたが、私のサイトはかなり単純です。
これを試して:
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
)
/admin/reports/fields/views-fields
//フィールドストレージテーブル名を変更します。ここでは、古いテーブルの名前を新しい名前に変更しています。
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();
上記の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"
Mysqlをいじりたくない場合は、 drushスクリプト を試すことができます。Fieldvalue copyと呼びます。
最初に新しいフィールドを設定してから呼び出す必要があります
drush fieldcopy OLDFIELDNAME NEWFIELDNAME
これにより、既存のデータが新しいフィールドに移動し、古いフィールドが削除されます。