web-dev-qa-db-fra.com

$ this-> set ('title', 'Title Name'); ne fonctionne pas dans CakePHP 3.x

En gros dans default.ctp, j'ai ceci pour mon titre:

<title>
  <?= $this->fetch('title') ?>
</title>

Et à l'intérieur du contrôleur, j'ai cette ligne:

$this->set('title', 'Test-Title');

Mais cela ne fait rien, il affiche toujours le nom du contrôleur (Jobs, nom complet du contrôleur via JobsController.ctp)

Mais si je mets cela à l'intérieur de mon fichier de vue:

$this->assign('title', 'Test-Title');

Cela change le titre. Alors qu'est-ce qui ne va pas avec $ this-> set ('title', $ title)?

9
Tachi

Vous pouvez simplement set() la variable dans votre contrôleur:

// View or Controller
$this->set('title', 'Test-title');

Ensuite, utilisez-le comme une variable standard dans votre mise en page ou votre vue:

<!-- Layout or View -->
<title>
    <?php echo $title; ?>
</title>

Détails ici: http://book.cakephp.org/3.0/en/views.html#setting-view-variables

Utiliser assign() est différent, c'est pourquoi il fonctionne avec fetch(). assign() est utilisé avec les blocs de vues: http://book.cakephp.org/3.0/en/views.html#using-view-blocks

12
Dave

fetch() renvoie le contenu d'un bloc et non une variable. Utiliser set() dans votre contrôleur permet de définir une variable pouvant être affichée dans vos modèles de vue en faisant écho à la variable: -

<?php echo $title; ?>

Si vous souhaitez utiliser fetch(), vous devez l’utiliser en combinaison avec assign() dans les modèles d’affichage pour définir le bloc. Par exemple, dans votre modèle de vue, utilisez: -

<?php $this->assign('title', $title); ?>

Et puis dans le modèle de mise en page: -

<title><?php echo $this->fetch('title'); ?></title>

Dans CakePHP 3, l’idée est de définir le titre de la page en l’affectant dans la Vue en ce qui concerne le rendu de la page. Cela diffère de la façon dont cela a été traité à l'origine dans CakePHP 2, dans lequel vous définiriez title_for_layout dans votre contrôleur, puis feriez écho à la variable $title_for_layout dans le gabarit de présentation (elle était déconseillée au profit de l'approche CakePHP 3 dans les versions ultérieures de Cake 2).

20
drmonkeyninja

Si vous voulez vous en tenir à votre code, après avoir défini la variable "title", écrivez simplement ceci:

    <?= __('Main Project Name') ?>
    <?php if( isset($title)) $this->assign('title', $title); ?>
    <?= ' - ' . $this->fetch('title') ?>
0
Nima Rahbar

J'ai fait ceci, de cette façon dans default.ctp

<?php
    $cakeDescription = __d('cake_dev', 'Your Title');
?>

<title>
    <?php echo $cakeDescription ?>: <?php echo $title_for_layout; ?>
</title>

Dans mon fichier de vue, je l'ai fait.

<?php $this->assign('title', 'Your Title');?>
0
A.A Noman

Juste pour terminer, je suis tombé sur une situation où un script .js malformé avec des variables non définies référencées entre <head></head> entraînait l'affichage des balises <title></title> dans DOM (affiché dans le code source de la page), mais Chrome, Firefox et (de la mémoire )MSIE all n'a pas réussi à transmettre le contenu du titre à l'interface utilisateur de l'APP, toujours de mémoire - iOS mobile n'a pas été affecté.

0
Mat Witts

Dans le modèle de présentation CakePHP 3, assurez-vous de définir le titre comme ci-dessous. 

<title>
    <?= $this->fetch('title') ?>    
</title>

Alors à votre avis:

<?php $this->assign('title', 'Title Name'); ?>

C’est ainsi que CakePHP utilisera ses classes View intégrées pour gérer les scénarios de rendu de titre de page (blocs de vue).