В Magento как блоки захватывают данные из моделей? - PullRequest
16 голосов
/ 19 марта 2012

Может кто-нибудь объяснить это?

Позвольте мне рассказать вам, что я знаю. Если первые три пункта хороши, объясните, пожалуйста, 4 пункта.

  1. Запрос пришел к контроллеру.
  2. В Controller Action мы запускаем Модели.
  3. Модели собирают или генерируют всю информацию, необходимую для подключения к базе данных и т. Д.

Что происходит после этого?

  1. Как модели передают данные в блоки или блоки получают данные из моделей?

  2. Шаблоны получают подготовленные данные и отображают на экране

    • Кроме того, запрос снова возвращается к контроллеру?

Пожалуйста, объясните. Я запутался в нескольких местах.

Ответы [ 3 ]

39 голосов
/ 19 марта 2012

Ничто не передает данные в блоки. После того, как действие контроллера выполнит взаимодействие модели, он отвечает за

  1. Загрузка объекта макета (который косвенно загружает и создает блочные объекты)

  2. Скажите этому объекту макета визуализировать страницу.

Большинство действий контроллера Magento делают это с двумя вызовами в конце действия контроллера.

$this->loadLayout();
$this->renderLayout();

В Magento ничто не устанавливает данные в представлении. Вместо этого представление (то есть блочные объекты) запрашивает данные у системы . Вы можете увидеть пример этого в классе блока Mage_Tag_Block_Customer_View.

#File: app/code/core/Mage/Tag/Block/Customer/View.php    
...
public function getTagInfo()
{
    if (is_null($this->_tagInfo)) {
        $this->_tagInfo = Mage::getModel('tag/tag')
            ->load($this->getTagId());
    }
    return $this->_tagInfo;
}    
...

Здесь метод getTagInfo этого блока запрашивает у модели информацию. Таким образом, разработчик шаблонов внешнего интерфейса получает доступ к

$this->getTagInfo();

метод. У меня также есть хороший авторитет , что метод _prepareLayout блока является идеальным местом для помещения большей части, если не всех, вашего кода извлечения данных в блок.

Второй шаблон, который вы увидите, это шаблон реестра Magento. Это система Magento, которая позволяет устанавливать общесистемную (но не PHP) глобальную переменную.

Mage::register('foo', 'some value');
echo Mage::registry('foo');

Иногда разработчик Magento использует реестр для установки переменной в действии контроллера, а затем захват возвращается в блоках. Например, в контроллере счетов консоли администратора.

#File: app/code/core/Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php
protected function _initInvoice()
{
    ...
    $invoice = Mage::register('current_invoice', $invoice);
    return $invoice;
}    

и затем Блок будет ссылаться на него позже.

#File: app/code/core/Mage/Sales/Block/Order/Print/Invoice.php
public function getInvoice()
{
    return Mage::registry('current_invoice');
}

Я не в восторге от шаблона реестра, но он используется основной командой, так что он, вероятно, кошерный.

Наконец, если вы хотите эмулировать шаблон «тупого представления», используемый в большинстве сред PHP MVC, попробуйте что-то вроде этого

$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->setSomeData('My Data');
$block->setData('alternate_syntax', 'Some other data');
$this->renderLayout();

и затем в файле блока и / или шаблона.

echo $this->getSomeData();
echo $this->getData('some_data');

echo $this->getAlternateSyntax();
echo $this->getData('alternate_syntax');

После того, как вы позвоните loadLayout, Magento создаст все объекты блока. То, что вы делаете выше, это получение ссылки на конкретный объект блока, а затем установка его данных.

Согласно комментариям Vinai ниже, есть также метод assign блока, который нужно рассмотреть.

Аналогично setData, после вызова loadLayout (или из _prepareLayout) блока вы можете сделать что-то вроде

$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->assign('my_view_var','Something for the view');
$this->renderLayout();

и затем в файле phtml вашего блока вы сможете вывести эту переменную представления

echo $my_view_var;
3 голосов
/ 19 марта 2012
  1. Правильно, через передний контроллер и роутеры
  2. Не совсем.Реализация ViewModel в Magento частично облегчается тем, что представления (блоки) создают свои собственные модели.
  3. Да, через модели ресурсов.

Когда блоки визуализируются с помощью типичного $this->loadLayout()->renderLayout()поток в контроллере действий, если они используют шаблоны, эти шаблоны include() d во время рендеринга.

После вызова renderLayout() выполнение все еще находится в рамках действия контроллера, которое мы отправилиТаким образом, вы можете получить доступ к предоставленному ответу, получив объект запроса.

Ключевые точки графика:

  1. index.php звонки Mage::run()
  2. Mage::run звонкиMage_Core_Model_App::run()
  3. App::run() вызывает Mage_Core_Controller_Varien_Front, сначала его метод init(), который собирает и настраивает маршрутизаторы, затем dispatch(), который выполняет следующее:

    a.URL базы данных перезаписывается

    b.Конфигурация переписывается (устарела)

    c.Соответствуйте правильному действию контроллера через маршрутизатор.Выполнение переходит с Front Controller на контроллер действий.Вызов блоков с использованием макета или вручную передаст выполнение классам блоков, моделям и шаблонам, а затем мы (обычно) вернемся к действию контроллера.

    d.Отправка объекта ответа (в предположении, что он был изменен контроллером действий).

Если вы посмотрите на Mage_Core_Controller_Varien_Front::dispatch(); you'll see the call to $ this-> getResponse () -> sendResponse ();`который сбрасывает вывод, которому предшествует событие (controller_front_send_response_before), которое можно использовать как ловушку для добавления или манипулирования чем-либо связанным с ответом.

1 голос
/ 19 марта 2012

Нет, он покидает контроллер (тот, который управляет запросом), а затем перемещается в представления, где он отображается.Как только представление (block [s]) рендерится, запрос по существу завершен (за исключением в основном помощников по URL, которые не имеют логики говорить, но иногда обрабатываются в контроллере после рендеринга представления.), Если у вас нет какого-либо видавпоследствии срабатывает ловушка.

Я использую эту блок-схему и эту серию (Алан Шторм - парень), чтобы узнать о маршрутизации запросов Magento.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...