46 votes

Magento - Passage de données entre un contrôleur et un bloc

Je n'ai pas trouvé de réponse satisfaisante à cette question - Quelle est la meilleure façon de passer des données d'un contrôleur à un bloc dans Magento.

Au cas où cela ferait une différence, je charge la mise en page comme suit :

 $this->loadLayout(array('default', 'myModule_default'));

    $this->_initLayoutMessages('customer/session')
         ->_initLayoutMessages('catalog/session')
         ->renderLayout();

Je dois ajouter que j'ai utilisé le registre comme suit :

Dans le contrôleur :

Mage::register('data', $data);

Dans le bloc :

$data = Mage::registry('data');

Je ne suis pas sûr que ce soit la meilleure façon de procéder.

83voto

Alan Storm Points 82442

Ce n'est pas le cas.

Dans l'approche MVC de Magento, il n'est pas de la responsabilité du contrôleur de définir des variables pour la vue (dans le cas de Magento, la vue est constituée de Layout et de blocs). Les contrôleurs définissent des valeurs sur les modèles, puis les blocs lisent à partir de ces mêmes modèles. Dans la vision du monde de Magento, le fait qu'un bloc dépende du contrôleur pour faire une chose spécifique constitue un couplage étroit et doit être évité.

Le rôle de votre contrôleur est de faire certaines choses aux modèles, puis d'indiquer au système qu'il est temps d'effectuer le rendu de la mise en page. C'est tout. C'est le travail de Layout/Blocks d'afficher une page HTML d'une certaine manière en fonction de l'état des modèles du système.

Ainsi, si je voulais émuler les comportements traditionnels de PHP MVC, je devrais

  1. Créer une classe de modèle simple qui hérite de Varien_Object

  2. Dans le contrôleur, instanciez cet objet à l'aide de la méthode Mage::getSingleton('foo/bar')

  3. Définir des valeurs sur le modèle à l'aide de la fonction magique getter/setters (vous les obtenez dans les objets qui héritent de la fonction Varien_Object ), ou setData , etc.

  4. Dans les blocs, instanciez à nouveau le modèle avec un élément Mage::getSingleton('foo/bar') et lire les valeurs en retour.

Lorsque vous instanciez un modèle avec Mage::getSingleton(...) Magento instanciera l'objet en tant que simple . Ainsi, si vous réinstanciez un objet (toujours avec Mage::getSingleton('foo/bar') ), vous obtenez le même objet.

35voto

Vinai Points 9789

Si vous utilisez des blocs qui héritent de _Mage_Core_Block_Template_ (c'est-à-dire qui utilisent un modèle pour s'afficher), vous pouvez assigner des données en utilisant la méthode assign(), une fois que les blocs ont été instanciés par la méthode loadLayout()

$this->loadLayout(array('default', 'myModule_default'));

$this->getLayout()->getBlock('your.block.name.in.the.layout')->assign('data', $data);

Ensuite, dans le modèle .phtml, vous pouvez simplement utiliser

<?php echo $data ?>

Ceci n'est pas utilisé très souvent dans magento, mais comme c'est implémenté en tant que méthodes publiques et donc déclaré stable, je pense que c'est bien de le faire. C'est aussi la raison pour laquelle on commence les variables déclarées dans un template par un trait de soulignement (ex. $_product = $this->getProduct() ), ce qui permet de les distinguer des variables assignées.

4voto

Josh Pennington Points 3088

Ce qui a fonctionné pour moi dans le passé, c'est de définir la variable dans le contrôleur en faisant :

Mage::register('variable', 'value');

Ensuite, dans la vue, vous récupérerez la valeur en utilisant le code suivant :

$variable = $this->getVariable();

2voto

Jonathan Day Points 12496

Vous êtes sur la bonne voie en utilisant le Mage::registry() approche. L'autre option consiste à utiliser des getters et setters automatiques, par exemple $this->setRandomVariableName($data) dans le contrôleur, puis dans le bloc en utilisant $this->getRandomVariableName() . Je n'ai pas cherché à savoir s'ils se retrouvent au même endroit dans la pile (je suppose dans la session car ils sont spécifiques à une requête), mais ils atteignent le même objectif dans le code.

L'utilisation des getters et setters peut parfois prêter à confusion, car il peut sembler que vous accédez aux données par l'intermédiaire de l'ORM plutôt que par une variable de session "temporaire". Mage::registry pour ces types de variables. C'est à vous de choisir.

0voto

Taras Points 86

Vous pouvez utiliser la paire setData / getData pour certaines valeurs. J'ai utilisé setData dans le contrôleur et getData dans le bloc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X