在Magento中,块如何从模型中获取数据?

Ric*_*rma 16 magento

有人可以解释一下吗?

让我告诉你我所知道的.如果前三点好,请解释4点.

  1. 请求来到控制器.
  2. 在Controller Action中,我们启动模型.
  3. 模型收集或生成连接到数据库等所需的所有信息.

之后会发生什么?

  1. 模型如何将数据传输到块,或者块从模型中获取数据?

  2. 模板获取准备好的数据并显示在屏幕上

    • 此外,请求是否再次返回控制器?

请解释.我在几个地方感到困惑.

Ala*_*orm 39

没有任何东西将数据传输到块.在控制器动作完成其模型交互之后,它负责

  1. 加载布局对象(间接加载和创建块对象)

  2. 告诉布局对象渲染页面.

大多数Magento控制器操作在控制器操作结束时执行两次调用.

$this->loadLayout();
$this->renderLayout();
Run Code Online (Sandbox Code Playgroud)

在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;
}    
...
Run Code Online (Sandbox Code Playgroud)

这里,该块的getTagInfo方法直接询问模型的信息.这样,前端模板开发人员可以访问a

$this->getTagInfo();
Run Code Online (Sandbox Code Playgroud)

方法.我还有一个很好的权限,即块的_prepareLayout方法是将大部分(如果不是全部)数据提取到块中的完美位置.

您将看到的第二种模式是Magento注册表模式.这是一个Magento系统,可以让您设置系统范围(但不是PHP)的全局变量.

Mage::register('foo', 'some value');
echo Mage::registry('foo');
Run Code Online (Sandbox Code Playgroud)

有时,Magento开发人员将使用注册表在控制器操作中设置变量,然后在块中取回.例如,在管理控制台的发票控制器中.

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

然后Block会在稍后引用它.

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

我并没有对注册表模式感到愤怒,但它被核心团队使用,所以它可能是犹太人.

最后,如果您希望模拟大多数PHP MVC框架中使用的"哑视图"模式,请尝试这样的事情

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

然后在块和/或模板文件中.

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

echo $this->getAlternateSyntax();
echo $this->getData('alternate_syntax');
Run Code Online (Sandbox Code Playgroud)

打电话后loadLayout,Magento将创建所有块对象.您上面所做的是获取对特定块对象的引用,然后设置其数据.

Per Vinai的评论如下,还有一个assign方法需要考虑.

类似于setData,在调用loadLayout(或从块的_prepareLayout)方法后,你可以做类似的事情

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

然后在你的块的phtml文件中,你将能够输出该视图变量

echo $my_view_var;
Run Code Online (Sandbox Code Playgroud)