İçerik türüne yeni bir alan ekledikten sonra tüm düğümleri varsayılan alanla güncelleyin


15

Birkaç düğüm içeren mevcut bir içerik türüm var. Az önce varsayılan değeri "kapalı" olan yeni bir boole alanı ekledim.

Ancak, her düğümü yeniden kaydetinceye kadar varsayılan değer ayarlanmaz, bu nedenle yalnızca yeni alanın varsayılan değeri kullandığı düğümleri göstermesi gereken bir görünüm şu anda boştur.

Alan eklenmeden önce oluşturulan mevcut düğümleri bu alanı varsayılan değerine ayarlamak için nasıl güncelleyebilirim?


Bu fantastik videoda belirtildiği gibi Toplu İşlemler ve Kurallar'ı kullanarak bu sorunu
çözdüm

Yeniden kaydetme düğümleri modülü, güncelleme düğümlerini zorlamanıza yardımcı olabilir.
Supriya Rajgopal

Yanıtlar:


9

Ne yazık ki, bunu yapmanın çok basit bir yolu yok (VBO / kuralların yanı sıra), ancak yeni bir alan ekledikten sonra belirli bir düğüm türü için alan değerlerini önceden doldurmam gerektiğinde özel modül yükleme dosyalarımdaki güncelleme işlevlerinde kullandığım kod ( bu durumda, 'sayfa' düğümleri):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

Bu yanıtta bahsedilen başka bir manuel yöntem EntityFieldQuery kullanır ve her düğümü yükler / kaydeder. Daha fazla Drupal-y, ancak çok daha az performans ... (her bir düğüm için tam bir düğüm yükü ve kaydetme işlemi gerektirir!).


Bu çok üzücü
AlxVallejo

Field Defaults modülünü gördünüz mü? dgo.to/field_defaults
orman

Varlık yükleme önbelleğinden etkilenen tüm düğümleri de temizlemeden böyle bir kod çalıştırmak bir hatadır : entity_get_controller('node')->resetCache($nids);- aksi takdirde bir sonraki öğe önbellekten node_load()eski verileri yükleyebilir ve node_save()bu nesnenin herhangi biri eski verileri veritabanına geri yazabilir .
phils

2

En iyi bahis doğrudan MySQl'de. Tablolar şöyle görünecektir:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Onlara bakarsanız oldukça basittir - sorgunun nasıl görüneceğine başlamanız için bana ihtiyacınız var mı yoksa buradan iyi misiniz?


Teşekkürler Mike, hayır bu gerçekten SQL işleyebilir bir sorun değil. Sadece bir 'yeniden kaydetme' seçeneği veya toplu bir işlem olarak sağlanan bir şey olması gerektiğini hissediyorum, aslında bunun için VBO ve Kurallar entegrasyonu bakabilirsiniz düşünüyorum.
DanH

Anladım. Benzer bir konumdayım, başka bir CMS'den Drupal'a yaklaşık 30.000 makale taşıyorum. SQL hızlı ve kirli olduğunda başka bir modül eklemek için nokta görmedim. Belki de tüm düğümleriniz için node_load () işlevini çağıracak bir işlev de yazabilirsiniz.
Mike

0

Sadece aşağıdaki mantığı deneyin. çok daha hızlı ve tüm kanca uygulamalarını geçerek. daha fazla ayrıntı . tüm nid almak ve bu örnek kod ile döngü basit bir doğrudan db_select sorgusu yazabilirsiniz.

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

0

alan değeri ayarlanmamış düğümlerin

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document alanımla ilgili olan ve varlık kimliği düğümü yeniden tanımlayan bir girdi par değeri içeren tablodur

SQL insert kullanarak yaptım ... sözdizimi seçin

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

0

Views Toplu İşlemler modülünü yükleyin ve etkinleştirin ve sayfa görüntüsüyle bir görünüm oluşturun.

Ekle => Toplu işlemler: Görünümdeki İçerik (İçerik) alanı.

başvurmak

resim açıklamasını buraya girin

Varsayılan değeri ayarlamak istediğiniz Alanları seçin.

Görünümü kaydedin ve oluşturduğu sayfaya gidin. Birden fazla sonuç sayfanız varsa, geçerli sayfadaki tüm öğeleri, tüm sayfalardaki tüm öğeleri seçmeyi seçebilir veya tek tek düğümlere karşılık gelen kutuları manuel olarak işaretleyebilirsiniz. Devam etmek için en az bir onay kutusunun işaretlenmesi gerekir.

Şimdi varsayılan değeri ayarlayıp kaydedersiniz.


0

Bu modülle içerik türündeki alanları güncellemenin kolay bir yolunu buldum: Alan Varsayılanları

Ekran görüntüsüne bakın. Mevcut içeriği varsayılan değerlerle güncelleyebilir veya mevcut değerleri koruyabilirsiniz.

D7'de test ettim ve işe yarıyor.

resim açıklamasını buraya girin

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.