Предоставление свойств для представлений в Magento
В Zend Framework мы предоставляем свойства макетам, которые затем используются в представлении. Примером этого может быть:
$this->layout = new Zend_Layout();
$this->layout->username = 'John';
$this->layout->email = '[email protected]';
, Который я позже повторил бы в своем представлении.phtml:
<?= $this->username; ?>
<?= $this->email; ?>
Однако я нахожусь в методах блока записи Magento, которые возвращают целые объекты для использования представлением - например:
Block/User.php
public function getUser(){
return Mage::getModel('mymodule/user')->load($this->getUserId());
}
И в моем пользователе.phtml:
$user = $this->getUser();
echo $user->getUsername();
echo $this->getEmail();
Есть ли какой-нибудь способ исключить этот шаг о необходимости писать блочные методы для возврата соответствующих данных? Я использую этот метод в течение 2-3 лет, так что я не новичок в нем, но мне просто кажется, что парадигму двухэтапного/составного представления Zend гораздо быстрее взломать.
Редактировать
Мне только что пришло в голову, что можно использовать свойства блоков таким же образом, как я использую методы блоков, например, $this->username
, где $это может быть объект типа Mymodule_User_Block_User
; хотя я не знаю, является ли это понятным или принятая практика в Magento, так как я видел это не слишком часто.
3 answers
Всегда есть 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, поэтому вы находитесь в контексте Блока. Вы можете делать все, что предлагает вам блок или среда Magento.
Использование $this->username
не является лучшей практикой. Я думаю, потому что с помощью метода get вы абсолютно свободны изменить что-то позже, не меняя основную логику с массивом данных, расширенным из Varien_Object
. Добавьте проверку, замените стандарт __get()
на getUsername()
и верните что-нибудь еще чем в массиве данных и т.д.