0

伙计们,

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

myinput.cfm
myaction.cfm

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

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

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

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

我想这个问题本质上更普遍,即如何定义指向插件中不同页面的导航链接。

预先感谢您的帮助。

问候,
彼得

4

1 回答 1

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("form") 或类似的,因为页面上可能已经提交了其他表单。

如果您想分离代码以使其更有条理,只需将 DisplayObject 用作​​容器并使用包含/函数调用/等。

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 框架),它就会构建您的插件要容易得多。

于 2013-10-07T10:21:19.217 回答