อัปเดตฟิลด์เป็นกลุ่มหรือไม่


35

ฉันได้เพิ่มฟิลด์ (ข้อความ) ใหม่ลงในประเภทเนื้อหา Drupal 7 ที่มีหลายโหนดอยู่แล้ว

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

คำตอบ:


37

คุณสามารถใช้EntityFieldQueryเพื่อดึงรายการของโหนดจากนั้นอัพเดตฟิลด์ของโหนดด้วยnode_save():

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

หากนี่เป็นการดำเนินการครั้งเดียวคุณสามารถใช้ฟังก์ชันExecute PHPของโมดูลDevelเพื่อเรียกใช้งานข้างต้น: ไม่เช่นนั้นคุณสามารถสร้างโมดูลที่กำหนดเองได้ง่าย


2
นอกเหนือจากการใช้ devel หรือ vbo คุณยังสามารถใช้ "drush scr myscript.php" เพื่อรันโค้ดด้านบนในสภาพแวดล้อมที่มีการบูตสเต็ม
fietserwin

รหัสนี้มีการเปลี่ยนแปลงอย่างไรเพื่อรองรับการปฏิบัติงานเดียวกันกับเขตข้อมูลอ้างอิงคำศัพท์
Screenack

17

ฉันจะใช้Views Bulk Operationsและใช้ "Execute Arbitrary PHP Script" เป็นหลักในการทำรายการข้างต้น แต่คุณไม่จำเป็นต้องทำรหัสพิเศษทั้งหมดเพียงตัวอย่างเล็ก ๆ น้อย ๆ ที่ทำในสิ่งที่คุณต้องการ (เช่น$object->field_foo['und'][0]['value'] = 'some_value')


9

หากคุณต้องการเพียงอัปเดตฟิลด์ด้วยค่าบางค่าทางเลือกที่มีประสิทธิภาพมากขึ้นสำหรับคำตอบที่ยอมรับคือ:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

ความแตกต่างคือในการใช้โดยตรงfield_attach_presaveและfield_attach_updateฟังก์ชั่นซึ่งปรับปรุงอย่างถูกต้องเพียงฟิลด์โหนดและข้ามส่วนที่เหลือของกระบวนการบันทึกโหนด สิ่งนี้มีผลกระทบที่ไม่มีโหนด presave / save hooks จะถูกเรียกว่าวันที่ "เปลี่ยน" จะไม่ได้รับการอัปเดตเป็นวันที่ปัจจุบันเป็นต้นตามกรณีการใช้งานของคุณ


4

อันที่จริงแล้ว VBO (Views Bulk Operations) เป็นทางออกที่ดี นอกจากนี้ด้วยเวอร์ชันล่าสุดคุณจะพบตัวเลือก "ปรับเปลี่ยนค่าเอนทิตี" ซึ่งให้วิธีที่ง่ายมากในการอัพเดตภาษาโหนดในการดำเนินการครั้งเดียว


2

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

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

อ้างถึง

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

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

ในกรณีของคุณชื่อ ในภาพมันคือแท็ก

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

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

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