Sayfa başlığını nasıl ayarlarım?


29

Sayfa başlığını değiştirebileceğimi biliyorum drupal_set_title(t('Amy page title')), ancak Drupal 8'de denediğimde böyle bir işlev hatası yok.

Drupal 8’de sayfa başlığını nasıl değiştirebilirim?

Yanıtlar:


30

Gördüğünüz gibi burada fonksiyon Drupal 8'de kaldırılmış olması.

Artık rotalardaki başlıklar, kullanım durumunuza bağlı olarak çeşitli şekillerde ayarlanabilir. Daha önce sadece drupal_set_title()her yerde deniyordu. Aşağıdaki kullanım durumları mevcuttur:

Statik başlık

Statik başlıklar için yönlendirme tanımında bir '_title' belirlersiniz:

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'

Dinamik başlık

Bir denetleyici yazarsanız ve örneğin site yapılandırmasına bağlı olarak dinamik bir başlığa ihtiyacınız varsa, rota varsayılanlarında _title_callback öğesini kullanı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;
  }
}
?>

Son başlık geçersiz kılma

Bir denetleyici yazarsanız ve başlığı rotadan geçersiz kılmanız gerekirse, oluşturma dizisinde #title döndürebilirsiniz. Bu işlemden genel olarak kaçınılmalıdır, çünkü tam olarak işlendiğinde sayfanın başlığı diğer bağlamlardaki (ekmek kırıntısında olduğu gibi) başlıktan farklı olabilir.

<?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;
  }

}
?>

Çıkış bayrağı drupal_set_title()

Drupal 8'deki çıkış onaylaması Drupal 7'nin karşısındadır. Açıkça PASS_THROUGH ve CHECK_PLAIN'i Drupal 7'de varsayılan olarak belirtmeliyiz, oysa Drupal 8'de durum farklıdır. Güvenli olarak işaretlenmemişse, çıkış otomatik olarak çıkar. Her ikisi de t()ve new FormattableMarkupotomatik olarak kaçamayacak nesneleri döndür.

$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');
}

ve ayrıca hook_preprocess_HOOK()geçersiz kılmak için kullanabilirsiniz

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {
   // WRITE YOUR LOGIC HERE, 
  if ($YOUR_LOGICS === TRUE) {

    $variables['title'] = 'New Title';
  }
}

Neden system.site-> ismini eklemek zorundasın? Bu olmadan bir başlık dizesi sağlarsanız, html başlığına giren başlığın bir parçası olarak eklenir.
anoopjohn

5

HTML belgenizin başlığındaki başlık etiketini değiştirin.

function mymodule_preprocess_html(&$variables) {

  $variables['head_title']['title'] = $something;
}

Sayfa içeriğinde görünen başlığı değiştirin.

function mymodule_preprocess_block(&$variables) {

  if ('page_title_block' == $variables['plugin_id']) {
    $variables['content']['#title'] = $something;
  }
}

4

drupal_set_title () Drupal 8 içinde

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $route->setDefault('_title', 'New Title');
}

drupal_get_title () Drupal 8 içinde

$request = \Drupal::request();
if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
  $title = \Drupal::service('title_resolver')->getTitle($request, $route);
}

GET başlık belki her yerde iyi çalışıyor. Başlığı nerede ayarlayacağımı merak ediyorum, çünkü ön işleme sayfasında işe yaramadı.
leymannx


3

D8'de, varlık görünümü için başlığı değiştirmek istiyorsanız, hook_ENTITY_TYPE_view_alter () yöntemini kullanabileceğinizi öğrendim. Örneğin, başlık olarak kullanıcı kimliği yerine, "field_display_name" kullanıcısı olan bir alana sahip bir kullanıcı varlığının görünümünü nasıl değiştirebileceğinizi buradan görebilirsiniz:

