gpt4 book ai didi

forms - Magento - 处理 block 形式的最佳方法?

转载 作者:行者123 更新时间:2023-12-04 12:42:04 26 4
gpt4 key购买 nike

我来自不同的 MVC 框架(例如 Symfony)到 Magento。我阅读了很多关于 Magento 最佳实践的文章,我可以看到 Magento 没有使用典型的 MVC 风格。艾伦斯托姆写道:

it's not the responsibility of the controller to set variables for the view [...] controller's job is to do certain things to Models, and then tell the system it's layout rendering time.



我想我理解这种方法,因为这可以为 block 提供一种灵 active 。

对。但是表格呢?

在典型的 MVC 框架中,您将在 Controller 中获取请求参数,在 Controller 中验证表单数据,在必要时进行模型操作(保存、加载等)或重定向,当一切都干净整洁时,您将提供新鲜出炉的输出件供观赏。

在 Magento 中,这些都应该发生在一个 block 内,并且(瘦) Controller 只应该准备布局然后渲染它。 (如果我明白的话。)

我试图找到一篇文章(手册,论坛主题,任何东西),它描述了具有自己的新模型的单独模块的创建步骤,用户可以通过前端的表单对其进行编辑。我想看看自定义表单应该如何在前端工作。我只找到关于 block 、表单、修改或创建 adminhtml 表单或自定义联系人或时事通讯注册表单的一般文章。

我做到了。它现在有效,但我不满意。因此,我检查了核心模块中的联系人表单的源代码,这些代码为我搞砸了整个画面。内置的 Contact 表单使用 IndexController 进行上述大多数操作,(几乎)像标准 MVC 一样。

任何人都可以向我建议一个最佳实践,如何管理一个简单的流程,如下所示? (我在下面有一个解决方案,但我不确定,这是“正确的 Magento 方式”):
  • 当页面加载时,在一个 block 中显示一个表单,该表单包含在单独的页面
  • 通过请求参数
  • 从数据库加载模型对象
  • 将对象数据填充到表单
  • 当用户提交表单时,处理表单数据,验证它们
  • 如果验证错误,再次显示表单,并弹出错误消息
  • 如果OK,将数据存入数据库,显示感谢页面

  • 我的困惑主要是围绕:
  • 我应该在哪里获取和管理请求参数? (我在 block 类文件中做了)
  • 并基于它从数据库中加载一个对象? (还有,然后传给phtml)
  • 如果我不在那里加载它,如何将它传递给 View ? (我会知道一种方法,但我不知道最好的方法。)
  • (POST)表单数据应该在哪里处理、验证和存储? (阻止?)
  • 如何在 block 中正确使用重定向?我是否需要重定向,因为感谢页面应该是不同的 block /页面?或者只是同一 block 的另一种(条件)外观?
  • 最佳答案

    您可以查看 Customer/AccountController 并查看 loginPost , createPost方法正在处理传入的表单数据。

    我永远不会添加 CRUD block 的逻辑。您需要在 Controller 中验证和处理您的 POST 数据。 block 应仅包含与 View 相关的逻辑:如格式 url,或准备 Collection .

    表格准备也落在了 Controller 的肩上。您需要加载对象并在 Controller 操作中对其进行验证。然后有几种方法可以将其传递给 block :

  • Mage::register (注册)
  • $this->getLayout->getBlock('your_form_block')->setEntity($object) (直接设置变量为block)

  • 任何重定向都应仅在 Controller 中完成。

    更新
    关于为什么在 Controller 内加载模型的几句话。
  • 如果您无法加载您的对象,这意味着用户正在使用的 url(带有对象 id)已过时,您可能需要将客户重定向到某个方便的页面,但出现错误。
  • 正如我上面所说,所有重定向都应该只在 Controller 中完成。这是为什么?因为目前 block 是进程,所以 Magento 已经完成了大量的引导工作 - 比如 loadLayout并创建所有 block 。您不想让用户等待所有时间只是为了在之后重定向他。
  • 此外,将重定向放在不在 Controller 中的任何地方都会使应用程序无法维护。当然也有异常(exception),但你应该知道自己做得很好。

  • 你也忘记了一个更有值(value)的部分。如果您的 Controller 内部验证失败,您需要使用用户发送的值填写表单。在 Zend_Form 中做得很好,但是对于 Magento 表单,您需要使用 session (就像在 AccountController 中所做的那样) - 将所有键值部分保存在 session 中,然后在 block 中检查这些 session 变量是否存在。同样,只有当您的 POST 验证失败并且您将用户重定向回您的表单时,您才应该这样做。在成功的情况下清除连接到表单的 session 变量。

    作为一般建议:如果您想遵循 Magento 风格,请少阅读论坛和更多核心代码。

    关于forms - Magento - 处理 block 形式的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13606744/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com