Magento-passer des données entre un contrôleur et un bloc

Question très rapide et simple mais je ne trouve pas de réponse décente à cela-Quelle est la meilleure façon de transmettre 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 devrais ajouter, que j'ai utilisé le Registre comme suit:

Dans le contrôleur:

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

Dans le bloc:

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

Ne sais Pas si c'est la meilleure façon de le faire bien.

46
demandé sur Jonathan Day 2010-10-24 01:34:28

6 réponses

Vous ne le faites pas.

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 la mise en page et les blocs). Les contrôleurs définissent des valeurs sur les Modèles, puis bloquent la lecture de ces mêmes modèles. Dans la vision du monde de Magento, avoir un bloc reposant sur le contrôleur faisant une chose spécifique est un couplage serré, et devrait être évité.

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

Donc, si je voulais émuler les comportements MVC PHP traditionnels, je

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

  2. Dans le contrôleur, instanciez cet objet en utilisant Mage::getSingleton('foo/bar')

  3. Définissez des valeurs sur le modèle en utilisant les getter/setters magiques (vous les obtenez dans des objets qui hériter de Varien_Object), ou setData, etc.

  4. Dans les blocs, instanciez à nouveau le modèle avec un Mage::getSingleton('foo/bar') et relisez les valeurs.

Lorsque vous instanciez un modèle avec Mage::getSingleton(...) Magento instanciera l'objet en tant que singleton . Donc, si vous ré-instanciez un objet (encore une fois avec Mage::getSingleton('foo/bar')), vous récupérez le même objet.

81
répondu Alan Storm 2010-10-24 02:10:51

Si vous utilisez des blocs qui héritent Mage_Core_Block_Template (c'est-à-dire que vous utilisez un modèle pour afficher) vous pouvez attribuer des données en utilisant la méthode assign (), une fois que les blocs ont été instanciés par 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 ?>

Ce n'est pas très souvent utilisé dans magento, mais comme il est implémenté en tant que méthodes publiques et donc déclaré stable, je crois que c'est bien de le faire. C'est aussi la raison pour laquelle la convention commence les variables déclarées dans un modèle avec un trait de soulignement (par exemple $_product = $this->getProduct()), de sorte qu'elles peuvent être distinguées des variables assignées.

35
répondu Vinai 2016-02-02 14:11:47

Ce qui a fonctionné pour moi dans l'est de définir la variable dans le contrôleur par:

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

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

$variable = $this->getVariable();
4
répondu Josh Pennington 2010-10-23 23:51:59

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

L'utilisation des getters et des setters peut parfois être source de confusion car il peut sembler que vous accédez aux données via L'ORM plutôt qu'une variable de session "temporaire", vous pouvez donc prendre la décision d'utiliser Mage::registry pour ces types de variables. Votre choix vraiment.

2
répondu Jonathan Day 2010-10-23 22:22:17

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

0
répondu Taras 2011-07-12 09:04:24

@ Drew avec un peu d'arrière-plan dans JavaServer Faces et plutôt nouveau en PHP / Magento je voudrais indiquer que le

"'partager rien" architecture de PHP",

Voir PHP N'est pas Java: Session Management Whitepaper ", conduit au fait que tous les objets (et même les classes) en PHP ont la portée "request".

Si J'ai Alans point alors il conseille d'utiliser

  • un objet modèle 'avec État' qui a des données dans ses attributs qui ne sont pas nécessairement stockées dans la base de données
  • et le modèle singleton, par L'utilisation de Mage::getSingleton, pour rendre ce modèle avec État, instancié dans le contrôleur, accessible au bloc et donc dans le modèle réel qui rend la sortie.

Et depuis un outil comme MTool réduit le temps de créer un nouveau modèle, cela semble vraiment un sens.

0
répondu paderEpiktet 2011-08-05 12:52:43