Điểm:1

Ví dụ hook_pathauto_potype_alter

lá cờ cn

Tôi không hiểu cái móc. Tôi mong rằng "pattern_alter" sẽ cho phép tôi "thay đổi" "pattern". Nhưng điều này dường như không phải là trường hợp.

Tôi cũng đã cố gắng thay đổi bí danh ... mà dường như cũng không có tác dụng.

Ai đó có thể chỉ cho tôi một ví dụ làm việc xin vui lòng?

function xxx_pathauto_pattern_alter(\Drupal\pathauto\PathautoPatternInterface &$pattern, array $context) {

  /* ////////////////////////////////////////////// /////////////////////////////////
  //// article_type - ghi đè logic đường dẫn cho các nút *đã lưu trữ* ('/archiv/[node::title]')
  /* ////////////////////////////////////////////// ///////////////////////////////////*/
  if( $context['op'] === "update" && $context['bundle'] === "news") {

    $node = $context['data']['node'];
    $archived = $node->get('field_archived')->getString() === "1";
    nếu ($ lưu trữ) {

      $pattern->setPattern('/archive/[node::title]');
      dpm($pattern); //LÀM !!! chỉ trong đối tượng. Mô hình sẽ không thay đổi trong thế giới thực.
    }
  }
}

function xxx_pathauto_alias_alter(&$alias, array &$context) {
  /* ////////////////////////////////////////////// /////////////////////////////////
    //// article_type - ghi đè logic đường dẫn cho các nút *đã lưu trữ* ('/archive/[node::title]')
    /* ////////////////////////////////////////////// ///////////////////////////////////*/
  if ($context['op'] === "update" && $context['bundle'] === "news") {

    $node = $context['data']['node'];
    $archived = $node->get('field_archived')->getString() === "1";
    nếu ($ lưu trữ) {
      $alias = "/archive/nope";
      dpm($bí danh); //LÀM !!! chỉ trong chức năng. Bí danh sẽ không thay đổi trong thế giới thực.
    }
  }
Điểm:2
lá cờ us

hook_pathauto_pattern_alter() chỉ được gọi khi:

  • Thực thể có một con đường cánh đồng
  • Xử lý Pathauto được bật
  • Đối với các thực thể hỗ trợ các bản sửa đổi, thực thể đó đang sử dụng bản sửa đổi mặc định
  • Một mẫu mặc định đã được đặt cho thực thể đó
  • $entity->toUrl()->getInternalPath() không ném một Thực thểKhông đúng định dạngNgoại lệ, UndefinedLinkTemplateException, hoặc UnexpectedValueException ngoại lệ

Móc được hiển thị cũng chỉ được gọi khi một thực thể được cập nhật, không phải khi một thực thể được tạo.
Khi mô-đun Pathauto đã được đặt để không thay đổi bí danh đường dẫn hiện có, ngay cả khi hook_pathauto_pattern_alter() được gọi, bí danh đường dẫn sẽ không bị thay đổi.

Như lưu ý bên lề, hook trước tiên có thể kiểm tra thực thể mà hook được gọi có phải là một nút hay không, đó là ví dụ hook trong pathauto.api.php làm.

/**
 * Thay đổi mẫu được sử dụng trước khi bí danh được tạo bởi Pathauto.
 *
 * Móc này sẽ chỉ được gọi nếu mẫu mặc định được định cấu hình (trên
 * quản trị/cấu hình/tìm kiếm/đường dẫn/mẫu).
 *
 * @param \Drupal\pathauto\PathautoPatternInterface $pattern
 * Mẫu Pathauto sẽ được sử dụng.
 * Mảng @param $context
 * Một mảng kết hợp của các tùy chọn bổ sung, với các yếu tố sau:
 * - 'mô-đun': Mô-đun hoặc loại thực thể được đặt bí danh.
 * - 'op': Một chuỗi có thao tác được thực hiện trên đối tượng đang được
 * bí danh. Có thể là 'chèn', 'cập nhật', 'trả lại' hoặc 'cập nhật hàng loạt'.
 * - 'nguồn': Một chuỗi đường dẫn nguồn cho bí danh (ví dụ: 'nút/1').
 * - 'dữ liệu': Một mảng các đối tượng có khóa để chuyển đến token_replace().
 * - 'gói': Loại phụ hoặc gói của đối tượng được đặt bí danh.
 * - 'ngôn ngữ': Một chuỗi mã ngôn ngữ cho bí danh (ví dụ: 'en').
 * Điều này có thể được thay đổi bằng cách tham khảo.
 */
function hook_pathauto_pattern_alter(\Drupal\pathauto\PathautoPatternInterface $pattern, array $context) {
  // Tắt bất kỳ mã thông báo [node:created:*] nào có [node:updated:*] khi cập nhật.
  if ($context['module'] == 'node' && ($context['op'] == 'update')) {
    $pattern->setPattern(preg_replace('/\[node:created(\:[^]]*)?\]/', '[node:updated$1]', $pattern->getPattern()));
  }
}

Mã cho móc được hiển thị sẽ tương tự như mã sau.


sử dụng Drupal\pathauto\PathautoPatternInterface;

function mymodule_pathauto_pattern_alter(PathautoPatternInterface $pattern, array $context) {
  if ($context['module'] == 'node' && $context['op'] === "update" && $context['bundle'] === "news") {
    $node = $context['data']['node'];
    $archived = $node->get('field_archived')->getString() === "1";
    nếu ($ lưu trữ) {
      $pattern->setPattern('/archive/[node::title]');
    }
  }
}

Các đối tượng đã được chuyển qua tham chiếu; không cần thiết phải xác định tham số đầu tiên là &$mẫu.

Tôi cũng sẽ xác minh rằng không có mô-đun nào khác đang triển khai hook_pathauto_pattern_alter() mà việc triển khai của chúng được gọi sau khi triển khai được hiển thị trong câu hỏi và điều đó đang thay đổi mẫu cho cùng một thực thể và cùng một gói.

Người giới thiệu

mogio avatar
lá cờ cn
Apaderno. Cảm ơn câu trả lời dài và chi tiết của bạn! .. dường như hoạt động!

Đă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.