Ubah format input untuk 3000+ node

18

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 permintaan SQL?

mortendk
sumber

Jawaban:

20

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, setiap HTML atau PHP yang sebelumnya diloloskan yang dikirimkan ke suatu bidang akan langsung render / dijalankan jika Anda secara tidak sengaja atau sengaja mengatur filter ke kode HTML atau PHP Penuh.

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

Jadi sekali lagi: waspadalah, ada naga.

Dengan demikian, setiap bidang menyimpan teks sebagai kolom bernama field_foo_format, di mana field_fooadalah nama mesin bidang tersebut. Anda harus memperbarui kolom itu di tabel field_revision_field_foodan field_data_field_foo.

Nilai untuk kolom adalah nama mesin yang didefinisikan sebagai kolom formatdalam filter_formattabel. Jadi, memperbarui semua bidang adalah 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 new_formatnilai di sini: http://YOURSITE.com/admin/config/content/formats - konfigurasikan tautan - angka atau string di URL adalah new_format.Bersihkan cache Anda setelah memperbarui.

Kari Kääriäinen
sumber
1
Jawaban yang bagus. Anda juga harus melakukan field_cache_clear();setelah perubahan dalam field_data_...dan field_revision_...tabel
milkovsky
4

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);
Ek Kosmos
sumber
1

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 menulis ulang bidang yang bernama 'format' (mis. "Date_format", tetapi jika Anda memiliki format tanggal dengan nilai '2', itu masalah Anda).

Chris Burgess
sumber
1

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

Tammon Tamás
sumber
Ini bekerja seperti pesona, tetapi saya harus menghapus cache untuk melihat efeknya. Terima kasih.
shasi kanth
0

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'));
Lee SeungYoun Carrie
sumber
0

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 _formatkolom:

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 select [...] unionpernyataan besar dan kemudian menjalankan pembaruan kueri terhadapnya.

Menggunakan pendekatan ini menyelamatkan saya beberapa saat ketika saya perlu memperbarui ribuan node / revisi. Ingatlah untuk menghapus cache bidang (TIDAK ditutupi 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 CT 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 textberisi 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;"
noobish
sumber
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');

melakukan trik untukku. Jangan lupa menghapus cache

bebek
sumber