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