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?
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:
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()
venew FormattableMarkup
otomatik 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';
}
}
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;
}
}
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);
}
Bu işlev Drupal 8'den kaldırıldı.
Değişiklik kaydı:
drupal_set_title () ve drupal_get_title () kaldırıldı .
Artık rotaları tanımlarken başlığı ayarlayabilirsiniz modulename.routing.yml
. Bunun nasıl yapılabileceğine örnek, yukarıdaki değişiklik kaydı bağlantısını gösteriyor.
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();
}
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')
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).
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.
title_block
Belirli 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_block
drupal blok bölümünün hemen arkasına yerleştirin.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.
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);"
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 .
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;
}
}
}
}