Score:1

วิธีสร้างนามแฝง URL อัตโนมัติสำหรับ taxonomy/term/%tid/feed

ธง bd

ฉันจะตั้งค่านามแฝง URL อัตโนมัติสำหรับฟีดอนุกรมวิธานได้อย่างไร

บอกว่าฉันมีระยะด้วย น้ำ=1ชื่อ วันหยุดโดยมี URL ของระบบเป็น /อนุกรมวิธาน/ระยะ/1 ที่สามารถเข้าถึงได้โดยนามแฝง URL /วันหยุด. จากนั้นฉันต้องการให้ฟีด rss สำหรับคำนั้นสามารถเข้าถึงได้โดยใช้นามแฝง URL /วันหยุด/feed หรือ /holidays/rss.xml. ฟังดูค่อนข้างง่ายในตอนแรกที่ฉันคิดถึงมัน แต่ดูเหมือนว่าจะเป็นเช่นนั้น เส้นทางอัตโนมัติ ไม่สนับสนุนสิ่งนั้น (หรือฉันพลาดไป) ฉันรู้ว่าฉันสามารถสร้างนามแฝงได้ด้วยตนเอง แต่ด้วยคำศัพท์ X จำนวนหนึ่งบนไซต์ ฉันควรใช้รูปแบบสำหรับการสร้างอัตโนมัติ

ปัญหาเดียวเกี่ยวกับหัวข้อนี้ที่ฉันพบนั้นล้าสมัยทั้งคู่:

มีสิ่งใดที่ฉันพลาดไปหรือโมดูลการมีส่วนร่วมใด ๆ ที่ฉันไม่เห็นว่ามีฟังก์ชันนี้หรือไม่

