Điểm:1

Cách tạo bí danh url tự động cho taxonomy/term/%tid/feed

lá cờ bd

Làm cách nào tôi có thể đặt bí danh URL tự động cho nguồn cấp dữ liệu phân loại?

Nói rằng tôi có một thời hạn với tid=1, được đặt tên ngày lễ, với URL hệ thống là /taxonomy/thuật ngữ/1 có thể truy cập bằng bí danh URL /ngày lễ. Sau đó, tôi muốn nguồn cấp dữ liệu rss cho thuật ngữ đó có thể truy cập được trên bí danh URL /kỳ nghỉ/nguồn cấp dữ liệu hoặc /holidays/rss.xml. Điều đó nghe có vẻ khá dễ dàng khi tôi mới nghĩ về nó, nhưng có vẻ như con đường tự động không hỗ trợ điều đó (hoặc tôi đã bỏ lỡ nó). Tôi biết tôi có thể tạo bí danh theo cách thủ công, nhưng với một số thuật ngữ X trên trang web, tôi muốn sử dụng một mẫu để tạo tự động.

Các vấn đề duy nhất về chủ đề này mà tôi có thể tìm thấy đều đã lỗi thời:

Tôi đã bỏ lỡ điều gì hoặc bất kỳ mô-đun đóng góp nào mà tôi không thấy cung cấp chức năng này?

