Saya tahu saya dapat mengubah judul halaman drupal_set_title(t('Amy page title'))
, tetapi ketika saya mencobanya di Drupal 8 saya mendapatkan Tidak ada kesalahan fungsi seperti itu .
Bagaimana saya bisa mengubah judul halaman di Drupal 8?
Saya tahu saya dapat mengubah judul halaman drupal_set_title(t('Amy page title'))
, tetapi ketika saya mencobanya di Drupal 8 saya mendapatkan Tidak ada kesalahan fungsi seperti itu .
Bagaimana saya bisa mengubah judul halaman di Drupal 8?
Jawaban:
Seperti yang Anda lihat di sini , fungsi tersebut sudah tidak digunakan lagi di Drupal 8.
Judul pada rute sekarang dapat diatur dengan berbagai cara, tergantung pada kasus penggunaan Anda. Sebelumnya hanya
drupal_set_title()
dipanggil di tempat apa pun. Ada kasus penggunaan berikut:Judul statis
Untuk judul statis, Anda menetapkan '_title' pada definisi perutean:
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'
Judul dinamis
Jika Anda menulis controller dan Anda memerlukan judul yang dinamis, misalnya tergantung pada konfigurasi situs, gunakan _title_callback di default rute.
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; } } ?>
Ganti judul akhir
Jika Anda menulis pengontrol dan Anda perlu mengganti judul dari rute, Anda dapat mengembalikan #title dalam array render. Ini umumnya harus dihindari, karena judul untuk halaman ketika dirender sepenuhnya dapat berbeda dari judul dalam konteks lain (seperti dalam remah roti).
<?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; } } ?>
Bendera keluaran
drupal_set_title()
Validasi output di Drupal 8 berlawanan dengan Drupal 7. Kita harus secara eksplisit menentukan PASS_THROUGH dan CHECK_PLAIN secara default di Drupal 7, sedangkan di Drupal 8 situasinya berbeda. Output otomatis diloloskan kecuali ditandai aman. Keduanya
t()
dannew FormattableMarkup
mengembalikan objek yang tidak akan lolos otomatis.$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');
}
dan juga Anda dapat menggunakannya hook_preprocess_HOOK()
untuk menimpanya
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
// WRITE YOUR LOGIC HERE,
if ($YOUR_LOGICS === TRUE) {
$variables['title'] = 'New Title';
}
}
Ubah tag judul di kepala dokumen HTML Anda.
function mymodule_preprocess_html(&$variables) {
$variables['head_title']['title'] = $something;
}
Ubah judul yang muncul di konten halaman.
function mymodule_preprocess_block(&$variables) {
if ('page_title_block' == $variables['plugin_id']) {
$variables['content']['#title'] = $something;
}
}
drupal_set_title () di 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 () di 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);
}
Fungsi itu telah dihapus dari Drupal 8.
Ubah catatan:
drupal_set_title () dan drupal_get_title () telah dihapus .
Anda sekarang dapat mengatur judul saat mendefinisikan rute di modulename.routing.yml
. Contoh bagaimana hal itu bisa dilakukan, ditampilkan tautan ubah catatan di atas.
Saya menemukan di D8 bahwa jika Anda ingin mengubah judul untuk tampilan entitas, Anda dapat menggunakan hook_ENTITY_TYPE_view_alter (). Misalnya, inilah cara Anda dapat mengubah tampilan entitas pengguna dengan bidang pada pengguna "field_display_name", alih-alih ID pengguna sebagai judul:
/**
* 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();
}
Saya telah menemukan cara lain, yang mungkin lebih sederhana jika Anda tidak memiliki controller dan ingin mengubah judul di seluruh situs web Anda. Anda dapat menggunakannya untuk mengubah judul berdasarkan simpul saat ini.
Pertama, hapus tag di html.html.twig Anda Lalu, kaitkan hook_page_attachments_alter
function mytemplate_page_attachments_alter(array &$page) {
$page['#attached']['html_head'][] = [
[
'#tag' => 'title',
'#value' => "My title"
],
'title'
];
}
Anda bisa mendapatkan simpul saat istilah taksonomi dengan
$node = \Drupal::routeMatch()->getParameter('node');
$term = \Drupal::routeMatch()->getParameter('taxonomy_term')
Lihatlah Label Entitas Otomatis , modul kontribusi yang dibuat dengan sangat baik untuk mengatur judul node dan sejenisnya.
(Perhatikan bahwa 'judul halaman' adalah cara yang lebih sehari-hari untuk mengatakan 'label entitas', di mana 'halaman' adalah entitas konten dan 'label' mencakup judul dan setara dengan entitas lain misalnya subjek komentar, nama istilah taksonomi.)
Sementara op tampaknya meminta panduan untuk menulis kode khusus, tidak jelas dari detail yang tersedia bahwa kode kustom adalah rekomendasi terbaik. Untuk pembaca tanpa alasan yang sangat spesifik untuk menduplikasi fitur yang tersedia dari kode kontribusi, komunitas Drupal sangat menyarankan (dan pemilik situs mendapat manfaat besar dari) mengadopsi modul yang ada.
drupal_set_title()
dan drupal_get_title()
keduanya dihapus dari drupal 8 tetapi yang terbaik adalah ini ada blok terpisah untuk page_title
. Pengguna dapat menyembunyikan atau menambahkan blok ini di halaman / wilayah mana saja.
Ada 2 solusi untuk ini.
title_block
pada halaman tertentu dan tambahkan blok khusus baru dengan beberapa markup untuk judul. Sekarang tempatkan blok ini tepat setelah title_block
di bagian blok drupal.Dengan menggunakan hook_preprocess_block()
fungsi di custom_theme.theme
file Anda .
Berikut ini contoh kode:
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';
}
}
}
Dalam kasus saya, saya telah menggunakan metode ke-2 di atas, yang hanya akan berfungsi untuk halaman profil pengguna.
Saya berjuang dengan ini dan mencoba semua solusi di atas. Solusi yang akhirnya berhasil adalah:
function mymodule_preprocess_html(&$variables) {
$variables['head_title']['title'] = $something;
}
tetapi hanya setelah saya memperbarui berat modul khusus saya:
drush php:eval "module_set_weight('mymodule', 10);"
Mendapatkan judul halaman berfungsi dengan baik seperti yang tertulis dalam jawaban @ rpayanm. Namun pengaturannya ternyata cukup rumit. Akhirnya ditemukan bahwa hook_preprocess_HOOK()
hanya dapat digunakan untuk preprocess judul halaman dengan mudah.
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
if ($MYLOGIC === TRUE) {
$variables['title'] = 'New Title';
}
}
Dan seperti yang telah disebutkan dalam jawaban lain di sini Anda juga dapat menggunakan hook_preprocess_html()
untuk mengatur tag judul kepala HTML yang sesuai.
saya telah mengubah blok page_title untuk pengguna / uid menjadi nama bidang akun khusus yang berbeda seperti ini:
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;
}
}
}
}