我来自不同的 MVC 框架(例如 Symfony)到 Magento。我阅读了很多关于 Magento 最佳实践的文章,我可以看到 Magento 没有使用典型的 MVC 风格。艾伦斯托姆写道:
控制器不负责为视图设置变量 [...] 控制器的工作是对模型做某些事情,然后告诉系统它的布局渲染时间。
我想我理解这种方法,因为这可以为块提供一种灵活性。
对。但是表格呢?
在典型的 MVC 框架中,您将在控制器中获取请求参数,在控制器中验证表单数据,在必要时进行模型操作(保存、加载等)或重定向,当一切都干净整洁时,您将提供新鲜出炉的输出件供观赏。
在 Magento 中,这些都应该发生在一个块内,并且(瘦)控制器只应该准备布局然后渲染它。(如果我明白的话。)
我试图找到一篇文章(手册,论坛主题,任何东西),它描述了具有自己的新模型的单独模块的创建步骤,用户可以通过前端的表单对其进行编辑。我想看看自定义表单应该如何在前端工作。我只找到关于块、表单、修改或创建 adminhtml 表单或自定义联系人或时事通讯注册表单的一般文章。
我做到了。它现在有效,但我不满意。因此,我检查了核心模块中的联系人表单的源代码,这些代码为我搞砸了整个画面。内置的 Contact 表单使用 IndexController 进行上述大多数操作,(几乎)像标准 MVC 一样。
任何人都可以向我建议一个最佳实践,如何管理一个简单的流程,如下所示?(我在下面有一个解决方案,但我不确定,这是“正确的 Magento 方式”):
- 页面加载时,在一个块中显示一个表单,该表单包含在单独的页面中
- 通过请求参数从数据库加载模型对象
- 将对象数据填充到表单中
- 当用户提交表单时,处理表单数据,验证它们
- 如果验证错误,再次显示表单,并弹出错误消息
- 如果可以,将数据存储到数据库中,显示感谢页面
我的困惑主要是围绕:
- 我应该在哪里获取和管理请求参数?(我在块类文件中做到了)
- 并基于它从数据库中加载一个对象?(也是,然后传给phtml)
- 如果我不在那里加载它,如何将它传递给视图?(我会知道一种方法,但我不知道最好的方法。)
- (POST)表单数据应该在哪里处理、验证和存储?(堵塞?)
- 如何在块中正确使用重定向?我是否需要重定向,因为感谢页面应该是不同的块/页面?或者只是同一块的另一种(条件)外观?