magento - 在 Magento 中, block 如何从模型中获取数据?

标签 magento magento-1.9 magento-1.4

有人可以解释一下吗?

让我告诉你我所知道的。如果前三点不错,请解释第四点。

  • 请求来到 Controller 。
  • 在 Controller Action 中,我们启动模型。
  • 模型通过连接数据库等收集或生成所需的所有信息。

  • 之后会发生什么?
  • 模型如何向 Blocks 传输数据,或者 Blocks 是如何从模型中获取数据的?
  • 模板获取准备好的数据并显示在屏幕上
  • 此外,请求是否会再次返回到 Controller ?

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

    最佳答案

    没有任何东西将数据传输到 block 。在 Controller Action 完成其模型交互后,它负责

  • 加载布局对象(间接加载和创建 block 对象)
  • 告诉该布局对象呈现页面。

  • 大多数 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/

    相关文章:

    magento - SUPEE 6788 和密码重置(空白页)

    mysql - Magento MySQL挂了

    magento - 更改产品图像的鼠标事件 magento

    Magento loadByAttribute 用于自定义类别属性

    php - 在后端的 Magento 订单 View 页面中添加产品的缩略图

    Magento 订单的小计和总计为 0

    php - Magento 客户网格 - 掩码电子邮件地址

    magento - 按浏览器显示的内容

    magento - 如何在 magento 1.9.x 中添加捆绑产品项目图像?

    javascript - Magento 响应 302 中的操作 ajax 调用(需要管理员登录)