有人可以解释一下吗?
让我告诉你我所知道的。如果前三点不错,请解释第四点。
之后会发生什么?
请解释。我在几个地方感到困惑。
最佳答案
没有任何东西将数据传输到 block 。在 Controller Action 完成其模型交互后,它负责
大多数 Magento Controller 操作在 Controller 操作结束时通过两次调用来完成此操作。
$this->loadLayout();
$this->renderLayout();
在 Magento 中,没有任何东西在 View 上设置数据。相反, View (即 block 对象)询问系统为数据。您可以在
Mage_Tag_Block_Customer_View
中看到一个示例。 block 类。#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;
}
...
在这里,这个区 block 的
getTagInfo
方法直接向模型询问其信息。这样,前端模板开发人员可以访问$this->getTagInfo();
方法。我也有它 good authority一个区 block 的
_prepareLayout
方法是将大部分(如果不是全部)数据获取代码放在一个 block 中的理想场所。您将看到使用的第二种模式是 Magento 注册表模式。这是一个 Magento 系统,可让您设置系统范围(但不是 PHP)的全局变量。
Mage::register('foo', 'some value');
echo Mage::registry('foo');
有时,Magento 开发人员会使用注册表在 Controller 操作中设置变量,然后在 block 中抓取。例如,在管理控制台的发票 Controller 中。
#File: app/code/core/Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php
protected function _initInvoice()
{
...
$invoice = Mage::register('current_invoice', $invoice);
return $invoice;
}
然后一个 Block 稍后会引用它。
#File: app/code/core/Mage/Sales/Block/Order/Print/Invoice.php
public function getInvoice()
{
return Mage::registry('current_invoice');
}
我对注册表模式并不感兴趣,但它被核心团队使用,所以它可能是洁净的。
最后,如果你想模拟大多数 PHP MVC 框架中使用的“哑 View ”模式,试试这样的
$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->setSomeData('My Data');
$block->setData('alternate_syntax', 'Some other data');
$this->renderLayout();
然后在 block 和/或模板文件中。
echo $this->getSomeData();
echo $this->getData('some_data');
echo $this->getAlternateSyntax();
echo $this->getData('alternate_syntax');
调用后
loadLayout
, Magento 将创建所有的 block 对象。您在上面所做的是获取对特定 block 对象的引用,然后设置其数据。根据 Vinai 在下面的评论,还有一个区 block 的
assign
方法来考虑。类似于
setData
, 调用 loadLayout
后(或从 block 的 _prepareLayout
)方法,您可以执行类似的操作$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->assign('my_view_var','Something for the view');
$this->renderLayout();
然后在你的区 block 的
phtml
文件,您将能够输出该 View 变量echo $my_view_var;
关于magento - 在 Magento 中, block 如何从模型中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9763797/