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


18

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

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

回答:


15

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

基本的には上のすべてのエントリの名前を変更することであろうfield_configfield_config_instance、しかし、すぐにあなたがフィールドを使用して起動すると、マシン名は百異なる場所に保存されているのを取得します。ビューの構成パネルの構成機能など、そしてそれまでに変更するのは楽しいことではありません

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


ただし、フィールドがデータベースに残ったままにならないようにします。たとえば、ポッパー名で新しいフィールドを作成しましたが、コンテンツタイプに新しいフィールドを追加しようとすると、古いフィールド名がオプションとして表示されます。おそらく、フィールドがどのように機能するかを正確に理解していないのかもしれません。
ユーザー379468

1
時間の経過とともにフィールドとそのコンテンツを削除する機能については、あまり詳しく調査していません。その理由は、数千のエントリがあるフィールドを削除するときに、サイトが停止するのを防ぐためです。フィールドがどこでも使用されていない場合、次回のcron実行で消えることが予想されます。
レサリオン

サイトコードとデータベースダンプでsed -i -es / old_field / new_field /を実行しようとしました。残念なことに、何かがうまくいかず、ダンプ復元サイトが誤動作していた。それを正しい方法で行う方法はありますか?
ドミトリーヴィール

1
@Dmitry Vyal:フィールド名はシリアル化された配列のいくつかの場所に保存されます。ある文字列を異なる長さの別の文字列に置き換えると、配列のunserialize()が壊れ、おそらく次のブートストラップまたはDrupalが壊れます。
チャーリーシュリーザー

@チャーリーS:ありがとう、将来はそれを大事にしてくれます。
ドミトリーヴィール

16

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

私はこの方法でフィールドを複製するので、私は自分で作成するクローンコードと同じくらい信頼性が高く、データコピークエリは非常に簡単で、元のフィールドを削除する前に新しいフィールドを確認できるため、 。

  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

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

「drush field-clone」コマンドがあることは知りませんでした!素晴らしい:)
ロヴァウ

ビュー、パネルなどはどうですか?手動修正?
zkent

ブラシを使用している場合は、フィールドを直接削除 drush field-delete xxxできますdrush sql-query。また、neubreedで提案されているように好きなこともできます。@zkent、既存のビュー、パネルなどの新しいフィールドを再リンクする必要があります。
xaa15年


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の回答を使用すると、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"

0

mysqlをいじりたくない場合は、Field value copyと呼ばれる筆者が書いたブラシスクリプトを試すことができます。

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

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

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



-3

データベースのSQLファイルをエクスポートし、コマンドラインsedを使用して、出現するすべての用語を置き換えて変更し、データベースを再インポートします。


1
データベースにフィールド名がPHPでシリアル化されている場所がいくつかあるため、このアプローチはDrupalのインストールに大損害を与えるため、コメントを下げました。この詳細については、上記の承認済みの回答の下にある@CharlieS(およびその他)のコメントを参照してください。
ハルゴビンド14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.