我想为注册用户创建一个输入表单,与管理员的内容创建表单分开。每次提交都将创建多个节点。 为了说明这种情况,我将使用内容类型项目和审核。
项目:标题,说明,所有者,评分。
审核:标题,审核者,项目,难度
我使用CCK模块设置了内容类型及其字段。我想为注册成员创建一个输入表单(非管理员)。其字段包括项目名称,描述,所有者,评级,评论,< EM>难度
提交表单后,项目名称,描述,所有者和评级值进入新的状态项目节点,其余部分进入新的审核节点。
我想要做的另一个自定义是使用评级和难度输入字段来使用star rating input。
实现这一目标的最佳方法是什么?我应该创建自定义模块和自定义表单(任何人都可以指出我如何做到这一点)?或者我可以使用任何模块吗?
由于
答案 0 :(得分:8)
有几种方法可以做到这一点:
从头开始做所有事情:这就是theunravelers suggestion(+1)归结为 - 自己构建表单,添加自己的验证并提交处理程序和提交,构建两个节点对象并保存它们。你将拥有完全的控制/灵活性,但这是一些相当的工作,你需要很好地理解Drupals的内部工作才能使它正确。
'重载'您的一个内容类型与另一个所需的字段,并调整'重载'内容类型提交(和部分编辑/显示)逻辑以从其他字段创建其他内容类型,同时将它们隐藏在显示和编辑的'重载'上。你可以find an article describing this approach here。这是比#1更容易的方法,但我认为它有点'hackish',因为内容类型定义与显示不匹配。
#2的较少'hackish'变体是正常设置您的内容类型,只需通过hook_form_alter()
操纵编辑和提交过程。你做的方法与方法#2大致相同,但不是先用额外的字段“重载”一个节点,而是直接在hook_form_alter
上将它们注入编辑表单(从头开始或者通过在后台加载另一个节点的编辑表单并从中复制相关的字段定义。在表单提交时,您在使用它们构建其他节点时删除这些附加字段。这需要比#2更多的工作和知识,但应该更稳定,更容易调整/维护,因为您不必处理内容类型定义与显示不匹配。
此外,您没有指定如何处理现有节点的编辑 - 我建议将节点引用添加到其中一个节点以跟踪其关联。这样,如果需要,您还可以添加逻辑以从一个表单编辑两个节点,以及同步删除。
答案 1 :(得分:4)
这对我来说听起来像是一份定制工作。您可以使用模块中的Form API来制作表单。查看几乎任何其他模块,以查看Form API如何工作的示例。然后,您将要从这些字段的所有值创建$ node对象,并使用node_submit()和node_save()来实际创建不同的节点。
我建议可能会查看Webform模块以使用Form API并劫持提交过程以使其创建这两种节点类型。
答案 2 :(得分:2)
选项#3,使用其中一个年轻的解决方案创建可以指向不存在的节点的CCK节点参考字段,并在提交时创建它。
Node Reference Create看起来像这些项目中更稳定的一个。
Node Reference Auto-create和Node Reference Field似乎有更多的附加值来确定新节点中的值。
这在构建模块之间的节点引用方面具有次要优势,您可以使用它们在呈现时集成节点,创建视图等。