Предоставление свойств представлениям в Magento
-
16-10-2019 - |
Вопрос
В Zend Framework мы предоставляем свойства макетам, которые затем используются в представлении.Примером этого может быть:
$this->layout = new Zend_Layout();
$this->layout->username = 'John';
$this->layout->email = 'john@foofoobunnies.edu';
Что я позже повторю в своем view.phtml:
<?= $this->username; ?>
<?= $this->email; ?>
Однако я нахожусь в Magento, пишу блочные методы, которые возвращают целые объекты, которые будут использоваться представлением, например:
Блок/Пользователь.php
public function getUser(){
return Mage::getModel('mymodule/user')->load($this->getUserId());
}
И в моем user.phtml:
$user = $this->getUser();
echo $user->getUsername();
echo $this->getEmail();
Есть ли способ избавиться от необходимости писать блочные методы для возврата соответствующих данных?Я использую этот метод в течение 2-3 лет, поэтому он мне не новичок, но мне кажется, что парадигму компоновки двухэтапного/композитного представления Zend гораздо быстрее взломать.
Редактировать
Мне только что пришло в голову, что можно использовать свойства блока так же, как я использую методы блока, например. $this->username
где $this может быть объектом типа Mymodule_User_Block_User
;хотя я не знаю, понятна ли это или принята практика в Magento, поскольку я видел это не слишком часто.
Решение
всегда есть assign()
и вышеупомянутые геттеры и сеттеры через Varien_Object::_call()
Другие советы
Ваше изменение к вашему вопросу в значительной степени подводит итог.
Ты используешь $this
когда блок является экземпляром того, к чему вы пытаетесь получить доступ, конечно, в разумных пределах.Блок не будет эквивалентом соответствующей модели, которая вам нужна.
Но что касается передачи данных в блоки и через них, вы можете использовать XML или PHP для достижения этой цели.
В PHP
$this->getLayout()->getBlock('block_name')->setData('user', Mage::getModel('mymodule/user')->load($this->getUserId()));
Или в XML
<block type="mymodule/user" name="block_name">
<action method="setUserId"><user_id>string_goes_here</user_id></action>
</block>
Вы можете создать свой собственный метод действия для установки самого объекта пользователя (очевидно, я жестко запрограммировал строку, но принцип остается неизменным).
Тем toHtml()
Метод в Mage_Core_Block_Template включает в себя более или менее файл phtml, поэтому вы находитесь в контексте Block.Вы можете делать все, что предлагает вам блок или среда Magento.
С использованием $this->username
это не лучшая практика.Я думаю, потому что с помощью метода get вы абсолютно вольны потом что-то изменить, не меняя основную логику с массивом данных, расширенным из Varien_Object
.Добавить проверку, переопределить стандарт __get()
с getUsername()
и вернуть что-то другое, чем в массиве данных и т.д.