最好的方式来处理块的形式?
我来自不同的MVC框架(例如Symfony)到Magento。 我读了很多关于Magento的最佳实践,我可以看到Magento不使用典型的MVC风格。 艾伦风暴写了以下内容:
控制器的职责不是为视图设置变量。[...]控制器的工作是对模型做某些事情,然后告诉系统它是布局渲染时间。
我想我理解这种方法,因为这可以为块提供一种灵活性。
对。 但是形式呢?
在典型的MVC框架中,您将获得控制器中的请求参数,验证控制器中的表单数据,进行模型操作(保存,加载等)或必要时重定向,并且当所有内容都干净整齐时,您将提供为视图新鲜出炉的输出件。
在Magento中,所有这些都应该发生在块内部,并且(瘦)控制器只应该准备好布局然后渲染它。 (如果我明白了。)
我试图找到一篇文章(手册,论坛主题,任何内容),其中描述了一个独立模块的创建步骤,该模块具有自己的新模型,可以通过用户前端的表单进行编辑。 我想看看自定义表单应该如何在前端工作。 我只找到关于块,表单,修改或创建adminhtml表单或定制联系人或通讯注册表单的一般性文章。
我做到了。 它现在有效,但我不满意。 于是,我检查了核心模块中联系人表单的源代码,以及那些让我搞乱了整个图片的东西。 内置的Contact表单使用IndexController来处理上面提到的大部分操作,(几乎)就像一个标准的MVC。
任何人都可以向我建议一个最佳实践,如何管理如下的简单流程? (我已经为下面的解决方案提供了解决方案,但我不确定,这是否是“正确的Magento方式”):
我的困惑主要在于:
您只需查看Customer / AccountController并查看loginPost
, createPost
方法如何处理传入表单数据。
我永远不会将CRUD
逻辑添加到该块。 您需要验证和处理您的控制器中的POST数据。 块应该只包含视图相关的逻辑:像格式url,或者准备Collection
。
此外,表格准备也放在控制器肩上。 您需要加载对象并在Controller动作中对其进行验证。 然后有几种方法将它传递给块:
Mage::register
(注册) $this->getLayout->getBlock('your_form_block')->setEntity($object)
(直接设置变量为block) 任何重定向都应该只在Controller中完成。
更新关于为什么在控制器内加载模型的几句话。
loadLayout
并创建所有的块。 您不希望让用户等待所有时间,只是为了在事后重定向他。 你也忘记了更多有价值的部分。 如果控制器内的验证失败,则需要使用用户发送的值填写表单。 在Zend_Form中做得很好,但对于Magento表单,您需要使用会话(例如在AccountController中完成) - 将所有键值部分保存在会话中,然后在块中检查这些会话变量是否存在。 同样,只有当您的POST验证失败并且您将用户重定向到您的表单时,您才应该这样做。 在成功的情况下清除连接到表单的会话变量。
作为一般建议:如果你想遵循Magento风格,阅读更少的论坛和更多的核心代码。
我也不是一个magento pro,但我想我可以回答你的问题:
我应该在哪里获得并管理请求参数? (我在块类文件中做到了)取决于你需要它们的地方。 如果您打算将它们保存在模型中,请使用控制器。 如果您想在页面上输出它们,请使用块。 大多数情况下,你想用这个控制器。
并基于它从数据库中加载一个对象? (另外,然后传递给phtml)如果你想将模型传递给模板,你应该在你的模块上写一个函数来获取模型。
如何将它传递给视图,如果我不加载它? (我会知道一种方式,但我不知道最好的方法。)如上所述,使用获取模型的函数创建一个块。 然后从你的模板中,你可以使用$ model = $ this-> functionThatGetsTheModel(); 达到这个功能并获得该块。
(POST)表单数据应该在哪里处理,验证和存储? (块?)保存模型等东西是控制器的东西。
我该如何正确使用重定向? 我是否需要重定向,因为感谢页面应该是不同的块/页面? 或者只是一个替代(有条件)的相同块的外观? 它最好在您的控制器中进行重定向。 最好为每个计划制作的页面创建一个新的块/模板。
关于块/模板主题:阅读本页以获取更多关于使用布局xml以使用块和模板的信息http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-4- Magento的的布局块和模板
我希望这可以帮助您开始使用magento!
链接地址: http://www.djcxy.com/p/59479.html上一篇: Best way to handle forms in blocks?
下一篇: view doesn't show up