Score:2

ไม่สามารถบันทึกโหนดใหม่ด้วยเอนทิตี->บันทึก() ไม่มีข้อผิดพลาดเฉพาะ

ธง cn

ฉันกำลังพยายามเขียนคำสั่ง drush เพื่อบันทึกโหนดทั้งหมดบนไซต์ของฉันอีกครั้ง

ฉันค้นหาโมดูลและพบ บันทึกโหนดทั้งหมดอีกครั้ง โมดูล แต่คำสั่ง drush ยังไม่พร้อม เลยตัดสินใจลองเขียนดูเอง

อย่างไรก็ตาม ฉันไม่สามารถรับโหนดเพื่อบันทึกซ้ำได้ $entity->บันทึก()และฉันไม่เข้าใจว่าทำไม

<?php

เนมสเปซ Drupal\resave_all_nodes\Commands;

ใช้ Drupal\Core\Entity\EntityTypeManagerInterface;
ใช้ Drupal\node\Entity\Node;
ใช้ Drush\Commands\DrushCommands;

/**
 * คลาสคำสั่ง Drush สำหรับการแปลงโมดูล Resave All Nodes
 */
คลาส ResaveAllNodesCommands ขยาย DrushCommands
{

  /**
   * ผู้จัดการประเภทเอนทิตี
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  ส่วนตัว $entityTypeManager;


  /**
   * สร้างวัตถุ ResaveAllNodesCommands
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   * ผู้จัดการประเภทเอนทิตี
   */
  ฟังก์ชั่นสาธารณะ __construct (EntityTypeManagerInterface $entity_type_manager)
  {
    $this->entityTypeManager = $entity_type_manager;

    ผู้ปกครอง :: __ สร้าง ();
  }

  /**
   * บันทึกโหนดทั้งหมดอีกครั้ง
   *
   * @คำสั่ง resave-all-nodes:resave
   *
   * @usage drush resave-all-nodes:resave
   * บันทึกโหนดทั้งหมดบนไซต์อีกครั้ง
   *
   * @นามแฝงวิ่ง
   */
  ฟังก์ชั่นสาธารณะ resaveAllNodes()
  {
    $my_node = โหนด::โหลด(1);
    $my_node->save();
    \Drupal::logger('resave_all_nodes')->notice("บันทึกโหนด 1 แล้ว!");
  }
}

เมื่อฉันรันคำสั่ง บันทึกจะแสดงการแจ้งเตือนคนตัดไม้:

  • ฉันเห็น "โหนด 1 ถูกบันทึก!" ในบันทึก
  • ฉันมีข้อความเข้าสู่ระบบอื่นใน hook_entity_presave()ที่ยังปรากฏอยู่

แต่เมื่อฉันไปที่ /ผู้ดูแลระบบ/เนื้อหา"วันที่อัปเดต" สำหรับโหนด 1 ไม่มีการเปลี่ยนแปลง นอกจากนี้ เนื้อหาของโหนดจะไม่ถูกบันทึกใหม่

ถ้าฉันไป โหนด/1/แก้ไข และบันทึกซ้ำด้วยตนเอง โหนดจะถูกบันทึกซ้ำตามที่ฉันคาดไว้ (วันที่อัปเดตได้รับการอัปเดต และค่าฟิลด์ได้รับการอัปเดต)

ดังนั้นทำไม โหนด -> บันทึก () ล้มเหลวอย่างเงียบ ๆ (วันที่อัปเดตและค่าฟิลด์ยังคงเหมือนเดิม) เมื่อการบันทึกด้วยตนเองทำงานได้หรือไม่

ฉันมีโมดูลที่กำหนดเองสองสามโมดูล และฉันได้ปิดการใช้งานและสร้างแคชใหม่ แต่ปัญหายังคงอยู่

br flag
Do you have any logic ignore PHP_SAPI, or some module ignore logic with PHP_SAPI?
cn flag
@Jonh I don't think so. I just grepped my codebase for `PHP_SAPI` and the only non-core non-Symfony references are to webform module. Running my site locally in lando pulled down from platform.sh.
4uk4 avatar
cn flag
*But, when I go to /admin/content, the "date updated" for node 1 has not changed.* You need to set the changed time: `$my_node->setChangedTime(\Drupal::time()->getRequestTime());` If you still not see it, try to clear the cache.
cn flag
@4k4 Ok, that worked. So resaving a node in the UI is actually different than doing node->save(), in that node->save() doesn't make any changes unless you explicitly specify them?
cn flag
Entities don’t persist data if nothing has changed (for obvious performance reasons). Submitting an entity form updates the changed timestamp before save is called, so the persistence is triggered. You just need to do the same
Score:2
ธง cn

