Предоставление свойств для представлений в 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, так как я видел это не слишком часто.

Author: philwinkle, 2013-02-22

3 answers

Всегда есть assign() и вышеупомянутые геттеры и сеттеры через Varien_Object::_call()

 1
Author: benmarks, 2013-02-24 05:18:09

Ваше редактирование вашего вопроса в значительной степени подводит итог.

Вы используете $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>

Вы можете создать свой собственный метод действий, чтобы установить сам объект пользователя (очевидно, я грубо закодировал строку, но принципал остается в силе).

 3
Author: Ben Lessani - Sonassi, 2013-02-22 17:40:40

Метод toHtml() в Mage_Core_Block_Template включает в себя более или менее файл phtml, поэтому вы находитесь в контексте Блока. Вы можете делать все, что предлагает вам блок или среда Magento.

Использование $this->username не является лучшей практикой. Я думаю, потому что с помощью метода get вы абсолютно свободны изменить что-то позже, не меняя основную логику с массивом данных, расширенным из Varien_Object. Добавьте проверку, замените стандарт __get() на getUsername() и верните что-нибудь еще чем в массиве данных и т.д.

 1
Author: Fabian Blechschmidt, 2015-06-03 10:08:41