Alan oluşturulduktan sonra alanın makine adını nasıl değiştirebilirim?


18

Alan adını yazarken boşluk bıraktım, şimdi makine adı olmasını istediğim şey değil. Bunun sadece bir sıkıntı olduğunu biliyorum. ancak bir kez alan oluşturulduğunda makine adını değiştirmenin bir yolu olup olmadığını merak ediyorum.

Sanırım bu beni sorumun ikinci kısmına götürüyor. bir alan oluşturduysam ve artık kullanılmıyorsa, onu nasıl silebilirim, bunun veritabanından yapılması gerekir mi, yoksa arayüzün herhangi bir yerinde yapılabilir mi?

Yanıtlar:


15

Kısacası, makine adını değiştiremezsiniz. Teorik olarak, açıkça mümkündür, ancak veritabanıyla biraz karışıklık gerektirecektir. Alanı daha yeni oluşturduysanız, kaldırmak ve yeni bir alan oluşturmak çok daha kolaydır.

Temel bilgiler, üzerindeki tüm girişleri yeniden adlandırmak olacaktır field_configve field_config_instanceancak alanı kullanmaya başlar başlamaz, makine adları yüz farklı yerde saklanır. Görüntüleme yapılandırma, Paneller yapılandırma, Özellikler ve daha sonra tarafından, o değişiyor değil eğlenceli.

Alanların silinmesi , herhangi bir içerik türündeki " Alanları yönet " sekmesinden admin/structure/types/manage/[machine_name_of_content_type]/fieldserişebileceğiniz : adresinde yapılabilir .


Ancak alanlar hala veritabanında kalmaz, örneğin, popper adıyla yeni bir alan oluşturdum, ancak bir içerik türüne yeni bir alan eklemeye gittiğimde, eski alan adı hala bir seçenek olarak görünür. Belki de alanların tam olarak nasıl çalıştığını anlamıyorum.
user379468 12:12

1
Çok fazla araştırmadığım, alanları ve içeriklerini zamanla silen bir işlevsellik var. Bunun nedeni, binlerce girişi olan bir alanı silerken bir sitenin durmasını önlemektir. Alan herhangi bir yerde kullanılmazsa, bir sonraki cron koşusunda gitmesini beklerdim.
Letharion

Bir site kodu ve veritabanı dökümü üzerinde bir sed-i -es / old_field / new_field / yapmaya çalıştım. Ne yazık ki, bir şeyler ters gitti ve dökümü restorasyon sahası arızalandıktan sonra. Doğru şekilde nasıl yapılacağı hakkında bir fikrin var mı?
Dmitry Vyal

1
@Dmitry Vyal: Alan adı serileştirilmiş bir dizide birkaç yerde saklanır - bir dizeyi farklı uzunlukta başka bir dizeyle değiştirmek dizinin unserialize () işlevini ve muhtemelen bir sonraki önyükleme veya Drupal'ı bozar.
Charlie Schliesser

@Charlie S: Teşekkürler, gelecekte onunla ilgilenecek.
Dmitry Vyal

16

Benim yordam ilk önce alanı klonlamak için drush kullanmak, daha sonra DB sorguları ile alan verilerini yeni alan tabloya kopyalamak için. Klonlanan alanın içeriğini doğruladıktan sonra, orijinal alanı silerim.

Bu şekilde yapıyorum çünkü alanların klonlama yönteminin her zaman en azından kendim oluşturabileceğim herhangi bir klonlama kodu kadar güvenilir olacağını düşünüyorum, veri kopyalama sorgusu oldukça basit ve orijinali silmeden önce yeni alanı kontrol ediyorum .

  1. drush field-clone field_my_field field_my_field_clone
  2. Satırları field_my_field_clone, örneğin,INSERT field_my_field_clone SELECT * FROM field_my_field;
  3. İçeriğini doğrulayın field_my_field_clone.
  4. Kullanıcı arayüzünü kullanarak alanı silin, ör. admin/structure/types/manage/my-content-type/fields

1
Bu harika! D7 için: INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field; INSERT field_revision_field_my_field_clone SEÇ * FROM field_revision_field_my_field;
joelpittet

Bir "drush field-clone" komutu olduğunu bilmiyordum! Harika :)
Lovau

Görünümler, paneller vb. Manuel düzeltmeler?
zkent

drush kullanıyorsanız, alan ile direclty silebilirsiniz drush field-delete xxxve ayrıca drush sql-queryneubreed tarafından önerilen gibi olabilir . @zkent, mevcut görünümlerde, panellerde vb. yeni alanı yeniden
bağlayacaksınız


6

Aslında yeni makine adı ile yeni bir alan ve örnek oluşturur, tüm eski alan verilerini yenisine kopyalar ve son olarak eski örneği siler bir güncelleme komut dosyası yazdım.

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

Sadece bunu yapmak zorunda kaldım ve çok zor olmadığını gördüm, ancak sitem oldukça basit.

Bunu dene:

  1. Uygun adla yeni bir alan oluşturun.
  2. MySQL'de şu sorguları çalıştırın:
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

([YENİ MACHNIE ADI] ve [ESKİ MAKİNE ADI] ile değiştirin field_your_field_names)

  1. Yeni alanı ve ilgili alanı işaret eden diğer modülleri kullanmak için ilgili görünümleri güncelleyin (siteniz karmaşıksa işler çirkinleşebilir.) Eski alanınızı kullanan tüm görünümleri burada görebilirsiniz:/admin/reports/fields/views-fields
  2. Site önbelleğini temizle

2

// Alan depolama tablosu adlarını değiştirin. Burada eski tablonun adını yeni adla değiştiriyoruz.

db_rename_table($data_table_name, 'field_data_' . $new_field_name);
db_rename_table($revision_table_name, 'field_revision_' . $new_field_name);

// field_config ve field_instance_config tablolarındaki alan adlarını değiştirin.

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

Yukarıdaki drush field-clone yanıtı ile Drush ile de son MySQL adımını yapabilirsiniz (D7 örneği):

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

Eğer mysql içinde uğraşmak istemiyorsanız, Field value copy adında yazdığım bir senaryoyu deneyebilirsiniz .

Önce yeni alanınızı ayarlamanız ve ardından

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

Bu işlem eski verileri sildikten sonra mevcut verileri yeni alana taşıyacaktır.



-3

Veritabanınızın SQL dosyasını verin, seddeğiştirmek için terimin tüm örneklerini değiştirmek için komut satırını kullanın ve veritabanınızı yeniden içe aktarın.


1
Alanınızda PHP'nin serileştirildiği birkaç yer bulunduğundan, bu yaklaşım Drupal kurulumunuzda hasara yol açacağı için yorumunuzu reddetti. Bu konuda daha fazla bilgi için, yukarıdaki kabul edilen cevabın altındaki @CharlieS (ve diğerleri) tarafından yapılan yorumlara bakınız.
hargobind
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.