ฉันมีสองภาษา (อังกฤษและฝรั่งเศส) ฉันต้องการ:
- สำรวจตัวเลือกในการสร้าง/ตรวจสอบ/อนุมัติ/เผยแพร่เนื้อหาภาษาอังกฤษ
เป็นขั้นตอนการทำงานของตนเอง
- สำรวจตัวเลือกในการสร้าง/ตรวจสอบ/อนุมัติ/เผยแพร่เนื้อหาภาษาฝรั่งเศส
เป็นขั้นตอนการทำงานของตนเอง
- ไม่ควรมีการพึ่งพาระหว่างกระแสการกลั่นกรองภาษาอังกฤษและ
กระแสการกลั่นกรองของฝรั่งเศส
- หลังจากเผยแพร่แล้ว หากมีความจำเป็นต้องแก้ไขเนื้อหา สามารถส่งเนื้อหากลับมาได้อีกครั้ง ผู้ใช้ที่ไม่ระบุชื่อจะเห็นหน้าเวอร์ชันที่เผยแพร่ล่าสุดจนกว่าหน้าที่แก้ไขจะได้รับการเผยแพร่อีกครั้ง
ผู้ตรวจทานได้รับอนุญาตให้ดูหน้าเฉพาะเมื่อสถานะเป็นเท่านั้น ทบทวน.
ฉันลองวิธีแก้ไขต่อไปนี้:
เงื่อนไขเวิร์กโฟลว์: เมื่อเผยแพร่แล้วเท่านั้นที่ถูกตั้งค่าเป็นการแก้ไขเริ่มต้น
ภาษาใดๆ ทำงานได้อย่างถูกต้อง แต่เมื่อมีการแปลและเผยแพร่ภาษาใดภาษาหนึ่ง แม้ว่าเมื่อเราเปลี่ยนสถานะการดูแลของโหนดในภาษาอื่น สถานะการแก้ไขปัจจุบันยังคงอยู่ในการแก้ไขเผยแพร่ล่าสุดของ โหนดโดยไม่คำนึงถึงภาษาและสถานะการดูแลของโหนดหลังจะยังคงอยู่ในแบบร่างเนื่องจากฐานข้อมูลไม่ได้รับการอัปเดต (แม้ว่าเราจะเปลี่ยนเพื่อตรวจสอบหรืออนุมัติก็ตาม) ส่งผลให้ผู้ตรวจสอบไม่สามารถดูหน้าที่แปลได้ เนื่องจากยังอยู่ในฉบับร่าง เนื่องจากมีการแก้ไข ผู้ตรวจทานจึงต้องไปที่การแก้ไขนั้นและดูหน้านั้น สิ่งนี้ไม่ต้องการ: ผู้ตรวจสอบไม่ควรใส่ใจกับรหัสโหนด
เงื่อนไขเวิร์กโฟลว์: เมื่อเฉพาะตรวจทานและอนุมัติเท่านั้นที่ตั้งค่าเป็นการแก้ไขเริ่มต้น
ทั้งสองภาษาเป็นอิสระแล้ว ทั้งสองสามารถเผยแพร่แยกกันได้ เปลี่ยนการแก้ไขใด ๆ กลับเป็น ทบทวน หรือ ที่ได้รับการอนุมัติ หากต้องการแก้ไขเนื้อหาของโหนดที่มีอยู่ให้ยกเลิกการเผยแพร่ ด้วยเหตุนี้ ผู้ใช้ที่ไม่ระบุตัวตนจะไม่สามารถมองเห็นเพจได้อีกต่อไป
ฉันพยายามที่จะใช้ hook_entity_update ()
เพื่ออัปเดต content_moderation_state_field_data
ฟังก์ชัน sync_revision_node_update (EntityInterface $entity) {
$entity_type = $entity->getEntityTypeId();
ถ้า ($entity_type == "โหนด") {
$entity_id = $entity->id();
$vid = \Drupal::entityTypeManager()->getStorage('โหนด')
->getLatestRevisionId($entity_id);
$langcode = $entity->get('langcode')->value;
$moderationState = $entity->moderation_state->ค่า;
ถ้า ($moderationState != "เผยแพร่แล้ว") {
$table = 'content_moderation_state_field_data';
$query = \Drupal::database()->update($table)
->เขตข้อมูล(อาร์เรย์(
'moderation_state' => $moderationState,
'content_entity_revision_id' => $vid,
))
->เงื่อนไข('content_entity_id', $entity_id)
->condition('langcode', $langcode)->execute();
}
}
}
นี่เป็นการอัปเดตตาราง 'content_moderation_state_field_data' แต่หน้า /fr/test ยังไม่ได้รับการตรวจสอบ มันยังคงอยู่ในร่าง ผู้ตรวจสอบต้องไปแก้ไขล่าสุดและดูหน้า (/fr/node/$node_id/latest) แต่ไม่ต้องการ ผู้ตรวจสอบไม่ควรกังวลเกี่ยวกับรหัสโหนด
ฉันพยายามเขียนเบ็ดการประมวลผลล่วงหน้าที่จะเปลี่ยนเส้นทางไปยังการแก้ไขล่าสุด
ฟังก์ชัน sync_revision_preprocess_page(&$ตัวแปร) {
$node = \Drupal::routeMatch()->getParameter('โหนด');
ถ้า ($ โหนดอินสแตนซ์ของ \Drupal\node\NodeInterface) {
$nid = $node->id();
$vid = \Drupal::entityTypeManager()
->getStorage('โหนด')
->getLatestRevisionId($nid);
$moderationState = $node->moderation_state->value;
$langcode = $node->get('langcode')->value;
$url = $_SERVER['REQUEST_URI'];
ถ้า ($moderationState != "เผยแพร่" && strpos($url,'ล่าสุด') == เท็จ) {
$เส้นทาง = "/" $langcode . "/" . "โหนด/" . $นิด "/" . "ล่าสุด";
$response = ใหม่ RedirectResponse($path);
$response->send();
}
}
}
สิ่งนี้ไม่ทำงานตามที่คาดไว้ /fr/test ได้รับข้อผิดพลาด 403 เป็นอันดับแรก ดังนั้นการเปลี่ยนเส้นทางจึงไม่ทำงาน
โปรดแนะนำแนวทางการทำงานที่ดีกว่าเพื่อให้สอดคล้องกับเกณฑ์เหล่านี้ทั้งหมด