在Magento中,块如何从模型中获取数据?
有人能解释一下吗 让我告诉你我所知道的。如果前三点是好的,请解释这四点在Magento中,块如何从模型中获取数据?,magento,magento-1.9,magento-1.4,Magento,Magento 1.9,Magento 1.4,有人能解释一下吗 让我告诉你我所知道的。如果前三点是好的,请解释这四点 请求到达控制器 在控制器动作中,我们启动模型 模型通过连接数据库等收集或生成所需的所有信息 那之后会发生什么 模型如何将数据传输到块,或块如何从模型获取数据 模板获取准备好的数据并显示在屏幕上 此外,请求是否再次返回控制器 请解释一下。我在几个地方感到困惑。不,它离开控制器(控制请求的控制器),然后移动到视图,在那里进行渲染。一旦视图(块)呈现,请求基本上就结束了(除了大部分url帮助程序,它们没有逻辑可言,但有时在呈现
- 此外,请求是否再次返回控制器
请解释一下。我在几个地方感到困惑。不,它离开控制器(控制请求的控制器),然后移动到视图,在那里进行渲染。一旦视图(块)呈现,请求基本上就结束了(除了大部分url帮助程序,它们没有逻辑可言,但有时在呈现视图后在控制器中处理),除非之后触发了某种钩子 我使用and(Alan Storm就是那个家伙)来了解Magento请求路由
$this->loadLayout()->renderLayout()
流进行渲染时,如果它们使用模板,则这些模板在渲染时为include()
d
调用renderLayout()
后,执行仍在我们调度到的控制器操作的范围内,因此您可以通过获取请求对象来访问呈现的响应
关键绘图点:
Mage::run()
Mage::run
调用Mage\u Core\u Model\u App::run()
App::run()
调用Mage\u Core\u Controller\u Varien\u Front
,首先调用收集和设置路由器的init()
方法,然后调用执行以下操作的dispatch()
:
a。数据库URL重写
b。配置重写(已弃用)
c。通过路由器匹配正确的控制器操作。执行从前控制器跳到动作控制器。使用布局或手动调用块,然后将执行传递给块类、模型和模板,然后(通常)返回控制器操作
$this->loadLayout();
$this->renderLayout();
d。发送响应对象(假设它已被动作控制器更改)如果您查看
Mage_Core_Controller_Varien_Front::dispatch();您将看到对
$this->getResponse()->sendResponse();`它将刷新输出,之前有一个事件(控制器前发送响应前),该事件可用作钩子来添加或操作任何与响应相关的内容。无任何内容将数据传输到块。在控制器动作完成其模型交互后,它负责
$this->loadLayout();
$this->renderLayout();
在Magento中,没有设置视图上的数据。相反,视图(即块对象)向系统询问数据。您可以在Mage\u Tag\u Block\u Customer\u视图
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;
}
...
在这里,这个块的getTagInfo
方法直接向模型询问它的信息。这样,前端模板开发人员就可以访问
$this->getTagInfo();
方法。我还认为块的\u prepareLayout
方法是将大部分(如果不是全部)数据获取代码放入块的最佳位置
您将看到使用的第二个模式是Magento注册表模式。这是一个Magento系统,允许您设置系统范围(但不是PHP)全局变量
Mage::register('foo', 'some value');
echo Mage::registry('foo');
有时,Magento开发人员将使用注册表在控制器操作中设置变量,然后grab将返回到块中。例如,在管理控制台的发票控制器中
#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');
}
我不喜欢注册表模式,但它是由核心团队使用的,所以它可能是犹太的
最后,如果您希望模拟大多数PHPMVC框架中使用的“哑视图”模式,请尝试以下方法
$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将创建所有块对象。上面所做的是获取对特定块对象的引用,然后设置其数据
根据VIAI的评论,还有一个块的代码>赋值< /Cord>方法要考虑。
与setData
类似,在调用loadLayout
(或从块的\u 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;
从技术上讲,渲染工作流的典型请求使用
renderLayout()
,然后在控制器操作中继续执行。响应对象在控制器操作中在renderLayout()
之后被更改,这不是常见的情况,因此下一行通常是方法的结尾,因此返回到前控制器/艾伦,我们应该开始协调。您的回答是最好的,因为它回答了OPs隐含的问题,即“Magento,您没有像大多数PHP MVC那样呈现吗?”,这是我们都问过的问题…:-汉克斯·艾伦,你总结得很好!我唯一能想到添加的是模板块的assign()
方法。很少使用,但有些人更喜欢它而不是setData()
,因为它与经典的“分配模板变量”应用程序相匹配