Titel auf Routen können jetzt je nach Anwendungsfall auf verschiedene Arten festgelegt werden. Bisher wurde gerade drupal_set_title()
an welcher Stelle auch immer angerufen. Es gibt folgende Anwendungsfälle:
Statischer Titel
Für statische Titel legen Sie in der Routing-Definition einen '_title' fest:
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'
Dynamischer Titel
Wenn Sie einen Controller schreiben und einen dynamischen Titel benötigen, z. B. abhängig von der Site-Konfiguration, verwenden Sie _title_callback in den Routenstandards.
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;
}
}
?>
Final Title Override
Wenn Sie einen Controller schreiben und den Titel von der Route überschreiben müssen, können Sie #title im Render-Array zurückgeben. Dies sollte generell vermieden werden, da der Titel der Seite im vollständig gerenderten Zustand von dem Titel in anderen Kontexten (wie im Breadcrumb) abweichen kann.
<?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;
}
}
?>
Ausgabeflag von drupal_set_title()
Die Ausgabeüberprüfung in Drupal 8 ist im Gegensatz zu Drupal 7. Wir müssen PASS_THROUGH explizit angeben und CHECK_PLAIN ist standardmäßig in Drupal 7, wohingegen in Drupal 8 die Situation anders ist. Die Ausgabe wird automatisch maskiert, sofern sie nicht als sicher markiert ist. Beide t()
und new FormattableMarkup
geben Objekte zurück, die nicht automatisch maskiert werden.
$form['#title'] = $this->t('Add new shortcut');
$form['#title'] = $this->t("'%name' block", array('%name' => $info[$block->delta]['info']));