hook_pathauto_pattern_alter()
จะถูกเรียกใช้เมื่อ:
- นิติบุคคลมี เส้นทาง สนาม
- เปิดใช้งานการประมวลผล Pathauto
- สำหรับเอนทิตีที่สนับสนุนการแก้ไข เอนทิตีกำลังใช้การแก้ไขเริ่มต้น
- มีการตั้งค่ารูปแบบเริ่มต้นสำหรับเอนทิตีนั้น
$entity->toUrl()->getInternalPath()
ไม่โยน EntityMalformedException
, UndefinedLinkTemplateException
, หรือ UnexpectedValueException
ข้อยกเว้น
hook ที่แสดงจะถูกเรียกใช้เมื่อมีการอัปเดตเอนทิตีเท่านั้น ไม่ใช่เมื่อมีการสร้างเอนทิตี
เมื่อโมดูล Pathauto ถูกตั้งค่าไม่ให้เปลี่ยนนามแฝงของพาธที่มีอยู่ แม้ว่าจะเป็นเช่นนั้นก็ตาม hook_pathauto_pattern_alter()
ถูกเรียก นามแฝงพาธจะไม่ถูกเปลี่ยน
ตามหมายเหตุด้านข้าง hook ควรตรวจสอบเอนทิตีที่ hook ถูกเรียกใช้เป็นโหนดก่อน ซึ่งเป็นสิ่งที่ hook ตัวอย่างใน pathauto.api.php ทำ.
/**
* เปลี่ยนรูปแบบที่จะใช้ก่อนที่ Pathauto จะสร้างนามแฝง
*
* hook นี้จะถูกเรียกใช้ก็ต่อเมื่อมีการกำหนดค่ารูปแบบเริ่มต้น (on
* admin/config/search/path/patterns)
*
* @param \Drupal\pathauto\PathautoPatternInterface $pattern
* รูปแบบ Pathauto ที่จะใช้
* @param อาร์เรย์ $context
* อาร์เรย์ที่เชื่อมโยงของตัวเลือกเพิ่มเติม โดยมีองค์ประกอบต่อไปนี้:
* - 'โมดูล': โมดูลหรือประเภทเอนทิตีที่ใช้นามแฝง
* - 'op': สตริงที่มีการดำเนินการกับวัตถุที่เป็นอยู่
* นามแฝง สามารถเป็นได้ทั้ง 'insert', 'update', 'return' หรือ 'bulkupdate'
* - 'source': สตริงของเส้นทางต้นทางสำหรับนามแฝง (เช่น 'node/1')
* - 'data': อาร์เรย์ของอ็อบเจกต์คีย์ที่จะส่งผ่านไปยัง token_replace()
* - 'บันเดิล': ชนิดย่อยหรือบันเดิลของอ็อบเจ็กต์ที่ใช้นามแฝง
* - 'ภาษา': สตริงของรหัสภาษาสำหรับนามแฝง (เช่น 'en')
* สิ่งนี้สามารถเปลี่ยนแปลงได้ตามการอ้างอิง
*/
ฟังก์ชัน hook_pathauto_pattern_alter (\Drupal\pathauto\PathautoPatternInterface $pattern, อาร์เรย์ $context) {
// เปลี่ยนโทเค็น [node:created:*] ใดๆ ด้วย [node:updated:*] ในการอัปเดต
ถ้า ($context['module'] == 'node' && ($context['op'] == 'update')) {
$pattern->setPattern(preg_replace('/\[node:created(\:[^]]*)?\]/', '[node:updated$1]', $pattern->getPattern()));
}
}
รหัสสำหรับตะขอที่แสดงจะคล้ายกับรหัสต่อไปนี้
ใช้ Drupal\pathauto\PathautoPatternInterface;
ฟังก์ชัน mymodule_pathauto_pattern_alter (PathautoPatternInterface $pattern, อาร์เรย์ $context) {
ถ้า ($context['module'] == 'node' && $context['op'] === "update" && $context['bundle'] === "ข่าว") {
$node = $context['data']['node'];
$archived = $node->get('field_archived')->getString() === "1";
ถ้า ($ เก็บถาวร) {
$pattern->setPattern('/archive/[node::title]');
}
}
}
ออบเจกต์ถูกส่งผ่านโดยการอ้างอิงแล้ว ไม่จำเป็นต้องกำหนดพารามิเตอร์แรกเป็น &$รูปแบบ
.
ฉันจะตรวจสอบว่าไม่มีโมดูลอื่นที่ใช้งานอยู่ hook_pathauto_pattern_alter()
ซึ่งมีการเรียกใช้หลังจากการใช้งานตามที่แสดงในคำถาม และนั่นคือการเปลี่ยนแปลงรูปแบบสำหรับเอนทิตีเดียวกันและบันเดิลเดียวกัน
อ้างอิง