Tôi biết tôi có thể thay đổi tiêu đề trang drupal_set_title(t('Amy page title'))
, nhưng khi tôi thử nó trong Drupal 8, tôi nhận được Không có lỗi chức năng như vậy .
Làm cách nào để thay đổi tiêu đề trang trong Drupal 8?
Tôi biết tôi có thể thay đổi tiêu đề trang drupal_set_title(t('Amy page title'))
, nhưng khi tôi thử nó trong Drupal 8, tôi nhận được Không có lỗi chức năng như vậy .
Làm cách nào để thay đổi tiêu đề trang trong Drupal 8?
Câu trả lời:
Như bạn có thể thấy ở đây chức năng đó không được dùng trong Drupal 8.
Các tiêu đề trên các tuyến đường hiện có thể được đặt theo nhiều cách khác nhau, tùy thuộc vào trường hợp sử dụng của bạn. Trước đây chỉ
drupal_set_title()
được gọi ở bất cứ nơi nào. Các trường hợp sử dụng sau tồn tại:Tiêu đề tĩnh
Đối với các tiêu đề tĩnh, bạn đặt '_title' trên định nghĩa định tuyến:
block.admin_add: path: '/admin/structure/block/add/{plugin_id}/{theme}' defaults: _controller: '\Drupal\block\Controller\BlockAddController::blockAddConfigureForm' _title: 'Configure block' requirements: _permission: 'administer blocks'
Tiêu đề động
Nếu bạn viết một bộ điều khiển và bạn cần một tiêu đề động, ví dụ tùy thuộc vào cấu hình trang web, hãy sử dụng _title_callback trong mặc định của tuyến.
mymodule.test: path: '/mymodule/test' defaults: _controller: '\Drupal\mymodule\Controller\Test::getContent' _title_callback: '\Drupal\mymodule\Controller\Test::getTitle' <?php class Test { /** * Returns a page title. */ public function getTitle() { return 'Foo: ' . \Drupal::config()->get('system.site')->get('name'); } /** * Returns a page render array. */ public function getContent() { $build = array(); $build['#markup'] = 'Hello Drupal'; return $build; } } ?>
Ghi đè tiêu đề cuối cùng
Nếu bạn viết một bộ điều khiển và bạn cần ghi đè tiêu đề từ tuyến đường, bạn có thể trả về #title trong mảng kết xuất. Điều này thường nên tránh, vì tiêu đề cho trang khi được hiển thị đầy đủ có thể khác với tiêu đề trong các bối cảnh khác (như trong mẩu bánh mì).
<?php class Test { /** * Renders a page with a title. * * @return array * A render array as expected by drupal_render() */ public function getContentWithTitle() { $build = array(); $build['#markup'] = 'Hello Drupal'; $build['#title'] = 'Foo: ' . Drupal::config()->get('system.site')->get('name'); return $build; } } ?>
Cờ đầu ra của
drupal_set_title()
Xác thực đầu ra trong Drupal 8 ngược với Drupal 7. Chúng tôi phải xác định rõ ràng PASS_THROUGH và CHECK_PLAIN theo mặc định trong Drupal 7, trong khi ở Drupal 8 thì tình huống lại khác. Đầu ra là tự động thoát trừ khi nó được đánh dấu an toàn. Cả hai
t()
vànew FormattableMarkup
trả lại các đối tượng sẽ không được tự động thoát.$form['#title'] = $this->t('Add new shortcut');
$form['#title'] = $this->t("'%name' block", array('%name' => $info[$block->delta]['info']));
Drupal 8,5+
$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
$route->setDefault('_title', 'New Title');
}
và bạn cũng có thể sử dụng hook_preprocess_HOOK()
để ghi đè lên nó
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
// WRITE YOUR LOGIC HERE,
if ($YOUR_LOGICS === TRUE) {
$variables['title'] = 'New Title';
}
}
Thay đổi thẻ tiêu đề trong phần đầu của tài liệu HTML của bạn.
function mymodule_preprocess_html(&$variables) {
$variables['head_title']['title'] = $something;
}
Thay đổi tiêu đề xuất hiện trong nội dung trang.
function mymodule_preprocess_block(&$variables) {
if ('page_title_block' == $variables['plugin_id']) {
$variables['content']['#title'] = $something;
}
}
drupal_set_title () trong Drupal 8
$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
$route->setDefault('_title', 'New Title');
}
drupal_get_title () trong Drupal 8
$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
$title = \Drupal::service('title_resolver')->getTitle($request, $route);
}
Hàm đó đã bị xóa khỏi Drupal 8.
Thay đổi bản ghi:
drupal_set_title () và drupal_get_title () đã bị xóa .
Bây giờ bạn có thể đặt tiêu đề khi xác định các tuyến đường trong modulename.routing.yml
. Ví dụ về cách nó có thể được thực hiện, được hiển thị liên kết hồ sơ thay đổi ở trên.
Tôi đã tìm thấy trong D8 rằng nếu bạn muốn thay đổi tiêu đề cho chế độ xem thực thể, bạn có thể sử dụng hook_ENTITY_TYPE_view_alter (). Ví dụ: đây là cách bạn có thể thay đổi chế độ xem của thực thể người dùng bằng một trường trên người dùng "field_display_name", thay vì ID người dùng làm tiêu đề:
/**
* Implements hook_ENTITY_TYPE_view_alter().
*/
function mymodule_user_view_alter(array &$build, Drupal\Core\Entity\EntityInterface $entity, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display) {
$build['#title'] = $entity->get('field_display_name')->getString();
}
Tôi đã tìm thấy một cách khác, có thể đơn giản hơn nếu bạn không có bộ điều khiển và muốn sửa đổi tiêu đề trên toàn trang web của mình. Bạn có thể sử dụng nó để sửa đổi tiêu đề dựa trên nút hiện tại.
Đầu tiên, xóa thẻ trong html.html.twig Sau đó, hook hook_page_attachments_alter
function mytemplate_page_attachments_alter(array &$page) {
$page['#attached']['html_head'][] = [
[
'#tag' => 'title',
'#value' => "My title"
],
'title'
];
}
Bạn có thể nhận được nút hiện tại của thuật ngữ phân loại với
$node = \Drupal::routeMatch()->getParameter('node');
$term = \Drupal::routeMatch()->getParameter('taxonomy_term')
Hãy xem Automatic Entity Label , một mô-đun đóng góp được chế tạo rất tốt để thiết lập các tiêu đề nút và tương tự.
.
Mặc dù op dường như đang yêu cầu hướng dẫn viết mã tùy chỉnh, nhưng không rõ chi tiết có sẵn rằng mã tùy chỉnh là đề xuất tốt nhất. Đối với những độc giả không có lý do cụ thể để sao chép một tính năng có sẵn từ mã đóng góp, cộng đồng Drupal khuyên mạnh mẽ (và chủ sở hữu trang web được hưởng lợi rất nhiều từ việc) áp dụng mô-đun hiện có.
drupal_set_title()
và drupal_get_title()
cả hai đều bị xóa khỏi drupal 8 nhưng phần hay nhất là phần này có một khối riêng cho page_title
. Người dùng có thể ẩn hoặc thêm khối này trên bất kỳ trang / khu vực nào.
Có 2 giải pháp cho việc này.
title_block
trên trang cụ thể và thêm khối tùy chỉnh mới với một số đánh dấu cho tiêu đề. Bây giờ đặt khối này ngay sau title_block
phần khối drupal.Bằng cách sử dụng hook_preprocess_block()
chức năng trong custom_theme.theme
tập tin của bạn .
Dưới đây là ví dụ mã:
function custom_themename_preprocess_block(&$variables) {
if ('page_title_block' == $variables['plugin_id']) {
$request = \Drupal::request();
$path = $request->getRequestUri(); // get current path
if(strpos($path, 'user')) { //check current path is user profile page
$variables['content']['#title'] = 'My Profile';
}
}
}
Trong trường hợp của tôi, tôi đã sử dụng phương pháp thứ 2 ở trên, nó sẽ chỉ hoạt động cho trang hồ sơ người dùng.
Tôi đã vật lộn với điều này và thử tất cả các giải pháp ở trên. Giải pháp cuối cùng có hiệu quả là:
function mymodule_preprocess_html(&$variables) {
$variables['head_title']['title'] = $something;
}
nhưng chỉ sau khi tôi cập nhật trọng lượng mô-đun tùy chỉnh của mình:
drush php:eval "module_set_weight('mymodule', 10);"
Làm cho tiêu đề trang hoạt động tốt như được viết trong câu trả lời của @ rpayanm. Nhưng thiết lập nó hóa ra khá phức tạp. Cuối cùng phát hiện ra rằng hook_preprocess_HOOK()
có thể đơn giản được sử dụng để xử lý trước tiêu đề trang khá dễ dàng.
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
if ($MYLOGIC === TRUE) {
$variables['title'] = 'New Title';
}
}
Và như đã được đề cập trong các câu trả lời khác ở đây, bạn có thể sử dụng thêm hook_preprocess_html()
để đặt thẻ tiêu đề đầu HTML phù hợp.
tôi đã thay đổi khối page_title cho người dùng / uid thành một tên trường tài khoản tùy chỉnh khác như thế này:
function hook_preprocess_block(&$variables) {
$path = \Drupal::request()->getpathInfo();
$arg = explode('/', $path);
if (isset($arg[2]) && $arg[2] == 'user' && isset($arg[3])) {
if (isset($variables['elements']['content']['#type']) && $variables['elements']['content']['#type'] == 'page_title') {
$account = \Drupal\user\Entity\User::load($arg[3]);
if(isset($account) && isset($account->field_mycustomfield->value)){
$variables['content']['#title']['#markup']=$account->field_mycustomfield->value;
}
}
}
}