3000+ düğüm için giriş biçimini değiştirme


18

Giriş biçimlerini değiştirmesi gereken çok sayıda düğümüm var - bunu elle yapabilirdim, ancak Noel 2014'ten önce yapılmayacağım.

Drupal bu bilgiyi nerede saklıyor? Bir SQL sorgusu ile giriş biçimini bir saniyede nasıl değiştirebilirim?

Yanıtlar:


20

Bu yanıtı, özellikle formatı daha yumuşak bir filtre kümesine değiştiriyorsanız, bu en-masse yapmanın potansiyel bir güvenlik riski sunduğunu söyleyerek ön yazacağım. Metin biçimleri, kaydetme sırasında değil görüntüleme sırasında alan çıktısını değiştirir. Bu nedenle, örneğin, filtreyi yanlışlıkla veya kasıtlı olarak Tam HTML veya PHP koduna ayarlarsanız, bir alana gönderilen daha önce kaçan HTML veya PHP düz bir şekilde oluşturulur / çalıştırılır.

Bu nedenle, bir metin biçimini değiştirdiğinizde Drupal mevcut tüm düğümleri otomatik olarak güncellemez. Benzer senaryolarda metin biçimlerinin davranışı hala açık bir konudur .

Yine: dikkat edin, ejderhalar var.

Bunu dedi, her bir alan adında bir sütun olarak metni depolayan field_foo_format, field_fooalanın makine adıdır. Tablolardaki field_revision_field_foove sütununu güncellemeniz gerekir field_data_field_foo.

Sütun değeri format, filter_formattablodaki sütun olarak tanımlanan bir makine adıdır . Yani, tüm alanların güncellenmesi aşağıdaki gibi bir sorgu ile ilgilidir:

UPDATE field_revision_foo SET field_foo_format = 'new_format';
UPDATE field_data_foo SET field_foo_format = 'new_format';

değişmesi gereken her alan için.

new_formatBurada değeri belirleyebilirsiniz : http://YOURSITE.com/admin/config/content/formats - bağlantıyı yapılandırın - URL'deki bağlantı numarası veya dize new_format.güncelleme sonrasında Açık önbelleğinizdir.


1
İyi cevap. Ayrıca tablolarda ve tablolarda field_cache_clear();değişiklik yaptıktan sonrafield_data_...field_revision_...
milkovsky

4

Belirli türdeki tüm düğümler için bir döngü yaparak bu şekilde deneyin:

$node = node_load(nid);
$node->body[$node->language][0]['format'] = 'full_html'; // plain_text
node_save($node);

1

Morten'in burada yaptığıla aynı durumdaydı, görünüşte giriş formatlarını bitirmeyen bir D6 => D7 yükseltmesi.

Burada verilen yanıtlardan daha sert bir yaklaşım benimsedi ve DB şemasından geçen ve 'format' dizesini içeren tüm sütunları güncelleyen, D6 format değerlerini (1, 2, 3) D7 makine adlarıyla ( filtered_html, full_html, plain_text).

https://gist.github.com/xurizaemon/9824872

Haritalamasını desteklemek için sabit kodlanmış

1 => filtered_html, 
2 => full_html,
3 => plain_text,

Ayrıca 'format' adlı alanları yeniden yazmayı deneyebilirsiniz (örn. "Date_format", ancak '2' değerine sahip bir tarih biçiminiz varsa, bu sizin sorununuzdur).


1

Benim için aşağıdakiler işe yaradı:

update `field_revision_body` set `body_format` = 'new_body_forma' WHERE `bundle` = 'node_type'
update `field_data_body` set `body_format` = 'new_body_forma' WHERE `bundle` = 'node_type'

Elbette new_body_forma ve node_type değerlerini değiştirmelisiniz


Bu bir cazibe gibi çalıştı, ama etkisini görmek için önbellekleri temizlemek zorunda kaldı. Teşekkür ederim.
shasi kanth

0

Entity.module yüklüyse aşağıdaki kodu kullanabilirsiniz.

// I'm using node_save($node); 
$wrapper = entity_metadata_wrapper('node', $node->nid); 
$wrapper->body->set(array('value' => body_text, 'format'=>'full_html'));

0

Muhtemelen veriler üzerinde bazı kayıt veya kontroller yapmak için hangi alanların güncellenmesi gerektiğini bilmek isteyeceksiniz. Bunu yapmak için, sütun içeren tüm tablo ve sütun adlarını alın _format:

select distinct TABLE_NAME, column_name
from information_schema.columns
where TABLE_SCHEMA = 'my_drupal_database_name' and column_name like '%_format';

Bu verilerle donatılmış olarak, bu değerlerden ayrı sorgular oluşturabilirsiniz. Önce çıkışı kontrol edin; içerik / düzeltmelerle ilgili olmayan bazı girişleri kaldırmanız gerekebilir. Sorguları oluşturmak için normal ifade özellikli bir düzenleyici kullanmanızı öneririm. Verileri büyük bir select [...] unionifadeye çevirdim ve ardından güncelleme sorgularını ona karşı çalıştırdım.

Bu yaklaşımı kullanmak, binlerce düğümü / düzeltmeyi güncellemem gerektiğinde oldukça zaman kazandım. Alan önbelleğini temizlemeyi unutmayın (kapsam dahil DEĞİLDİR drush cc all!):

field_cache_clear();

Veya acele ile:

drush sqlq "truncate table cache_field;"

Ayrıca metin filtresini kaldırma

Ayrıca bir metin filtresini kullanımdan kaldırıyorsanız, daha sonra onu kullanan alanları olan CT'ler için varsayılan metin biçimini değiştirmeniz gerekir. Bunu yapmazsanız, kullanıcılarınız, alanlarını kullanan alanlarda izin reddedilen iletiler alır old_format. Suçluları bulmak için bu sorguyu yaptım:

select * from field_config_instance where `data` LIKE '%old_format%';

Değişiklikleri yapmak için, her alan ayarları sayfasını ziyaret etmek ve Kaydet'e basmak için arayüzü kullanmayı daha kolay buldum (veriler longblob olarak saklanır ve daha iyi formatlar modül veri enjeksiyonları nedeniyle arama ve değiştirme yapmak için uygun değildi). Metin işleme ayarlanmış alanlar bile Plain textold_format! Metin işleme ayarlanmış alanlar için Filtered text (user selects text format), ek olarak yeni bir varsayılan değer seçmeniz ve Kaydet'e basmanız gerekir.

Bir filtreyi çıkardıktan sonra filtre önbelleğini temizlemelisiniz (yine örtülmez drush cc all!):

cache_clear_all('*', 'cache_filter', TRUE);

Veya acele ile:

drush sqlq "truncate table cache_filter;"

0
update field_revision_body set body_format = 'full_html' WHERE bundle IN ('book','page');
update field_data_body set body_format = 'full_html' WHERE bundle IN ('book','page');

benim için hile yaptı. Önbellekleri temizlemeyi unutmayın

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.