hotwebmatter avatar
lá cờ nr
Phí Pathauto không hoạt động tốt với chế độ xem thuật ngữ phân loại mặc định. Tôi chưa có câu trả lời nhưng tôi sẽ liên kết với câu hỏi của riêng tôi (tương tự như câu hỏi của bạn nhưng phức tạp hơn vì tôi đang xử lý phân loại phân cấp
hotwebmatter avatar
lá cờ nr
https://drupal.stackexchange.com/a/304279/80164
4uk4 avatar
lá cờ cn
Khi bạn đã có các bí danh như `/holidays`, bạn có thể viết trình xử lý đường dẫn tùy chỉnh áp dụng các bí danh đó mà không cần phụ lục /feed hoặc /rss.xml. Mở rộng https://api.drupal.org/api/drupal/core%21modules%21path_alias%21src%21PathProcessor%21AliasPathProcessor.php/class/AliasPathProcessor/9.2.x và sau đó thay thế lớp trong bộ chứa dịch vụ hoặc đăng ký của riêng bạn các dịch vụ bộ xử lý đường dẫn được gắn thẻ trong và ngoài nước.
berliner avatar
lá cờ bd
@hotwebmatter Cảm ơn bạn đã liên kết, nhưng tôi nghĩ vấn đề của bạn hơi khác so với vấn đề của tôi.
berliner avatar
lá cờ bd
@4k4 Cảm ơn lời đề nghị. Tôi đang tìm giải pháp không yêu cầu mã tùy chỉnh nếu có thể. Tôi sẽ ghi nhớ ý tưởng của bạn nhưng sẽ đợi nếu ai đó nghĩ ra cách dễ dàng hơn để đạt được điều này. Vẫn hy vọng có giải pháp mà tôi chưa thấy.
4uk4 avatar
lá cờ cn
Mã tùy chỉnh chỉ liên quan đến thao tác chuỗi của đường dẫn. Không phải là một thỏa thuận lớn.
berliner avatar
lá cờ bd
@ 4k4 Giải pháp đề xuất của bạn có áp dụng cho các url gửi đi không? Tôi cũng muốn hiển thị liên kết đến nguồn cấp dữ liệu RSS trên trang danh sách thuật ngữ.
4uk4 avatar
lá cờ cn
Có, trong bộ xử lý đường dẫn tùy chỉnh, dựa trên AliasPathProcessor được liên kết, bạn sẽ triển khai processOutbound() để xóa /feed khỏi đường dẫn, gọi getAliasByPath() rồi thêm lại /feed.
berliner avatar
lá cờ bd
@4k4 Ok, tôi đã thử ngay bây giờ và nó hoạt động chính xác. Có bất kỳ sự cân bằng hiệu suất nào giữa giải pháp này và thực sự tạo bí danh đường dẫn không?
4uk4 avatar
lá cờ cn
Không, quá trình xử lý đường dẫn khá đơn giản này không phải là vấn đề về hiệu suất, bạn sẽ không nhận thấy một vài chu kỳ cpu này và kết quả cũng được lưu vào bộ nhớ đệm, cả đầu vào dưới dạng khớp tuyến và đầu ra dưới dạng liên kết được hiển thị. Nhưng bạn tiết kiệm rất nhiều không gian trong bảng bí danh.
berliner avatar
lá cờ bd
@4k4 Cảm ơn bạn đã phản hồi có giá trị. Tôi đã đăng giải pháp của mình dựa trên đề xuất của bạn làm câu trả lời.
Điểm:2
lá cờ bd

Dựa trên các đề xuất của @ 4k4 trong phần nhận xét của câu hỏi, tôi đã giải quyết vấn đề này bằng cách triển khai PathProcessor tùy chỉnh.

Tôi sẽ chia sẻ mã tối thiểu để thực hiện công việc này dưới dạng một mô-đun tùy chỉnh (được gọi là term_feed_alias cho mục đích của ví dụ này) mà bạn cần 3 tệp.

term_feed_alias.info.yml

tên: 'Bí danh nguồn cấp dữ liệu thuật ngữ'
description: 'Cung cấp bí danh tự động cho nguồn cấp dữ liệu thuật ngữ phân loại'
phiên bản: '8.x-1.0'
core_version_requirement: ^8,8 || ^9
loại: mô-đun
phụ thuộc:
  - 'path_alias:path_alias'

term_feed_alias.services.yml

dịch vụ:
  term_feed_alias.path_processor:
    lớp: Drupal\term_feed_alias\PathProcessor\PathProcessorFeedAlias
    đối số: ['@path_alias.manager']
    thẻ:
      - { tên: path_processor_inbound }
      - { tên: path_processor_outbound }

Các thẻ dịch vụ cũng có thể được ưu tiên, xem https://www.drupal.org/docs/8/api/services-and-dependency-injection/service-tags Điều này có thể cần thiết để tích hợp logic bí danh một cách chính xác với các dịch vụ khác như bản dịch chẳng hạn. Cũng xem bình luận đầu tiên của @ 4k4.

scr/PathProcessorFeedAlias.php

<?php

không gian tên Drupal\term_feed_alias\PathProcessor;

sử dụng Drupal\Core\PathProcessor\InboundPathProcessorInterface;
sử dụng Drupal\Core\PathProcessor\OutboundPathProcessorInterface;
sử dụng Drupal\Core\Render\BubbleableMetadata;
sử dụng Drupal\path_alias\AliasManager;
sử dụng Symfony\Thành phần\HttpFoundation\Request;

/**
 * Cung cấp bộ xử lý đường dẫn để xử lý bí danh cho nguồn cấp dữ liệu thuật ngữ phân loại.
 */
lớp PathProcessorFeedAlias ​​thực hiện InboundPathProcessorInterface, OutboundPathProcessorInterface {

  /**
   * Trình quản lý bí danh lưu trữ các tra cứu bí danh dựa trên yêu cầu.
   *
   * @var \Drupal\path_alias\AliasManager
   */
  $aliasManager được bảo vệ;

  /**
   * Xây dựng một phiên bản PathProcessorFeedAlias ​​mới.
   *
   * @param \Drupal\path_alias\AliasManager $alias_manager
   * Người quản lý bí danh.
   */
  hàm công khai __construct(AliasManager $alias_manager) {
    $this->aliasManager = $alias_manager;
  }

  /**
   * {@inheritdoc}
   */
  chức năng công khai processInbound($path, Request $request) {
    $args = phát nổ('/', trim($path, '/'));
    if (end($args) == 'feed') {
      mảng_pop($args);
      $system_path = $this->aliasManager->getPathByAlias('/' . implode('/', $args));
      return $system_path && strpos($system_path, '/taxonomy/term/') === 0 ? $system_path . '/feed' : $path;
    }
    trả về đường dẫn $;
  }

  /**
   * {@inheritdoc}
   */
  chức năng công khai processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
    $args = phát nổ('/', ltrim($path, '/'));
    if ($args[0] == 'phân loại' && $args[1] == 'term' && end($args) == 'feed') {
      mảng_pop($args);
      $alias = $this->aliasManager->getAliasByPath('/' . implode('/', $args));
      trở lại '/' . $bí danh . '/cho ăn';
    }

    trả về đường dẫn $;
  }
}
4uk4 avatar
lá cờ cn
Ví dụ mã tuyệt vời. Một gợi ý cho các trang web đa ngôn ngữ. Đặt mức độ ưu tiên `{ name: path_processor_outbound, priority: 200 }`. Mã chỉ hoạt động khi chưa thêm tiền tố ngôn ngữ (với mức ưu tiên 100). Trong trường hợp này, bạn cũng cần tùy chọn ngôn ngữ: https://api.drupal.org/api/drupal/core%21modules%21path_alias%21src%21PathProcessor%21AliasPathProcessor.php/function/AliasPathProcessor%3A%3AprocessOutbound/9.2.x
berliner avatar
lá cờ bd
@ 4k4 Tôi đã cập nhật câu trả lời với ghi chú về mức độ ưu tiên và liên kết đến tài liệu về thẻ dịch vụ trên drupal.org. Ban đầu, tôi đã cố ý loại bỏ các ưu tiên để giữ ví dụ ở mức tối thiểu nghiêm ngặt, nhưng tôi cho rằng đây là loại vấn đề khó tìm ra hơn khi cố gắng sử dụng lại mã ví dụ, vì vậy một lưu ý về nó không đau.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.