Score:1

ตัวอย่าง hook_pathauto_pattern_alter

ธง cn

ฉันไม่เข้าใจเบ็ด ฉันคาดหวังว่า "pattern_alter" จะอนุญาตให้ฉัน "แก้ไข" "รูปแบบ" ได้ แต่ดูเหมือนว่าจะไม่เป็นเช่นนั้น

ฉันพยายามแก้ไขนามแฝงด้วย...ซึ่งดูเหมือนจะไม่มีผลเช่นกัน

ใครช่วยแสดงตัวอย่างการทำงานให้ฉันหน่อยได้ไหม

ฟังก์ชัน xxx_pathauto_pattern_alter (\Drupal\pathauto\PathautoPatternInterface &$pattern อาร์เรย์ $บริบท) {

  /* /////////////////////////////////////////////////// /////////////////////////////////////
  //// article_type - ลบล้างพาธลอจิกสำหรับโหนด *archived* ('/archiv/[node::title]')
  /* /////////////////////////////////////////////////// //////////////////////////////////////*
  if( $context['op'] === "update" && $context['bundle'] === "ข่าว") {

    $node = $context['data']['node'];
    $archived = $node->get('field_archived')->getString() === "1";
    ถ้า ($ เก็บถาวร) {

      $pattern->setPattern('/archive/[node::title]');
      dpm(รูปแบบ $); //เวิร์ค!!! ในวัตถุเท่านั้น รูปแบบจะไม่เปลี่ยนแปลงในโลกแห่งความเป็นจริง
    }
  }
}

ฟังก์ชัน xxx_pathauto_alias_alter (&$ นามแฝง อาร์เรย์ &$ บริบท) {
  /* /////////////////////////////////////////////////// /////////////////////////////////////
    //// article_type - แทนที่ตรรกะพาธสำหรับโหนด *archived* ('/archive/[node::title]')
    /* /////////////////////////////////////////////////// //////////////////////////////////////*
  ถ้า ($context['op'] === "update" && $context['bundle'] === "ข่าว") {

    $node = $context['data']['node'];
    $archived = $node->get('field_archived')->getString() === "1";
    ถ้า ($ เก็บถาวร) {
      $นามแฝง = "/เก็บ/ไม่";
      dpm($นามแฝง); //เวิร์ค!!! ในหน้าที่เท่านั้น นามแฝงจะไม่เปลี่ยนแปลงในโลกแห่งความเป็นจริง
    }
  }
Score:2
ธง us

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() ซึ่งมีการเรียกใช้หลังจากการใช้งานตามที่แสดงในคำถาม และนั่นคือการเปลี่ยนแปลงรูปแบบสำหรับเอนทิตีเดียวกันและบันเดิลเดียวกัน

อ้างอิง

mogio avatar
cn flag
อาปาแดร์โน. ขอบคุณสำหรับคำตอบที่ยาวและละเอียดของคุณ! .. ดูเหมือนว่าจะได้ผล!

โพสต์คำตอบ

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