it-swarm-id.com

Ubah format input untuk 3000+ node

Saya memiliki banyak node yang perlu diubah format inputnya - saya bisa melakukannya dengan tangan, tapi kemudian saya tidak akan selesai sebelum Natal 2014.

Di mana Drupal menyimpan informasi itu? Bagaimana saya bisa mengubah format input dalam sepersekian detik, dengan kueri SQL?

17
mortendk

Saya akan kata pengantar jawaban ini dengan mengatakan melakukan ini secara massal menghadirkan risiko keamanan potensial, terutama jika Anda mengubah format ke set filter yang lebih lunak. Format teks memodifikasi output bidang selama tampilan, bukan selama menyimpan. Jadi misalnya, HTML atau PHP yang sebelumnya diloloskan sebelumnya yang dikirimkan ke bidang akan langsung render/dijalankan jika Anda secara tidak sengaja atau sengaja mengatur filter ke kode HTML atau PHP lengkap.

Karena alasan inilah Drupal tidak secara otomatis memperbarui semua node yang ada saat Anda mengubah format teks. Perilaku format teks dalam skenario yang sama masih merupakan masalah terbuka .

Jadi sekali lagi: berhati-hatilah, ada naga.

Dengan demikian, setiap bidang menyimpan teks sebagai kolom bernama field_foo_format, Di mana field_foo Adalah nama mesin dari bidang tersebut. Anda harus memperbarui kolom itu di tabel field_revision_field_foo Dan field_data_field_foo.

Nilai untuk kolom adalah nama mesin yang didefinisikan sebagai kolom format dalam tabel filter_format. Jadi, memperbarui semua bidang akan menjadi masalah kueri seperti:

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

untuk setiap bidang yang perlu diubah.

Anda dapat menentukan nilai new_format Di sini: http://YOURSITE.com/admin/config/content/formats - konfigurasikan tautan - angka atau string di URL adalah new_format. Bersihkan cache setelah memperbarui.

20
user7

Coba dengan cara ini, dengan membuat lingkaran untuk semua node dari jenis tertentu:

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

Bagi saya, yang berikut ini berhasil:

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'

Tentu saja Anda harus mengubah new_body_forma dan node_type

1
Ámon Tamás

Baru saja mengalami situasi yang sama dengan Morten di sini, dengan peningkatan D6 => D7 yang tampaknya tidak menyelesaikan format input.

Mengambil pendekatan yang lebih kasar daripada jawaban yang sudah ada di sini, dan menulis modul yang berjalan melalui skema DB dan memperbarui semua kolom yang berisi string 'format', mengganti nilai format D6 (1, 2, 3) dengan nama mesin D7 ( filtered_html, full_html, plain_text).

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

Hardcoded untuk mendukung pemetaan

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

Mungkin juga mencoba untuk menulis ulang bidang yang bernama 'format' (misalnya "date_format", tetapi jika Anda memiliki format tanggal dengan nilai '2', itu masalah Anda).

1
Chris Burgess
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');

melakukan trik untukku. Jangan lupa menghapus cache

0
duck

Agaknya Anda akan ingin tahu bidang mana yang perlu diperbarui, mungkin untuk melakukan beberapa logging atau memeriksa data. Untuk melakukan ini, dapatkan semua nama tabel dan kolom yang berisi kolom _format:

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

Berbekal data ini, Anda dapat membangun kueri terpisah dari nilai-nilai itu. Periksa output terlebih dahulu; Anda mungkin perlu menghapus beberapa entri yang tidak berkaitan dengan konten/revisi. Saya sarankan menggunakan editor yang mampu menjalankan regex untuk membangun kueri. Saya mengubah data menjadi pernyataan select [...] union Besar dan kemudian menjalankan kueri pembaruan terhadapnya.

Menggunakan pendekatan ini menyelamatkan saya cukup lama ketika saya perlu memperbarui ribuan node/revisi. Ingatlah untuk menghapus cache bidang (TIDAK tercakup oleh drush cc all!):

field_cache_clear();

Atau dengan drush:

drush sqlq "truncate table cache_field;"

Juga menghapus filter teks

Jika Anda juga menghentikan filter teks, setelah itu Anda perlu mengubah format teks default untuk CTs yang memiliki bidang yang menggunakannya. Jika Anda tidak melakukan ini, pengguna Anda akan mendapatkan izin pesan ditolak dalam bidang yang menggunakan old_format. Saya melakukan kueri ini untuk menemukan penyebabnya:

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

Untuk melakukan perubahan, saya merasa lebih mudah untuk menggunakan antarmuka untuk mengunjungi setiap halaman pengaturan bidang dan tekan Simpan (data disimpan sebagai longblob dan sulit untuk mencari dan mengganti karena format yang lebih baik modul injeksi data). Bahkan bidang yang memiliki pemrosesan teks diatur ke Plain text Berisi old_format! Untuk bidang yang memiliki Pemrosesan teks diatur ke Filtered text (user selects text format), Anda juga perlu memilih nilai default baru dan tekan Simpan.

Anda harus menghapus cache filter setelah menghapus filter (sekali lagi, tidak tercakup oleh drush cc all!):

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

Atau dengan drush:

drush sqlq "truncate table cache_filter;"
0
noobish

Anda dapat menggunakan kode berikut, jika Anda memiliki entitas.module diinstal.

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