Score:0

รัน hook อัปเดตหลังจากนำเข้าการกำหนดค่าเฉพาะแล้วหรือยัง

ธง in

ฉันกำลังแนะนำการกำหนดค่าใหม่ให้กับเอนทิตีใน Drupal ที่เพิ่มฟิลด์บูลีนใหม่สองสามฟิลด์ ปัญหาคือ แม้ว่าฉันจะตั้งค่าเริ่มต้นเป็น TRUE ใน UI แต่นี่เป็นเพียงสำหรับเอนทิตีใหม่เท่านั้น เอนทิตีที่มีอยู่จะไม่มีค่าหรือเป็นเท็จเมื่อประเมินเป็นรหัส

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

สคริปต์การปรับใช้ทั่วไปแนะนำให้เรียกใช้ updb ก่อน cim ด้วย Drush สิ่งนี้สร้างความขัดแย้งเมื่อพยายามทำสิ่งนี้

ตัวอย่างสคริปต์การปรับใช้ Pantheon:

ถ้า (isset($_ENV['PANTHEON_ENVIRONMENT'])) {
  $สถานะ = 0;
  $config_directory = dirname(__FILE__) '/config/default';

  passthru("drush updb --yes", $สถานะ);
  passthru("drush cim --yes", $สถานะ);
  passthru("drush cim --yes", $สถานะ);
  passthru("drush cim --yes", $สถานะ);
  passthru("drush updb --yes", $สถานะ);
  passthru("drush cr", $สถานะ);

  ถ้า (สถานะ $ == 0) {
    echo('นำเข้าการกำหนดค่าและอัพเดทฐานข้อมูลแล้ว' . "\n");
  } อื่น {
    echo('ไม่ได้นำเข้าคอนฟิกูเรชัน / ฐานข้อมูลไม่อัพเดต คำสั่ง Drush ส่งกลับข้อผิดพลาด' . "\n");
  }
}

มีวิธีที่ดีกว่าในการเปลี่ยนแปลงเช่นนี้ซึ่งทำงานเพียงครั้งเดียวโดยไม่ทำให้สคริปต์อย่างข้างต้นล้มเหลวหรือไม่

cn flag
ตัวเลือกเดียวที่ฉันพบในกรณีเหล่านี้คือการเพิ่มฟิลด์โดยทางโปรแกรมในตะขออัปเดต ก่อนที่คุณจะตั้งค่าข้อมูล การนำเข้าการกำหนดค่าสำหรับฟิลด์เหล่านั้นโดยพื้นฐานแล้วจะกลายเป็นไม่มีการดำเนินการ แต่นั่นหมายความว่าคุณไม่จำเป็นต้องเปลี่ยนการปรับใช้ของคุณ
cn flag
อนึ่ง Pantheon ดูเหมือนจะรัน `updb` และ `cim` และ...จำนวนครั้งที่น่าสนใจ โดยทั่วไป คุณจะทำทั้งสองอย่างเพียงครั้งเดียว เช่น [drush does](https://www.drush.org/latest/deploycommand/)
Kevin avatar
in flag
ซึ่งแตกต่างจากสิ่งที่ผู้คนแนะนำสำหรับการปรับใช้ในอดีต - CIM หมดแล้ว updb จะถูกเรียกใช้ก่อน cim จากนั้นในตอนท้าย 'ในกรณี' จำเป็นต้องมีการอัปเดตอื่น ๆ ฉันไม่เคยพบการอัปเดตเพิ่มเติมใดๆ เกี่ยวกับกระบวนการนั้นเช่นกัน แต่จนถึงตอนนี้ Pantheon และ Acquia ก็ป้องกันกระสุนได้ค่อนข้างดี
cn flag
ไม่แน่ใจว่าเหมาะสมหรือไม่ - การอัปเดตทั้งหมดจะทำงานในครั้งแรก หรือบิลด์ควรล้มเหลว วิธีเดียวที่จะแนะนำการอัปเดตใหม่หลังจาก `updb` คือการเปลี่ยนแปลงโค้ด ซึ่ง ณ จุดนี้จะเป็นการปรับใช้ใหม่ และคุณกลับมาที่ `updb` แรกอีกครั้ง แต่นั่นไม่ใช่สิ่งที่คุณถามจริงๆ ดังนั้นฉันจะเงียบเดี๋ยวนี้
Kevin avatar
in flag
มันเป็นกรณีนี้อาจจะ? https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%21module.api.php/function/hook_post_update_NAME/9.2.x
cn flag
เบ็ดนั้นยังคงทำงานเป็นส่วนหนึ่งของ `updb` ในตอนท้าย คุณต้องเปลี่ยนการปรับใช้และเรียกใช้ cim ก่อน หรือคงการปรับใช้เหมือนเดิมและสร้างฟิลด์ด้วยตัวเองก่อน ฉันไม่คิดว่าจะมีตัวเลือกอื่นที่สมเหตุสมผล แม้ว่าสิ่งนี้จะเกิดขึ้นกับฉันบ่อยพอที่ฉันจะดีใจที่ได้ยินวิธีแก้ปัญหาที่ง่ายกว่านี้
sonfd avatar
in flag
ความคิดเห็นแรกของ re @clive ฉันเคยใช้สิ่งนี้ในอดีตเพื่อนำเข้าการกำหนดค่าในตะขออัปเดตเพื่อทำสิ่งนี้: https://www.metaltoad.com/blog/programmatically-importing-drupal- การกำหนดค่า 8 ฟิลด์
Score:3
ธง ph

คุณสามารถใช้การปรับใช้ drush ซึ่งดำเนินการอัปเดตตามลำดับนี้:

  1. อัปเดต hooks จาก module.install
  2. ซิม
  3. Cr
  4. ปรับใช้ hooks จาก module.deploy.php

ดังนั้นการแปลง hook อัปเดตของคุณเป็น deploy hook หมายความว่าจะทำงานหลังจากนำเข้าการกำหนดค่า

cn flag
การดำเนินการนี้มีปัญหาเดียวกับรหัสการปรับใช้ดั้งเดิมของ OP - การกำหนดค่าใหม่จะไม่ถูกนำเข้าก่อนที่ฮุคการอัปเดตจะพยายามใช้
Lambic avatar
ph flag
การย้าย hook ของการอัปเดตไปที่ hook การปรับใช้หมายความว่าจะทำงานหลังจากนำเข้า
cn flag
อา ใช่ ฉันไม่ได้รับรอบแรกนั้น อาจคุ้มค่าที่จะกล่าวถึงความจำเป็นในการเพิ่ม (เช่น) `passthru('drush deploy:hook', $status);` หาก OP ต้องการเรียกใช้สคริปต์ของตนเองแทน `drush deploy` โดยตรง

โพสต์คำตอบ

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