ฉันมีโหนดจำนวนมากที่ต้องเปลี่ยนรูปแบบการป้อนข้อมูล - ฉันสามารถทำได้ด้วยมือ แต่หลังจากนั้นฉันจะไม่ทำก่อนวันคริสต์มาสปี 2014
Drupal เก็บข้อมูลนั้นไว้ที่ไหน ฉันจะเปลี่ยนรูปแบบการป้อนข้อมูลในเสี้ยววินาทีพร้อมกับแบบสอบถาม SQL ได้อย่างไร
ฉันมีโหนดจำนวนมากที่ต้องเปลี่ยนรูปแบบการป้อนข้อมูล - ฉันสามารถทำได้ด้วยมือ แต่หลังจากนั้นฉันจะไม่ทำก่อนวันคริสต์มาสปี 2014
Drupal เก็บข้อมูลนั้นไว้ที่ไหน ฉันจะเปลี่ยนรูปแบบการป้อนข้อมูลในเสี้ยววินาทีพร้อมกับแบบสอบถาม SQL ได้อย่างไร
คำตอบ:
ฉันจะคำนำคำตอบนี้โดยบอกว่าการทำสิ่งนี้จะนำเสนอความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้นโดยเฉพาะถ้าคุณเปลี่ยนรูปแบบเป็นชุดตัวกรองที่ผ่อนปรนมากขึ้น รูปแบบข้อความจะปรับเปลี่ยนเอาต์พุตฟิลด์ระหว่างการแสดงไม่ใช่ในระหว่างการบันทึก ตัวอย่างเช่น HTML หรือ PHP ที่หนีไปก่อนหน้าใด ๆ ที่ส่งไปยังฟิลด์จะแสดงผล / เรียกใช้หากคุณตั้งใจตั้งค่าตัวกรองเป็น HTML หรือ PHP โค้ดโดยไม่ตั้งใจ
ด้วยเหตุนี้ Drupal จึงไม่อัปเดตโหนดที่มีอยู่ทั้งหมดโดยอัตโนมัติเมื่อคุณเปลี่ยนรูปแบบข้อความ พฤติกรรมของรูปแบบข้อความในสถานการณ์ที่คล้ายกันยังคงเป็นปัญหาที่เปิดอยู่
ดังนั้นอีกครั้ง: ระวังมีมังกร
จากที่กล่าวมาแต่ละฟิลด์จะเก็บข้อความเป็นคอลัมน์ชื่อfield_foo_format
ซึ่งfield_foo
เป็นชื่อเครื่องของฟิลด์ คุณจะต้องอัปเดคอลัมน์นั้นบนโต๊ะและfield_revision_field_foo
field_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.
ล้างแคชของคุณหลังจากอัปเดต
ลองใช้วิธีนี้โดยการวนซ้ำสำหรับโหนดทุกประเภท:
$node = node_load(nid);
$node->body[$node->language][0]['format'] = 'full_html'; // plain_text
node_save($node);
เพิ่งพบกับสถานการณ์เดียวกันกับที่ 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' นั่นคือปัญหาของคุณ)
สำหรับฉันแล้วงานต่อไปนี้:
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
คุณสามารถใช้รหัสต่อไปนี้หากคุณติดตั้งเอนทิตี. โมดูล
// I'm using node_save($node);
$wrapper = entity_metadata_wrapper('node', $node->nid);
$wrapper->body->set(array('value' => body_text, 'format'=>'full_html'));
สมมุติว่าคุณต้องการทราบว่าต้องอัปเดตฟิลด์ใดอาจทำการบันทึกหรือตรวจสอบข้อมูล หากต้องการทำสิ่งนี้ให้รับชื่อตารางและคอลัมน์ทั้งหมดที่มี_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;"
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');
ทำเคล็ดลับสำหรับฉัน อย่าลืมล้างแคช
field_cache_clear();
หลังจากการเปลี่ยนแปลงในfield_data_...
และfield_revision_...
ตาราง