เปลี่ยนรูปแบบอินพุตสำหรับ 3000+ โหนด


18

ฉันมีโหนดจำนวนมากที่ต้องเปลี่ยนรูปแบบการป้อนข้อมูล - ฉันสามารถทำได้ด้วยมือ แต่หลังจากนั้นฉันจะไม่ทำก่อนวันคริสต์มาสปี 2014

Drupal เก็บข้อมูลนั้นไว้ที่ไหน ฉันจะเปลี่ยนรูปแบบการป้อนข้อมูลในเสี้ยววินาทีพร้อมกับแบบสอบถาม SQL ได้อย่างไร

คำตอบ:


20

ฉันจะคำนำคำตอบนี้โดยบอกว่าการทำสิ่งนี้จะนำเสนอความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้นโดยเฉพาะถ้าคุณเปลี่ยนรูปแบบเป็นชุดตัวกรองที่ผ่อนปรนมากขึ้น รูปแบบข้อความจะปรับเปลี่ยนเอาต์พุตฟิลด์ระหว่างการแสดงไม่ใช่ในระหว่างการบันทึก ตัวอย่างเช่น HTML หรือ PHP ที่หนีไปก่อนหน้าใด ๆ ที่ส่งไปยังฟิลด์จะแสดงผล / เรียกใช้หากคุณตั้งใจตั้งค่าตัวกรองเป็น HTML หรือ PHP โค้ดโดยไม่ตั้งใจ

ด้วยเหตุนี้ Drupal จึงไม่อัปเดตโหนดที่มีอยู่ทั้งหมดโดยอัตโนมัติเมื่อคุณเปลี่ยนรูปแบบข้อความ พฤติกรรมของรูปแบบข้อความในสถานการณ์ที่คล้ายกันยังคงเป็นปัญหาที่เปิดอยู่

ดังนั้นอีกครั้ง: ระวังมีมังกร

จากที่กล่าวมาแต่ละฟิลด์จะเก็บข้อความเป็นคอลัมน์ชื่อfield_foo_formatซึ่งfield_fooเป็นชื่อเครื่องของฟิลด์ คุณจะต้องอัปเดคอลัมน์นั้นบนโต๊ะและfield_revision_field_foofield_data_field_foo

ค่าสำหรับคอลัมน์คือชื่อเครื่องที่กำหนดเป็นคอลัมน์formatในfilter_formatตาราง ดังนั้นการอัปเดตเขตข้อมูลทั้งหมดจะเป็นเรื่องของแบบสอบถามเช่น:

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

สำหรับแต่ละฟิลด์ที่ต้องการเปลี่ยน

คุณสามารถกำหนดnew_formatค่าได้ที่นี่: http://YOURSITE.com/admin/config/content/formats - กำหนดค่าลิงก์ - หมายเลขหรือสตริงใน URL คือnew_format.ล้างแคชของคุณหลังจากอัปเดต


1
คำตอบที่ดี. คุณควรทำfield_cache_clear();หลังจากการเปลี่ยนแปลงในfield_data_...และfield_revision_...ตาราง
milkovsky

4

ลองใช้วิธีนี้โดยการวนซ้ำสำหรับโหนดทุกประเภท:

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

1

เพิ่งพบกับสถานการณ์เดียวกันกับที่ Morten ทำที่นี่ด้วยการอัพเกรด D6 => D7 ที่เห็นได้ชัดว่ารูปแบบอินพุตไม่เสร็จ

ใช้วิธีการ cruder กว่าคำตอบแล้วที่นี่และเขียนโมดูลที่วิ่งผ่าน DB schema และอัพเดทคอลัมน์ทั้งหมดที่มีสตริง 'format' แทนที่ค่ารูปแบบ D6 (1, 2, 3) ด้วยชื่อเครื่อง D7 ( filtered_html,full_html , plain_text)

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

Hardcoded รองรับการทำแผนที่ของ

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

และอาจพยายามเขียนฟิลด์ที่มีชื่อว่า 'รูปแบบ' (เช่น "date_format" แต่ถ้าคุณมีรูปแบบวันที่ที่มีค่า '2' นั่นคือปัญหาของคุณ)


1

สำหรับฉันแล้วงานต่อไปนี้:

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'

แน่นอนคุณต้องเปลี่ยน new_body_forma และ node_type


สิ่งนี้ได้ผลเหมือนมีเสน่ห์ แต่ฉันต้องล้างแคชเพื่อดูเอฟเฟกต์ ขอขอบคุณ.
shasi kanth

0

คุณสามารถใช้รหัสต่อไปนี้หากคุณติดตั้งเอนทิตี. โมดูล

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

0

สมมุติว่าคุณต้องการทราบว่าต้องอัปเดตฟิลด์ใดอาจทำการบันทึกหรือตรวจสอบข้อมูล หากต้องการทำสิ่งนี้ให้รับชื่อตารางและคอลัมน์ทั้งหมดที่มี_formatคอลัมน์:

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

ด้วยข้อมูลนี้คุณสามารถสร้างแบบสอบถามแยกต่างหากจากค่าเหล่านั้น ตรวจสอบผลลัพธ์ก่อน คุณอาจต้องลบบางรายการที่ไม่เกี่ยวข้องกับเนื้อหา / การแก้ไข ฉันขอแนะนำให้ใช้โปรแกรมแก้ไข regex ที่มีความสามารถในการสร้างแบบสอบถาม ฉันเปลี่ยนข้อมูลเป็นใหญ่select [...] unionคำสั่งจากนั้นเรียกใช้แบบสอบถามแบบใช้ปรับปรุงข้อมูล

การใช้วิธีการนี้ช่วยฉันได้หลายครั้งเมื่อฉันต้องการอัปเดตโหนด / การแก้ไขหลายพันรายการ อย่าลืมล้างแคชฟิลด์ (ไม่ได้ครอบคลุมdrush cc all!):

field_cache_clear();

หรือด้วย drush:

drush sqlq "truncate table cache_field;"

ยังลบตัวกรองข้อความ

หากคุณกำลังจะเกษียณตัวกรองข้อความหลังจากนั้นคุณจะต้องเปลี่ยนรูปแบบข้อความเริ่มต้นสำหรับ CT ที่มีเขตข้อมูลที่ใช้ old_formatถ้าคุณไม่ทำเช่นนี้ผู้ใช้ของคุณจะได้รับอนุญาตปฏิเสธข้อความที่อยู่ในเขตข้อมูลที่ใช้ ฉันทำแบบสอบถามนี้เพื่อค้นหาผู้กระทำผิด:

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

เพื่อทำการเปลี่ยนแปลงฉันพบว่ามันง่ายกว่าที่จะใช้อินเทอร์เฟซเพื่อไปที่หน้าการตั้งค่าแต่ละฟิลด์และกดบันทึก (ข้อมูลจะถูกเก็บไว้เป็น longblob และไม่สะดวกในการค้นหาและแทนที่ แม้แต่ฟิลด์ที่ตั้งค่าการประมวลผลข้อความเป็นPlain textมี old_format! สำหรับฟิลด์ที่มีการตั้งค่าการประมวลผลข้อความไว้Filtered text (user selects text format)คุณจะต้องเลือกค่าเริ่มต้นใหม่เพิ่มเติมแล้วกดบันทึก

คุณควรล้างแคชตัวกรองหลังจากลบตัวกรอง (อีกครั้งโดยไม่ครอบคลุมdrush cc all!):

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

หรือด้วย drush:

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');

ทำเคล็ดลับสำหรับฉัน อย่าลืมล้างแคช

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.