Wiem, że mógłbym zmienić tytuł strony drupal_set_title(t('Amy page title'))
, ale kiedy próbuję go w Drupal 8, pojawia się komunikat Nie ma takiego błędu funkcji .
Jak mogę zmienić tytuł strony w Drupal 8?
Jak widać tutaj, ta funkcja jest przestarzała w Drupal 8.
Tytuły na trasach można teraz ustawić na różne sposoby, w zależności od przypadku użycia. Wcześniej
drupal_set_title()
był nazywany w dowolnym miejscu. Istnieją następujące przypadki użycia:Tytuł statyczny
W przypadku tytułów statycznych ustawiono „_title” w definicji routingu:
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'
Dynamiczny tytuł
Jeśli piszesz kontroler i potrzebujesz dynamicznego tytułu, na przykład w zależności od konfiguracji witryny, użyj _title_callback w ustawieniach domyślnych trasy.
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; } } ?>
Ostateczne zastąpienie tytułu
Jeśli napiszesz kontroler i musisz przesłonić tytuł z trasy, możesz zwrócić #title w tablicy renderowania. Zasadniczo należy tego unikać, ponieważ tytuł strony po pełnym renderowaniu może różnić się od tytułu w innych kontekstach (np. W bułce tartej).
<?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; } } ?>
Flaga wyjściowa z
drupal_set_title()
Sprawdzanie poprawności danych wyjściowych w Drupal 8 jest odwrotne do Drupala 7. Musimy wyraźnie określić PASS_THROUGH, a CHECK_PLAIN jest domyślnie w Drupal 7, podczas gdy w Drupal 8 sytuacja jest inna. Wyjście jest automatycznie wybierane, chyba że jest oznaczone jako bezpieczne. Zarówno
t()
inew FormattableMarkup
obiekty powrotne, że nie będzie auto uciekł.$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');
}
a także możesz użyć, hook_preprocess_HOOK()
aby go zastąpić
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_page_title(&$variables) {
// WRITE YOUR LOGIC HERE,
if ($YOUR_LOGICS === TRUE) {
$variables['title'] = 'New Title';
}
}
Zmień tag tytułowy w nagłówku dokumentu HTML.
Zmień tytuł pojawiający się w treści strony.
źródło
drupal_set_title () w Drupal 8
drupal_get_title () w Drupal 8
źródło
Ta funkcja została usunięta z Drupal 8.
Zmień zapis: drupal_set_title () i drupal_get_title () zostały usunięte .
Możesz teraz ustawić tytuł podczas definiowania tras w
modulename.routing.yml
. Przykład tego, jak można to zrobić, pokazano powyżej link do rekordu zmian.źródło
W D8 znalazłem, że jeśli chcesz zmienić tytuł widoku encji, możesz użyć hook_ENTITY_TYPE_view_alter (). Na przykład oto sposób, w jaki można zmienić widok encji użytkownika za pomocą pola użytkownika „nazwa_wyświetlania pola” zamiast identyfikatora użytkownika jako tytułu:
źródło
Znalazłem inny sposób, który może być prostszy, jeśli nie masz kontrolera i chcesz zmodyfikować tytuł w swojej witrynie. Możesz go użyć do zmodyfikowania tytułu na podstawie bieżącego węzła.
Najpierw usuń znacznik z pliku html.html.twig Następnie zaczep hak_page_attachments_alter
Możesz pobrać bieżący węzeł terminu taksonomii za pomocą
źródło
Spójrz na Automatic Entity Label , bardzo dobrze spreparowany moduł do ustawiania tytułów węzłów i tym podobne.
(Należy zauważyć, że „tytuł strony” to bardziej potoczny sposób na określenie „etykiety jednostki”, gdzie „strona” jest jednostką treści, a „etykieta” obejmuje tytuł i odpowiednik dla innych jednostek, np. Tematów komentarzy, nazw terminów taksonomicznych.)
Chociaż op wydaje się prosić o wskazówki dotyczące pisania niestandardowego kodu, z dostępnych szczegółów nie wynika, że kod niestandardowy jest najlepszą rekomendacją. Dla czytelników bez konkretnego powodu do powielania funkcji dostępnej z kodu, społeczność Drupal zdecydowanie zaleca (i właściciele witryn bardzo korzystają) przyjęcie istniejącego modułu.
źródło
drupal_set_title()
idrupal_get_title()
oba zostały usunięte z drupala 8, ale najlepsze jest to, że jest tam osobny blok dlapage_title
. Użytkownik może ukryć lub dodać ten blok na dowolnej stronie / regionie.Istnieją na to 2 rozwiązania.
title_block
na określonej stronie i dodaj nowy blok niestandardowy z pewnymi znacznikami dla tytułu. Teraz umieść ten blok tuż zatitle_block
sekcją bloku drupala.Korzystając z
hook_preprocess_block()
funkcji wcustom_theme.theme
pliku.Oto przykład kodu:
W moim przypadku użyłem powyżej 2. metody, która będzie działać tylko dla strony profilu użytkownika.
źródło
Walczyłem z tym i wypróbowałem wszystkie powyższe rozwiązania. Ostatecznie działającym rozwiązaniem było:
ale dopiero po zaktualizowaniu wagi niestandardowego modułu:
źródło
Uzyskiwanie tytułu strony działa dobrze, jak napisano w odpowiedzi @ rpayanm. Ale ustawienie go okazało się dość skomplikowane. W końcu odkryłem, że
hook_preprocess_HOOK()
można go po prostu dość łatwo wstępnie przetworzyć tytuł strony.I jak już wspomniano w innych odpowiedziach tutaj, możesz dodatkowo użyć,
hook_preprocess_html()
aby odpowiednio ustawić znacznik tytułu nagłówka HTML.źródło
zmieniłem blok page_title dla user / uid na inną nazwę pola niestandardowego konta, taką jak:
źródło