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. 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]}
Utwórz prostą klasę modelu, z której dziedziczą
Varien_Object
W kontrolerze Utwórz instancję tego obiektu za pomocą
Mage::getSingleton('foo/bar')
Ustaw wartości na modelu za pomocą magicznego getter/setters (dostajesz je w obiektach, które inherit from
Varien_Object
), orsetData
, etc.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.
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.
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();
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.
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.
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.
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