อัพเดตโหนดทั้งหมดด้วยฟิลด์ดีฟอลต์หลังจากเพิ่มฟิลด์ใหม่ให้กับชนิดเนื้อหา


15

ฉันมีชนิดเนื้อหาที่มีอยู่แล้วและมีจำนวนโหนด ฉันเพิ่งเพิ่มฟิลด์บูลีนใหม่ที่มีค่าเริ่มต้นเป็น "ปิด"

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

ฉันจะอัพเดตโหนดที่มีอยู่ซึ่งสร้างขึ้นก่อนที่จะเพิ่มฟิลด์เพื่อตั้งค่าฟิลด์นั้นเป็นค่าเริ่มต้นได้อย่างไร


ฉันแก้ไขปัญหานี้โดยใช้การดำเนินการเป็นกลุ่มและกฎการเข้าชมตามที่ระบุในวิดีโอที่ยอดเยี่ยมนี้: commerceguys.com/resources/articles/217
DanH

โมดูลResave nodesอาจช่วยให้คุณบังคับให้อัปเดตโหนด
สุพรียาราชาโกปาล

คำตอบ:


9

น่าเศร้าที่ไม่มีวิธีง่ายๆในการทำเช่นนี้ (นอกเหนือจาก VBO / กฎ) แต่นี่คือรหัสที่ฉันใช้ในฟังก์ชั่นการอัพเดทในไฟล์ติดตั้งโมดูลที่กำหนดเองเมื่อฉันต้องการเพิ่มค่าฟิลด์สำหรับโหนดบางประเภทหลังจากเพิ่มฟิลด์ใหม่ ในกรณีนี้โหนด 'หน้า'):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

วิธีการอื่นด้วยตนเองที่กล่าวถึงในคำตอบนี้ใช้ EntityFieldQuery และโหลด / บันทึกแต่ละโหนด เพิ่มเติม Drupal-y แต่มีประสิทธิภาพน้อยกว่า ... (ต้องใช้โหลดโหนดแบบเต็มและบันทึกการทำงานสำหรับแต่ละโหนด!)


ช่างน่าเศร้ามาก
AlxVallejo

คุณเคยเห็นโมดูล Field Defaults หรือไม่ dgo.to/field_defaults
ฟอเรสต์

มันเป็นข้อผิดพลาดในการเรียกใช้รหัสเช่นนี้โดยไม่ต้องล้างโหนดที่ได้รับผลกระทบทั้งหมดจากโหลดแคชเอนทิตี: entity_get_controller('node')->resetCache($nids);- มิฉะนั้นต่อมาnode_load()อาจโหลดข้อมูลเก่าจากแคชและnode_save()วัตถุใด ๆที่จะเขียนข้อมูลเก่ากลับไปยังฐานข้อมูล
phils

2

ทางออกที่ดีที่สุดคือ MySQl โดยตรง ตารางจะมีลักษณะดังนี้:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

หากคุณมองพวกเขามันค่อนข้างตรงไปตรงมา - คุณต้องการให้ฉันช่วยให้คุณเริ่มต้นกับสิ่งที่แบบสอบถามจะมีลักษณะหรือคุณตกลงจากที่นี่?


ขอบคุณไมค์ไม่มีปัญหาฉันจัดการ SQL ได้จริงๆ ฉันแค่รู้สึกว่าควรมีตัวเลือก 'บันทึกอีกครั้ง' หรือสิ่งที่จัดไว้ให้เป็นการดำเนินการจำนวนมากฉันคิดว่าฉันอาจดูการรวม VBO และกฎสำหรับสิ่งนี้ในความเป็นจริง
DanH

เข้าใจ ฉันอยู่ในตำแหน่งที่คล้ายกันฉันกำลังย้ายบทความประมาณ 30,000 บทความจาก CMS อื่นไปยัง Drupal ฉันไม่เห็นจุดเพิ่มโมดูลอื่นเมื่อ SQL นั้นรวดเร็วและสกปรก บางทีคุณยังสามารถเขียนฟังก์ชันด่วนที่เรียกว่า node_load () สำหรับโหนดทั้งหมดของคุณซึ่งอาจใช้ได้เช่นกัน
Mike

0

เพียงลองใช้ตรรกะร้อง มันเร็วมากและผ่านการใช้งานเบ็ดทั้งหมดด้วย รายละเอียดเพิ่มเติม คุณสามารถเขียนแบบสอบถามโดยตรง db_select ง่าย ๆ เพื่อรับ nid ทั้งหมดและวนซ้ำด้วยโค้ดตัวอย่างนี้

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

0

ใช้ sql พิจารณาว่าโหนดที่มีค่าเขตข้อมูลไม่ได้ตั้งค่าเป็น

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document เป็นตารางที่สอดคล้องกับฟิลด์ของฉันและมีค่าที่ตราไว้รายการเดียวที่ตั้งค่าด้วยเอนทิตี id ที่อ้างถึงโหนด

ฉันใช้การแทรก SQL ... เลือกไวยากรณ์

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

0

ติดตั้งและเปิดใช้งานViews Bulk Operationsโมดูลและสร้างมุมมองด้วยการแสดงหน้า

เพิ่ม => การทำงานเป็นกลุ่ม: ช่องเนื้อหา (เนื้อหา) ในมุมมอง

อ้างถึง

ป้อนคำอธิบายรูปภาพที่นี่

เลือกฟิลด์ที่คุณต้องการตั้งค่าเริ่มต้น

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

ตอนนี้คุณตั้งค่าเริ่มต้นและบันทึก


0

ฉันพบวิธีที่ง่ายในการอัปเดตฟิลด์ในประเภทเนื้อหาด้วยโมดูลนี้: ค่าเริ่มต้นของฟิลด์

ดูภาพหน้าจอ คุณสามารถปรับปรุงเนื้อหาที่มีอยู่ด้วยค่าเริ่มต้นหรือเก็บค่าที่มีอยู่

ฉันได้ทดสอบกับ D7 แล้วและใช้งานได้

ป้อนคำอธิบายรูปภาพที่นี่

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