Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Magento中,块如何从模型中获取数据?_Magento_Magento 1.9_Magento 1.4 - Fatal编程技术网

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

在Magento中,块如何从模型中获取数据?,magento,magento-1.9,magento-1.4,Magento,Magento 1.9,Magento 1.4,有人能解释一下吗 让我告诉你我所知道的。如果前三点是好的,请解释这四点 请求到达控制器 在控制器动作中,我们启动模型 模型通过连接数据库等收集或生成所需的所有信息 那之后会发生什么 模型如何将数据传输到块,或块如何从模型获取数据 模板获取准备好的数据并显示在屏幕上 此外,请求是否再次返回控制器 请解释一下。我在几个地方感到困惑。不,它离开控制器(控制请求的控制器),然后移动到视图,在那里进行渲染。一旦视图(块)呈现,请求基本上就结束了(除了大部分url帮助程序,它们没有逻辑可言,但有时在呈现

有人能解释一下吗

让我告诉你我所知道的。如果前三点是好的,请解释这四点

  • 请求到达控制器
  • 在控制器动作中,我们启动模型
  • 模型通过连接数据库等收集或生成所需的所有信息
  • 那之后会发生什么

  • 模型如何将数据传输到块,或块如何从模型获取数据

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

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

  • 请解释一下。我在几个地方感到困惑。

    不,它离开控制器(控制请求的控制器),然后移动到视图,在那里进行渲染。一旦视图(块)呈现,请求基本上就结束了(除了大部分url帮助程序,它们没有逻辑可言,但有时在呈现视图后在控制器中处理),除非之后触发了某种钩子

    我使用and(Alan Storm就是那个家伙)来了解Magento请求路由

  • 正确,通过前端控制器和路由器
  • 不完全是。Magento的ViewModel实现部分是通过让视图(块)实例化它们自己的模型来实现的
  • 是的,通过资源模型
  • 当块通过动作控制器中的典型
    $this->loadLayout()->renderLayout()
    流进行渲染时,如果它们使用模板,则这些模板在渲染时为
    include()
    d

    调用
    renderLayout()
    后,执行仍在我们调度到的控制器操作的范围内,因此您可以通过获取请求对象来访问呈现的响应

    关键绘图点:

  • index.php调用
    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();`它将刷新输出,之前有一个事件(控制器前发送响应前),该事件可用作钩子来添加或操作任何与响应相关的内容。

    无任何内容将数据传输到块。在控制器动作完成其模型交互后,它负责

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

  • 告诉布局对象呈现页面

  • 大多数Magento控制器操作都是在控制器操作结束时通过两次调用来完成的

    $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()
    ,因为它与经典的“分配模板变量”应用程序相匹配