ขอบคุณ @ 4k4 และ @Clive ฉันสามารถทำงานได้ คำสั่ง drush นี้จะบันทึกโหนดทั้งหมด รหัสดังต่อไปนี้ แต่ก่อนอื่นหมายเหตุ:

  • หลังจากโทร batch_set()สำหรับคำสั่ง drush คุณต้องโทร drush_backend_batch_process() หรือแบทช์จะไม่ถูกเรียกใช้
  • เดอะ โมดูลตัวอย่างการประมวลผลแบบกลุ่ม Drush 9 เป็นตัวอย่างที่เป็นประโยชน์มาก
  • ในของคุณ ชุดการทำงาน () คำสั่ง ถ้าคุณพิมพ์คำใบ้ $บริบทคุณต้องใช้ \DrushBatchContext|อาร์เรย์ $context ไม่ใช่แค่ อาร์เรย์ เพราะดรัชจะพังอย่างแรง มีปัญหามากมายบน drupal.org เกี่ยวกับเรื่องนี้

ตกลง นี่คือรหัสของฉัน:

<?php

เนมสเปซ Drupal\resave_all_nodes\Commands;

ใช้ Drupal\Core\Batch\BatchBuilder;
ใช้ Drupal\Core\Entity\EntityTypeManagerInterface;
ใช้ Drupal\Core\StringTranslation\StringTranslationTrait;
ใช้ Drush\Commands\DrushCommands;

/**
 * คลาสคำสั่ง Drush สำหรับการแปลงโมดูล Resave All Nodes
 */
คลาส ResaveAllNodesCommands ขยาย DrushCommands
{
  ใช้ StringTranslationTrait;

  /**
   * ผู้จัดการประเภทเอนทิตี
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  ส่วนตัว $entityTypeManager;


  /**
   * สร้างวัตถุ ResaveAllNodesCommands
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   * ผู้จัดการประเภทเอนทิตี
   */
  ฟังก์ชั่นสาธารณะ __construct (EntityTypeManagerInterface $entity_type_manager)
  {
    $this->entityTypeManager = $entity_type_manager;

    ผู้ปกครอง :: __ สร้าง ();
  }

  /**
   * บันทึกโหนดทั้งหมดอีกครั้ง
   *
   * @คำสั่ง resave:nodes
   *
   * @usage drush resave:nodes
   * บันทึกโหนดทั้งหมดบนไซต์อีกครั้ง
   *
   * @นามแฝงวิ่ง
   */
  ฟังก์ชั่นสาธารณะ resaveAllNodes()
  {
    // อาร์เรย์ที่มีรหัสโหนดจำนวนมาก
    $nids = $this->getNodeIds();
    // สับอาร์เรย์เป็นอาร์เรย์ย่อย (ชิ้น) ของขนาดที่ระบุ
    $chunks = array_chunk($nids, 250);
    $num_chunks = นับ ($ ชิ้น);

    // ตอนนี้ resave โหนดทั้งหมดทีละอัน
    $batchBuilder = ใหม่ BatchBuilder();
    สำหรับ ($i = 0; $i < $num_chunks; $i++) {
      $batchBuilder->addOperation('\Drupal\resave_all_nodes\Batch\ResaveAllNodesBatch::batchOperation',
        [$chunks[$i]]
      );
    }

    $batchBuilder->setTitle(t('กำลังบันทึกโหนด'))
      ->setFinishCallBack('\Drupal\resave_all_nodes\Batch\ResaveAllNodesBatch::batchFinished');

    batch_set($batchBuilder->toArray());
    drush_backend_batch_process();
  }

  /**
   * รับรหัสโหนดอาร์เรย์
   *
   * @return อาร์เรย์|int
   * อาร์เรย์ของโหนด ID ที่ดีที่สุด
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  ฟังก์ชั่นสาธารณะ getNodeIds () {
    $query = $this->entityTypeManager->getStorage('โหนด')->getQuery();
    $nids = $query->execute();
    # เพื่อรับประเภทโหนด
    # $nids = $query->condition('type', $node_types, 'IN')->execute();

    กลับ $nids;
  }
}

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา