web-dev-qa-db-fra.com

Comment passer des variables à layout.phtml globalement dans ZF2?

Je souhaite transmettre une série de variables à mon layout.phtml dans l'ensemble de l'application (globalement). Et par là, je veux dire que je ne veux pas utiliser

$this->layout()->someVar = someValue;

dans chacune de mes actions, ce serait beaucoup de travail supplémentaire et de code. Alors, y a-t-il un moyen de le faire dans un seul endroit? Ou ce que j'ai mentionné est tout ce que j'ai! J'espère pas :)

Peut-être en utilisant des sessions? - Rémi Thomas

Merci pour la solution. Pour le moment, c'est ce que j'utilise. Pour les informations d’utilisateur connecté, les paramètres de système et d’agencement, ainsi que la liste des ACL. Mais le problème est que je dois définir un nouvel objet dans le layout.phtml, ce que je ne pense pas approprié, n'est-ce pas? J'ai lu quelque part que toutes les données que nous devons utiliser dans les modèles de vue devraient lui être transmises à l'aide des actions du contrôleur. Et surtout, je ne suis pas un adepte des moindres recoins, alors s’il existe une façon propre de le faire, je préférerais ne pas le faire de cette façon. Et récemment, je dois obtenir le nombre de messages non lus pour chaque utilisateur et l’utiliser dans layout.phtml. Donc, si je le fais dans layout.phtml, c'est BEAUCOUP de script php dans un modèle de vue ou une mise en page.

Merci

28
Milad.Nozari

Le moyen le plus propre et le plus propre consiste à utiliser un ViewHelper, comme le suggère Orochi. Voici quelques instructions pour créer votre propre ViewHelper: http://framework.zend.com/manual/2.2/fr/modules/zend.view.helpers.advanced-usage.html . Ce n'est pas trop complexe;)

Cependant, votre problème pourrait être résolu également d'une autre manière. En supposant que les variables dont vous avez besoin contiennent des valeurs fournies par des services déjà présents dans votre application (puis exposés par ZF2 ServiceManager), vous pouvez ajouter quelques lignes à la fonction "onBoostrap" dans votre module.php (par exemple, sur le module d’application).

Voici un exemple:

public function onBootstrap($e) {

    $serviceManager = $e->getApplication()->getServiceManager();
    $viewModel = $e->getApplication()->getMvcEvent()->getViewModel();

    $myService = $serviceManager->get('MyModule\Service\MyService');

    $viewModel->someVar = $myService->getSomeValue();

}

De cette façon, vous écrivez la tâche dans un seul endroit. La variable est alors accessible comme d'habitude:

$this->layout()->someVar;
40
stefanovalle

C'est exactement ce que vous voulez...

// Do this inside your Controller before you return your ViewModel
$this->layout()->setVariable('stack', 'overflow');

// Then inside your layout.phtml
echo $this->stack;

Aucun assistant de vue, aucun gestionnaire d'événements, aucun gestionnaire de services ou autre méthode de classe jonglant. Pourquoi les gens sur Stack compliquent-ils parfois les choses?

33
Timothy Perez

Créez votre propre ViewHelper pour cela. 

MODIFIER:

Voilà comment je le fais: dans le dossier src de votre module, je crée un nouveau dossier View, puis dans ce dossier View, je crée un autre dossier appelé Helper. Dans ce dossier, je crée mes classes d'assistance. Ainsi, par exemple, je crée un fichier Navigation.php. Dans ce fichier, je crée une classe appelée Navigation, qui s'étend de AbstractHelper (utilisez Zend\View\Helper\AbstractHelper). Ensuite, j'écris du code dans la fonction publique __invoke (), qui renvoie également un résultat. Vous devez également ajouter votre classe d'assistance de vue à 'view_helpers' dans config/module.config.php du module, quelque chose comme ça:

'view_helpers' => array(
    'invokables' => array(
        'nav' => 'Application\View\Helper\Navigation',
    ),
),

Vous pouvez ensuite appeler votre méthode de navigation comme méthode à l’intérieur de votre vue ou de votre présentation, par exemple nav ();?>

2
Orochi

Dans votre application/module.php 1) Créez un événement Dispatch pour zend framework comme ceci:

public function onBootstrap(MvcEvent $e)
{ 
    $eventManager        = $e->getApplication()->getEventManager();
    $eventManager->attach('dispatch', array($this, 'loadConfiguration' ));
}    
public function loadConfiguration(MvcEvent $e)
{           
      $controller = $e->getTarget();
      $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE;
}

2) Maintenant, vous pouvez accéder à votre variable définie dans votre mise en page comme ceci: $ this-> YOUR_VARIABLE_NAME;

2
chahat561

Vous pouvez transmettre une variable globale à votre présentation à partir de Application/Module.php dans ZendFramework 2 en utilisant ModuleManager comme ci-dessous:

Dans votre application/module.php

Étape 1:

use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\Mvc\MvcEvent;

Étape 2:

class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{    
    public function onBootstrap(MvcEvent $e)
    { 
        $eventManager        = $e->getApplication()->getEventManager();
        $eventManager->attach('dispatch', array($this, 'loadConfiguration' ));
    }    
    public function loadConfiguration(MvcEvent $e)
    {           
          $controller = $e->getTarget();
          $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE;
    }


  // Your remaining code here....

}

Étape 3:

Dans votre fichier layout.phtml .__, utilisez votre variable sous la forme $this->YOUR_VARIABLE_NAME 

J'espère que ça aide.

0
KumarA

Pourquoi ne pas utiliser l'héritage pour résumer une configuration répétable via un contrôleur de base qui définit les variables de mise en page. Puisque la réutilisation est la principale préoccupation ici, une OOP de base devrait suffire. Zend n'a pas à tout faire :).

0
F.O.O