Вопрос

В 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() и вернуть что-то другое, чем в массиве данных и т.д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top