hotwebmatter avatar
nr flag
ค่าธรรมเนียมของ Pathauto เล่นได้ไม่ดีนักกับมุมมองคำศัพท์อนุกรมวิธานเริ่มต้น ฉันยังไม่มีคำตอบ แต่ฉันจะเชื่อมโยงไปยังคำถามของฉันเอง (คล้ายกับของคุณ แต่ซับซ้อนกว่าเพราะฉันกำลังจัดการกับอนุกรมวิธานแบบลำดับชั้น
hotwebmatter avatar
nr flag
https://drupal.stackexchange.com/a/304279/80164
4uk4 avatar
cn flag
เมื่อคุณมีชื่อแทนเช่น `/holidays` แล้ว คุณสามารถเขียนตัวประมวลผลพาธแบบกำหนดเองโดยใช้ชื่อแทนเหล่านั้นโดยไม่ต้องต่อท้าย /feed หรือ /rss.xml ขยาย https://api.drupal.org/api/drupal/core%21modules%21path_alias%21src%21PathProcessor%21AliasPathProcessor.php/class/AliasPathProcessor/9.2.x แล้วแทนที่คลาสในคอนเทนเนอร์บริการหรือลงทะเบียนของคุณเอง แท็กบริการตัวประมวลผลเส้นทางขาเข้าและขาออก
berliner avatar
bd flag
@hotwebmatter ขอบคุณสำหรับลิงค์ แต่ฉันคิดว่าปัญหาของคุณค่อนข้างแตกต่างจากของฉัน
berliner avatar
bd flag
@ 4k4 ขอบคุณสำหรับคำแนะนำ ฉันกำลังมองหาวิธีแก้ปัญหาที่ไม่ต้องใช้รหัสที่กำหนดเองถ้าเป็นไปได้ ฉันจะเก็บความคิดของคุณไว้ในใจ แต่จะรอถ้ามีคนคิดวิธีที่ง่ายกว่าในการบรรลุเป้าหมายนี้ ยังคงหวังว่าจะมีวิธีแก้ปัญหาที่ฉันยังไม่เห็น
4uk4 avatar
cn flag
รหัสที่กำหนดเองเกี่ยวข้องกับการจัดการสตริงของเส้นทางเท่านั้น ไม่ใช่เรื่องใหญ่.
berliner avatar
bd flag
@ 4k4 โซลูชันที่คุณเสนอใช้กับ URL ขาออกด้วยหรือไม่ ฉันต้องการแสดงลิงก์ไปยังฟีด RSS ในหน้ารายการคำศัพท์ด้วย
4uk4 avatar
cn flag
ใช่ ในตัวประมวลผลพาธแบบกำหนดเอง ซึ่งอิงตาม AliasPathProcessor ที่เชื่อมโยง คุณต้องใช้ processOutbound() ซึ่งจะลบ /feed ออกจากพาธ เรียก getAliasByPath() แล้วเพิ่ม /feed อีกครั้ง
berliner avatar
bd flag
@ 4k4 ตกลง ฉันลองแล้วและทำงานได้อย่างถูกต้อง มีการแลกเปลี่ยนประสิทธิภาพระหว่างโซลูชันนี้กับการสร้างนามแฝงของเส้นทางจริงหรือไม่
4uk4 avatar
cn flag
ไม่ การประมวลผลเส้นทางที่ค่อนข้างเรียบง่ายนี้ไม่ใช่ปัญหาด้านประสิทธิภาพ คุณจะไม่สังเกตเห็นวงจรซีพียูสองสามรอบเหล่านี้ และผลลัพธ์จะถูกแคชด้วย ทั้งขาเข้าเป็นเส้นทางที่ตรงกันและขาออกเป็นลิงก์ที่แสดงผล แต่คุณประหยัดพื้นที่ในตารางนามแฝงได้มาก
berliner avatar
bd flag
@4k4 ขอบคุณสำหรับคำติชมอันมีค่า ฉันได้โพสต์วิธีแก้ปัญหาตามคำแนะนำของคุณเป็นคำตอบ
Score:2
ธง bd

ตามคำแนะนำโดย @ 4k4 ในส่วนความคิดเห็นของคำถาม ฉันได้แก้ไขปัญหานี้โดยใช้ PathProcessor ที่กำหนดเอง

ฉันจะแบ่งปันรหัสขั้นต่ำเปล่าสำหรับการทำงานนี้ในรูปแบบของโมดูลที่กำหนดเอง (เรียกว่า term_feed_alias สำหรับจุดประสงค์ของตัวอย่างนี้) ซึ่งคุณต้องการ 3 ไฟล์

term_feed_alias.info.yml

ชื่อ: 'นามแฝงฟีดคำ'
คำอธิบาย: 'ให้นามแฝงอัตโนมัติสำหรับฟีดคำศัพท์อนุกรมวิธาน'
รุ่น: '8.x-1.0'
core_version_requirement: ^8.8 || ^9
ประเภท: โมดูล
การพึ่งพา:
  - 'เส้นทาง_นามแฝง:เส้นทาง_นามแฝง'

term_feed_alias.services.yml

บริการ:
  term_feed_alias.path_processor:
    คลาส: Drupal\term_feed_alias\PathProcessor\PathProcessorFeedAlias
    ข้อโต้แย้ง: ['@path_alias.manager']
    แท็ก:
      - { ชื่อ: path_processor_inbound }
      - { ชื่อ: path_processor_outbound }

แท็กบริการสามารถรับลำดับความสำคัญได้เช่นกัน ดูที่ https://www.drupal.org/docs/8/api/services-and-dependency-injection/service-tags สิ่งนี้อาจจำเป็นเพื่อรวมลอจิกนามแฝงอย่างถูกต้องกับบริการอื่นๆ เช่น การแปล เป็นต้น ดูความคิดเห็นแรกโดย @ 4k4

scr/PathProcessorFeedAlias.php

<?php

เนมสเปซ Drupal\term_feed_alias\PathProcessor;

ใช้ Drupal\Core\PathProcessor\InboundPathProcessorInterface;
ใช้ Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
ใช้ Drupal\Core\Render\BubbleableMetadata;
ใช้ Drupal\path_alias\AliasManager
ใช้ Symfony\Component\HttpFoundation\Request;

/**
 * ระบุตัวประมวลผลเส้นทางเพื่อจัดการนามแฝงสำหรับฟีดคำศัพท์อนุกรมวิธาน
 */
คลาส PathProcessorFeedAlias ​​ใช้ InboundPathProcessorInterface, OutboundPathProcessorInterface {

  /**
   * ตัวจัดการนามแฝงที่แคชการค้นหานามแฝงตามคำขอ
   *
   * @var \Drupal\path_alias\AliasManager
   */
  ป้องกัน $aliasManager;

  /**
   * สร้างอินสแตนซ์ PathProcessorFeedAlias ​​ใหม่
   *
   * @param \Drupal\path_alias\AliasManager $alias_manager
   * ผู้จัดการนามแฝง
   */
  ฟังก์ชั่นสาธารณะ __construct (AliasManager $ alias_manager) {
    $this->aliasManager = $alias_manager;
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นสาธารณะ processInbound (เส้นทาง $, คำขอ $ คำขอ) {
    $args = ระเบิด ('/', ตัดแต่ง ($ เส้นทาง, '/'));
    ถ้า (สิ้นสุด ($ args) == 'ฟีด') {
      array_pop($args);
      $system_path = $this->aliasManager->getPathByAlias('/' . implode('/', $args));
      ส่งคืน $system_path && strpos($system_path, '/taxonomy/term/') === 0 ? $system_path '/feed' : $เส้นทาง;
    }
    ส่งคืน $path;
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นสาธารณะ processOutbound ($path, &$options = [], ร้องขอ $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
    $args = ระเบิด ('/', ltrim ($ เส้นทาง, '/'));
    if ($args[0] == 'taxonomy' && $args[1] == 'term' && end($args) == 'feed') {
      array_pop($args);
      $alias = $this->aliasManager->getAliasByPath('/' . implode('/', $args));
      กลับ '/' . $นามแฝง. '/ให้อาหาร';
    }

    ส่งคืน $path;
  }
}
4uk4 avatar
cn flag
ตัวอย่างโค้ดที่ยอดเยี่ยม คำแนะนำสำหรับไซต์หลายภาษา ตั้งค่าลำดับความสำคัญ `{ ชื่อ: path_processor_outbound, ลำดับความสำคัญ: 200 }` รหัสจะทำงานเฉพาะเมื่อยังไม่ได้เพิ่มคำนำหน้าภาษา (โดยมีลำดับความสำคัญ 100) ในกรณีนี้ คุณต้องมีตัวเลือกภาษาด้วย: https://api.drupal.org/api/drupal/core%21modules%21path_alias%21src%21PathProcessor%21AliasPathProcessor.php/function/AliasPathProcessor%3A%3AprocessOutbound/9.2.x
berliner avatar
bd flag
@ 4k4 ฉันได้อัปเดตคำตอบพร้อมหมายเหตุเกี่ยวกับลำดับความสำคัญและลิงก์ไปยังเอกสารแท็กบริการบน drupal.org ในตอนแรกฉันได้ละลำดับความสำคัญไว้โดยตั้งใจ เพื่อให้ตัวอย่างมีค่าน้อยที่สุด แต่ฉันคิดว่านี่เป็นปัญหาประเภทที่ยากต่อการเข้าใจเมื่อพยายามนำโค้ดตัวอย่างกลับมาใช้ใหม่ ดังนั้นหมายเหตุเกี่ยวกับ มันไม่เจ็บ

โพสต์คำตอบ

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