Bagaimana cara mengatur judul halaman?

29

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?

Jeff Madison
sumber

Jawaban:

30

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()dan new FormattableMarkupmengembalikan 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';
  }
}
Yusef
sumber
Mengapa Anda harus menambahkan nama system.site->? Itu ditambahkan sebagai bagian dari judul yang masuk ke kepala html jika Anda memberikan string judul tanpa itu.
anoopjohn
5

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;
  }
}
burung arnoldbird
sumber
4

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);
}
rpayanm
sumber
Judul GET berfungsi dengan baik, mungkin di mana-mana. Saya ingin tahu di mana untuk SET judul, karena di halaman preprocess sepertinya tidak berfungsi.
leymannx
3

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.

Ajit
sumber
3

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();
}
Tyler Fahey
sumber
Pendekatan yang baik dan bersih. Bekerja dengan baik di D8 /
Vishal Kumar Sahu
2

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')
Kodiak
sumber
2

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.

Kay V
sumber
2

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.

  1. Nonaktifkan title_blockpada halaman tertentu dan tambahkan blok khusus baru dengan beberapa markup untuk judul. Sekarang tempatkan blok ini tepat setelah title_blockdi bagian blok drupal.
  2. Dengan menggunakan hook_preprocess_block()fungsi di custom_theme.themefile 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.

Manav
sumber
1

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);"
Peter
sumber
1

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.

leymannx
sumber
0

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;
      }
    }
  }
}
Matoeil
sumber