Ada*_*mos 7 forms model-view-controller controller block magento
我来自不同的MVC框架(例如Symfony)到Magento.我读了很多关于Magento最佳实践的内容,我可以看到Magento没有使用典型的MVC风格.Alan Storm写道如下:
控制器的责任不是为视图设置变量控制器的工作就是对模型执行某些操作,然后告诉系统它的布局渲染时间.
我想我理解这种方法,因为这可以为块提供一种灵活性.
对.但形式怎么样?
在典型的MVC框架中,您将获得控制器中的请求参数,验证控制器中的表单数据,进行模型操作(保存,加载等)或必要时重定向,当一切都干净整洁时,您将提供新鲜出炉的视图输出件.
在Magento中,这些都应该发生在一个块内,而(瘦)控制器只应该准备布局然后再渲染它.(如果我理解的话.)
我试图找到一篇文章(手册,论坛主题,任何内容),它描述了一个单独模块的创建步骤,该模块具有自己的新模型,可以通过用户在前端的表单进行编辑.我想看看自定义表单应该如何在前端工作.我发现只有关于块,表单,修改或创建adminhtml表单或自定义联系人或简报注册表单的一般文章.
我做到了.它现在有效,但我不满意.那么,我检查了核心模块中Contact表单的源代码,这些对我来说搞乱了整个图片.内置的Contact表单使用IndexController进行上述大多数操作,(几乎)就像标准的MVC一样.
任何人都可以向我建议一个最佳实践,如何管理如下的简单流程?(我在下面有这些解决方案,但我不确定,是"正确的Magento方式"):
我的困惑主要在于:
您只需查看 Customer/AccountController 并查看loginPost,createPost方法如何处理传入的表单数据。
我永远不会将CRUD逻辑添加到块中。您需要在控制器中验证和处理 POST 数据。块应该只包含与视图相关的逻辑:例如 format url 或prepare Collection。
此外,表格准备工作也落在了控制员的肩上。您需要加载对象并在控制器操作中验证它。那么有几种方法可以将其传递给块:
Mage::register(登记处)$this->getLayout->getBlock('your_form_block')->setEntity($object)(直接设置变量为block)任何重定向都应仅在控制器中完成。
更新 关于为什么在控制器内加载模型的几句话。
loadLayout创建所有块。您不想让用户等待那么长时间只是为了之后重定向他。而且你还忘记了一个更有价值的部分。如果控制器内的验证失败,您需要使用用户发送的值填写表单。在 Zend_Form 中,这做得很好,但是使用 Magento 表单,您需要使用会话(就像在 AccountController 中所做的那样) - 将所有键值部分保存在会话中,然后在块中检查这些会话变量是否存在。同样,只有当您的 POST 验证失败并且您将用户重定向回您的表单时,您才应该执行此操作。在成功的情况下,清除连接到表单的会话变量。
作为一般性建议:如果您想遵循 Magento 风格,请少读论坛,多读核心代码。