フィールド名を入力している間、スペースを空けましたが、マシン名は望んでいたものではありません。私はそれが単に迷惑であることを知っています。しかし、作成されたフィールドのマシン名を変更する方法があるかどうか疑問に思っています。
これが私の質問の第二の部分に私を導くと思います。フィールドを作成し、それが使用されなくなった場合、それを削除するにはどうすればよいですか、データベースからこれを行う必要がありますか、UIのどこかで行うことができますか?
フィールド名を入力している間、スペースを空けましたが、マシン名は望んでいたものではありません。私はそれが単に迷惑であることを知っています。しかし、作成されたフィールドのマシン名を変更する方法があるかどうか疑問に思っています。
これが私の質問の第二の部分に私を導くと思います。フィールドを作成し、それが使用されなくなった場合、それを削除するにはどうすればよいですか、データベースからこれを行う必要がありますか、UIのどこかで行うことができますか?
回答:
つまり、マシン名を変更することはできません。理論的には明らかに可能ですが、データベースをかなりいじる必要があります。フィールドを作成したばかりの場合は、フィールドを削除して新しいフィールドを作成する方がはるかに簡単です。
基本的には上のすべてのエントリの名前を変更することであろうfield_config
とfield_config_instance
、しかし、すぐにあなたがフィールドを使用して起動すると、マシン名は百異なる場所に保存されているのを取得します。ビューの構成、パネルの構成、機能など、そしてそれまでに変更するのは楽しいことではありません。
フィールドの削除はadmin/structure/types/manage/[machine_name_of_content_type]/fields
、次の場所で実行できます。コンテンツタイプの[フィールドの管理 ]タブからアクセスできます。
私の手順は、drushを使用して最初にフィールドのクローンを作成し、次にDBクエリでフィールドデータを新しいフィールドテーブルにコピーすることです。クローンフィールドの内容を確認した後、元のフィールドを削除します。
私はこの方法でフィールドを複製するので、私は自分で作成するクローンコードと同じくらい信頼性が高く、データコピークエリは非常に簡単で、元のフィールドを削除する前に新しいフィールドを確認できるため、 。
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
drush field-delete xxx
できますdrush sql-query
。また、neubreedで提案されているように好きなこともできます。@zkent、既存のビュー、パネルなどの新しいフィールドを再リンクする必要があります。
Drupal 7では、フィールド名変更モジュールを使用できます。Drupal 6では、CCKフィールド名前変更モジュールを使用できます。
実際に新しいマシン名で新しいフィールドとインスタンスを作成し、すべての古いフィールドデータを新しいものにコピーし、最後に古いインスタンスを削除する更新スクリプトを作成しました。
// 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
([新しいマシン名]と[古いマシン名]をで入れ替えます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();
db_change_field()関数は、あなたを助けるかもしれません。