6

我正在尝试使用 Plone Form Gen 创建事件内容类型。我一直在使用本教程来执行此操作。

使用Add New...菜单创建事件内容类型时,您需要填写两个字段,即事件的开始日期和结束日期,我希望我的表单从这些字段中提取信息并将其应用于我的事件内容类型用来创建它。

据我了解,我的问题通过以下示例进行了描述:

自定义脚本适配器脚本包含以下内容:

obj.setDescription(form['replyto'])

我可以看到它从以下内容获取 Event 内容类型的 Description 的内容:

<input id="replyto" class="" type="text" size="30" name="replyto" />

添加到 PFG 表单时的日期/时间字段由多个<select>输入组成,而不仅仅是像上面的一个,我想这意味着没有一个简单的obj.setEndDate()命令......虽然没有办法引用选择盒子我有点卡住了。

有谁知道是否可以使用 Plone Form Gen创建 Event 内容类型并在其上指定开始和结束日期?

编辑

使用此链接我已经解决了原始问题,但我遇到了更多问题

我已经修改了我的脚本(使用上面的链接),如下所示:

target = context.viewjobs

form = request.form

from DateTime import DateTime
uid = str(DateTime().millis())

loc = form['location-of-event']

target.invokeFactory("Event", id=uid, title=form['topic'], event_url=loc)

obj = target[uid]

obj.setFormat('text/plain')
obj.setText(form['comments'])
obj.setDescription(form['replyto'])

obj.reindexObject()

(我使用 event_url 只是为了测试,因为我对这个选项没有任何运气event_start)。

它可以创建事件,但是当我查看事件时,我得到:

 Module zope.tales.expressions, line 217, in __call__
Module Products.PageTemplates.Expressions, line 147, in _eval
Module zope.tales.expressions, line 124, in _eval
Module Products.PageTemplates.Expressions, line 74, in boboAwareZopeTraverse
Module OFS.Traversable, line 317, in restrictedTraverse
Module OFS.Traversable, line 285, in unrestrictedTraverse
__traceback_info__: ([], 'location')

属性错误:位置

我没有在脚本中的任何地方引用位置,当我这样做时,我得到了同样的错误。

任何想法将不胜感激

4

2 回答 2

5

您可以通过执行以下操作来简化代码并避免重新索引调用:

target = context.viewjobs

form = request.form

from DateTime import DateTime
uid = str(DateTime().millis())

target.invokeFactory(
    "Event",
    id=uid,
    title=form['job-title'],
    description=form['description-1'],
    text=form['comments'],
    location=form['location-of-event'],
    startDate=form['start-date'],
    endDate=form['end-date-due-by']
    )

关于收集开始和结束日期。如果您使用日期/时间小部件并查看生成的 HTML,您会注意到有一个隐藏的输入字段,其名称与小部件的短名称相匹配。该隐藏输入包含各种选择框选择的内容的完整文本表示,因此您希望通过使用文本字段来实现,而不必依赖用户使用特定格式。

如果您想知道如何查找要在 invokeFactory 调用中指定的各个字段的名称,请查找定义您尝试创建的内容类型的 python 文件。对于事件对象,它是 /Plone/buildout-cache/eggs/Products.ATContentTypes-2.1.8-py2.7.egg/Products/ATContentTypes/content/event.py

第 32 行开始“ATEventSchema = ...”,从那里您将看到事件所有部分的字段名称。

于 2013-04-03T15:12:47.907 回答
1

我设法通过使用文本字段并要求用户以这种格式输入日期来解决这个问题:2013-12-12,然​​后我使用obj.setStartDate(form['name-of-field'])obj.setEndDate(form['name-of-field'])在事件上设置它。

为了绕过位置回溯,我使用obj.setLocation()并从上面脚本中显示的调用方法中删除了位置行。

任何有兴趣的人的脚本:

target = context.viewjobs

form = request.form

from DateTime import DateTime
uid = str(DateTime().millis())

target.invokeFactory("Event", id=uid, title=form['job-title'])

obj = target[uid]

obj.setFormat('text/plain')
obj.setText(form['comments'])
obj.setDescription(form['description-1'])
obj.setLocation(form['location-of-event'])
obj.setStartDate(form['start-date'])
obj.setEndDate(form['end-date-due-by'])

obj.reindexObject()
于 2013-04-03T14:55:47.247 回答