/**
* 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();
}

İyi ve temiz bir yaklaşım. D8'de iyi çalışıyor /
Vishal Kumar Sahu

2

Bir denetleyiciniz yoksa ve web sitenizdeki başlığı değiştirmek istiyorsanız, daha basit olabilecek başka bir yol buldum. Geçerli düğüme göre başlığı değiştirmek için kullanabilirsiniz.

İlk önce, html.html.twig'deki etiketi kaldırın. Sonra hook_page_attachments_alter

function mytemplate_page_attachments_alter(array &$page) {
    $page['#attached']['html_head'][] = [
        [
          '#tag' => 'title',
          '#value' => "My title"
        ],
        'title'
    ];
}

Geçerli taksonomi terim düğümünü alabilirsiniz.

$node = \Drupal::routeMatch()->getParameter('node');
$term = \Drupal::routeMatch()->getParameter('taxonomy_term')

2

Düğüm başlıklarını ve benzerlerini ayarlamak için çok iyi hazırlanmış, katkıda bulunan bir modül olan Otomatik Varlık Etiketi'ne bakın .

('Sayfa başlığının' 'varlık etiketi' demenin daha gizli bir yoludur, burada 'sayfa' bir içerik varlığıdır ve 'etiket' başlığı ve diğer varlıklar için eşdeğerleri içerir, örneğin yorum konuları, taksonomi terimi adları).

Op, özel kod yazma konusunda rehberlik ediyor gibi görünmekle birlikte, mevcut özel detaylardan, özel kodun en iyi öneri olduğu açık değildir. Drupal topluluğu, katkıda bulunan kodda bulunan bir özelliği çoğaltmak için çok özel bir neden içermeyen okuyucular için, mevcut bir modülün kullanılmasını şiddetle tavsiye eder (ve site sahiplerinden kesinlikle faydalanır).


2

drupal_set_title()ve drupal_get_title()her ikisi de drupal 8'den çıkarılır, ancak en iyi bölüm bunun için ayrı bir blok olduğu yönündedir page_title. Kullanıcı bu bloğu herhangi bir sayfaya / bölgeye gizleyebilir veya ekleyebilir.

Bunun için 2 çözüm var.

  1. title_blockBelirli bir sayfada devre dışı bırak ve başlık için bazı biçimlendirme ile yeni bir özel blok ekle. Şimdi bu bloğu title_blockdrupal blok bölümünün hemen arkasına yerleştirin.
  2. Dosyanızdaki hook_preprocess_block()işlevi kullanarak custom_theme.theme.
    İşte kod örneği:

    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';
        }
      }
    }

    Benim durumumda, sadece kullanıcı profili sayfası için çalışacak olan 2. yöntemi kullandım.


1

Bununla mücadele ettim ve yukarıdaki tüm çözümleri denedim. Sonunda işe yarayan çözüm şuydu:

function mymodule_preprocess_html(&$variables) {
  $variables['head_title']['title'] = $something;
}

ancak sadece özel modül ağırlığımı güncelledikten sonra:

drush php:eval "module_set_weight('mymodule', 10);"

1

Sayfa başlığını almak @ rpayanm'ın cevabında yazıldığı gibi çalışıyor. Ancak ayarlanması oldukça karmaşık olduğu ortaya çıktı. Sonunda hook_preprocess_HOOK(), sayfa başlığını önceden kolayca işlemek için kullanılabileceğini öğrendim .

/**
 * Implements hook_preprocess_HOOK().
 */
function MYMODULE_preprocess_page_title(&$variables) {

  if ($MYLOGIC === TRUE) {

    $variables['title'] = 'New Title';
  }
}

Diğer cevaplarda da daha önce de belirtildiği gibi hook_preprocess_html(), HTML başlık başlık etiketini buna göre ayarlamak için de kullanabilirsiniz .


0

user / uid için page_title bloğunu, bunun gibi farklı bir özel hesap alanı adına değiştirdim:

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;
      }
    }
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.