Magento-Przekazywanie danych między kontrolerem a blokiem

Bardzo szybkie i proste pytanie, ale nie mogę znaleźć przyzwoitej odpowiedzi na to pytanie-Jaki jest najlepszy sposób przekazywania danych z kontrolera do bloku w Magento.

Co za różnica, Ładuję layout w następujący sposób:

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

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

Dodam, że korzystałem z rejestru w następujący sposób:

W kontrolerze:

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

W bloku:

$data = Mage::registry('data');
Nie wiem, czy to najlepszy sposób.
Author: Jonathan Day, 2010-10-24

6 answers

Nie wiesz.]}

W podejściu Magento do MVC, kontroler nie jest odpowiedzialny za ustawianie zmiennych dla widoku(w przypadku Magento, Widok to układ i bloki). Kontrolery ustawiają wartości na modelach, a następnie blokują odczyt z tych samych modeli. W spojrzeniu Magento na świat, posiadanie bloku polegającego na sterowniku wykonującym określoną rzecz jest ciasnym połączeniem i należy go unikać.

Twoim zadaniem kontrolera jest wykonanie pewnych czynności z modelami, a następnie poinformowanie systemu to czas renderowania układu. To wszystko. Zadaniem układu / bloków jest wyświetlanie strony HTML w określony sposób w zależności od stanu modeli systemu.

Więc, gdybym chciał emulować tradycyjne zachowania MVC PHP, to]}

  1. Utwórz prostą klasę modelu, z której dziedziczą Varien_Object

  2. W kontrolerze Utwórz instancję tego obiektu za pomocą Mage::getSingleton('foo/bar')

  3. Ustaw wartości na modelu za pomocą magicznego getter/setters (dostajesz je w obiektach, które inherit from Varien_Object), or setData, etc.

  4. W blokach ponownie utwórz instancję modelu za pomocą Mage::getSingleton('foo/bar') i odczytaj wartości z powrotem.

Kiedy tworzysz instancję modelu za pomocą Mage::getSingleton(...) Magento utworzy instancję obiektu jako singleton. Tak więc, jeśli ponownie utworzysz instancję obiektu (ponownie za pomocą Mage::getSingleton('foo/bar')), odzyskasz ten sam obiekt.

 81
Author: Alan Storm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-24 02:10:51

Jeśli używasz bloków, które dziedziczą Mage_Core_Block_Template (tj. że używa szablonu do wyświetlenia) można przypisać dane za pomocą metody assign (), po utworzeniu bloków przezloadLayout()

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

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

Następnie, w .szablon phtml, możesz po prostu użyć

<?php echo $data ?>

Nie jest to często używane w magento, ale ponieważ jest zaimplementowane jako publiczne metody, a tym samym uznane za stabilne, uważam, że dobrze jest to zrobić. To także powód rozpoczęcia konwencji zmienne zadeklarowane w szablonie z podkreślnikiem (np. $_product = $this->getProduct()), dzięki czemu można je odróżnić od przypisanych zmiennych.

 35
Author: Vinai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 14:11:47

Co mi w tym pomogło ustawić zmienną w kontrolerze wykonując:

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

A następnie w widoku można pobrać wartość za pomocą następującego kodu:

$variable = $this->getVariable();
 4
Author: Josh Pennington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-23 23:51:59

Jesteś na dobrej drodze, używając podejścia Mage::registry(). Inną opcją jest użycie automatycznych getterów i setterów, np. $this->setRandomVariableName($data) w kontrolerze, a następnie w bloku użyj $this->getRandomVariableName(). Nie sprawdzałem, czy kończą w tym samym miejscu w stosie (zakładam, że w sesji, ponieważ są specyficzne dla żądań), ale osiągają ten sam cel w kodzie.

Używanie getterów i setterów może czasami być mylące, ponieważ może to wyglądać tak, jakbyś uzyskiwał dostęp do danych za pośrednictwem ORM zamiast" tymczasowej " zmiennej sesyjnej, więc możesz podjąć decyzję o spójności w stylu kodowania, aby użyć Mage::registry dla tych typów zmiennych. Twój wybór.

 2
Author: Jonathan Day,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-23 22:22:17

Możesz użyć pary setData / getData dla niektórych wartości. Użyłem setData w controllerze i getData w bloku.

 0
Author: Taras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-12 09:04:24

@ Drew z jakimś tłem w JavaServer i raczej nowym w PHP / Magento chciałbym stwierdzić, że

"'share nothing ' Architektura PHP",

Zobacz PHP nie jest Javą: Session Management Whitepaper " , prowadzi do tego, że wszystkie obiekty (a nawet klasy) w PHP mają zakres "request".

Jeśli mam Alans point to radzi użyć

  • 'stateful' obiekt modelu, który ma pewne dane w swoich atrybutach, które niekoniecznie są przechowywane w bazie danych
  • i wzorzec Singletona, za pomocą Mage:: getSingleton, aby uczynić ten Stanowy model, który jest instancyjny w kontrolerze, dostępnym do bloku, a zatem w rzeczywistym szablonie, który renderuje wyjście.

A ponieważ narzędzie takie jak MTool skraca czas tworzenia nowego modelu, to naprawdę wydaje się mieć sens.

 0
Author: paderEpiktet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-05 12:52:43