Mura - 在插件中定义表单操作的正确方法

时间:2013-10-06 00:21:23

标签: mura

民间,

在我正在开发的Mura插件中,我在displayObjects下有两个页面:

myinput.cfm
myaction.cfm

在myinput.cfm中,我使用cfform来收集输入:

<cfform action="myaction.cfm" method="post">
...
</cfform>

将我的插件添加到页面后,myinput.cfm中的表单按预期显示。但是,单击提交时,我收到错误,找不到myaction.cfm。

我认为我定义行动的方式不正确。回想一下,我的插件只是更大页面的一小部分。表单提交实际上应该返回到同一页面,除了渲染应该以某种方式使用myaction.cfm而不是myinput.cfm。

我认为问题在于如何定义指向插件中不同页面的导航链接本质上更为通用。

提前感谢您的帮助。

的问候,
彼得

1 个答案:

答案 0 :(得分:3)

所有DisplayObject都必须直接添加到页面中,因此除非您将myaction.cfm添加到页面中,否则永远不会找到它。

如果您真的需要,可以使用以下命令获取插件中文件的映射:

<cfinclude template="/#$.getPlugin('MyPluginPackageName').getDirectory()#/...">

通常,您可以将$ .getPlugin('MyPluginPackageName')分配给DisplayObject开头的对象变量,以便您可以重复使用它而无需重复调用该函数。

但是,这是用于在Mura插件中映射“视图”文件的最佳做法。

更推荐的方法是让相同的DisplayObject显示表单并处理表单结果。您可以将表单包装在条件中,如:

<cfif StructKeyExists(form,"some_field_in_my_form")>
... action code
<cfelse>
... form code
</cfif>

...确定表单是否已提交(如果您正在进行服务器端验证等,则显然已调整)。我建议的一件事是您不使用StructCount(“表单”)或类似的,因为页面上可能有其他表单已提交。

如果要分离代码以使其更有条理,只需将DisplayObject用作容器并使用includes / function calls / etc.

Display Object: [your plugin folder]/displayObjects/myform.cfm

<cfif StructKeyExists(form,"some_field_in_my_form")>
    <cfinclude template="./inc/myaction.cfm">   <!--- [your plugin folder]/displayObjects/inc/myaction.cfm --->
<cfelse>
    <cfinclude template="./inc/myinput.cfm">    <!--- [your plugin folder]/displayObjects/inc/myinput.cfm --->
</cfif>

如果您确实要有两个显示对象,则必须a)将它们分配到同一个Mura内容页面,但用条件包装它们以确保它们只出现在适当的上下文中,或者b)将它们分配给不同的Mura页面,并将表单发布到包含myaction.cfm显示对象的Mura页面。

最后,我建议在https://github.com/blueriver/MuraFW1查看FW / 1示例插件...一旦你掌握了FW / 1(最容易学习的CFML框架),它将使你的插件构建得更多,更容易。