简单的多语言FAQ
项目描述
简介
此产品为 Plone 添加了对常见问题解答(FAQ)的支持。它定义了基于 Archetypes 的内容类型“FAQ 项”、“FAQ 文件夹”和“FAQ 组”。它为“FAQ 文件夹”类型定义了两种视图。对于所有内容类型,您都可以使用“语言”字段设置内容对象的语言。
功能
FAQ 文件夹的两个视图
index_view 显示 FAQ 文件夹中 FAQ 项的链接
all_view 在一页上显示 FAQ 项及其答案
FAQ 项上的一个视图小部件,显示联系表单的链接。
FAQ 文件夹的视图也适用于主题,因此您可以根据自己的标准创建 FAQ 项的主题,并以相同的方式查看它们,就像查看 FAQ 文件夹一样。
在 id 为 faq 的 CollectionPortlet 中,链接将在覆盖层中打开。
变更日志
0.5 (2012-07-02)
测试了 Plone 4.2 兼容性。[hvelarde]
添加了安装和内容类型测试。[hvelarde]
添加了开发和测试的 buildout 配置。[hvelarde]
修复了包分发。[hvelarde]
修复类型 [lepri] 的视图条目
为视图创建菜单条目 [lepri]
修复“NameError: 全局名称 ‘cat’ 未定义”。[hvelarde]
添加了巴西葡萄牙语翻译 [lepri]
修复文档格式化中的 rst 标记
添加视图小部件以链接到联系表单
在 onefaqview 中显示“相关项”。
0.4 (2011-04-12)
添加单个 FAQ 的视图(不再是默认视图)
0.3 (2011-03-09)
在 locales 中添加英语
添加索引视图
更改模板以符合 AnySurfer
使用 ZopeSkel 创建了配方 [Benoit Suttor - CIRB/CIBG]
详细信息
这是一个功能完整的测试。这里的重点是测试用户可能输入和看到的内容,系统大部分作为黑盒进行测试。我们使用 PloneTestCase 设置此测试,因此我们有一个完整的 Plone 站点可以玩耍。我们 可以 检查门户的状态,例如使用 self.portal 和 self.folder,但这通常是不受欢迎的,因为您没有将系统作为黑盒来对待。此外,如果您,例如,使用 self.setRoles() 等调用登录或设置角色,这些不会反映在测试浏览器中,它作为单独的会话运行。
作为一个 doctest,我们在这里可以讲述一个故事。
首先,我们必须进行一些设置。我们使用与 Five 一起提供的 testbrowser,因为这样可以提供适当的 Zope 2 集成。尽管如此,大部分文档都在底层的 zope.testbrower 包中。
>>> from Products.Five.testbrowser import Browser >>> browser = Browser() >>> portal_url = self.portal.absolute_url()
以下是在编写和调试 testbrowser 测试时非常有用的内容。它让我们看到 error_log 中的所有错误消息。
>>> self.portal.error_log._ignored_exceptions = ()
有了这些,我们可以转到门户首页并登录。我们将使用 PloneTestCase 的默认用户来完成此操作
>>> from Products.PloneTestCase.setup import portal_owner, default_password>>> browser.open(portal_url)
我们有一个登录小部件,所以让我们使用它。
>>> browser.getControl(name='__ac_name').value = portal_owner >>> browser.getControl(name='__ac_password').value = default_password >>> browser.getControl(name='submit').click()
在这里,我们设置登录表单上字段的值,然后模拟提交点击。
然后我们测试我们是否仍然在门户首页
>>> browser.url == portal_url True
并且我们确保我们得到友好的登录消息
>>> "You are now logged in" in browser.contents True
FaqGroup内容类型
在本节中,我们将通过执行基本操作(如添加、更新和删除 FaqGroup 内容项)来测试 FaqGroup 内容类型。
添加新的FaqGroup内容项
我们使用“添加新”菜单来添加新的内容项。
>>> browser.getLink('Add new').click()
然后我们选择我们想要添加的项目类型。在这种情况下,我们选择“FaqGroup”并单击“添加”按钮以转到添加表单。
>>> browser.getControl('FaqGroup').click() >>> browser.getControl(name='form.button.Add').click() >>> 'FaqGroup' in browser.contents True
现在我们填写表单并提交它。
>>> browser.getControl(name='title').value = 'FaqGroup Sample' >>> browser.getControl('Save').click() >>> 'Changes saved' in browser.contents True
我们就完成了!我们在门户中添加了一个新的“FaqGroup”内容项。
更新现有的FaqGroup内容项
让我们单击“编辑”标签并更新对象属性值。
>>> browser.getLink('Edit').click() >>> browser.getControl(name='title').value = 'New FaqGroup Sample' >>> browser.getControl('Save').click()
我们检查更改是否已应用。
>>> 'Changes saved' in browser.contents True >>> 'New FaqGroup Sample' in browser.contents True
删除FaqGroup内容项
如果我们转到主页,我们可以在全局导航标签中看到一个标题为“新 FaqGroup 示例”的选项卡。
>>> browser.open(portal_url) >>> 'New FaqGroup Sample' in browser.contents True
现在我们将删除“新 FaqGroup 示例”对象。首先我们转到内容选项卡并选择“新 FaqGroup 示例”进行删除。
>>> browser.getLink('Contents').click() >>> browser.getControl('New FaqGroup Sample').click()
我们单击“删除”按钮。
>>> browser.getControl('Delete').click() >>> 'Item(s) deleted' in browser.contents True
因此,如果我们回到主页,就不再有“新 FaqGroup 样本”选项卡。
>>> browser.open(portal_url) >>> 'New FaqGroup Sample' in browser.contents False
以贡献者身份添加新的FaqGroup内容项
不仅网站管理员可以添加 FaqGroup 内容项,网站贡献者也可以。
让我们注销,然后以“贡献者”身份登录,这是一个分配了贡献者角色的门户成员。
>>> browser.getLink('Log out').click() >>> browser.open(portal_url) >>> browser.getControl(name='__ac_name').value = 'contributor' >>> browser.getControl(name='__ac_password').value = default_password >>> browser.getControl(name='submit').click() >>> browser.open(portal_url)
我们使用“添加新”菜单来添加新的内容项。
>>> browser.getLink('Add new').click()
我们选择“FaqGroup”,然后点击“添加”按钮进入添加表单。
>>> browser.getControl('FaqGroup').click() >>> browser.getControl(name='form.button.Add').click() >>> 'FaqGroup' in browser.contents True
现在我们填写表单并提交它。
>>> browser.getControl(name='title').value = 'FaqGroup Sample' >>> browser.getControl('Save').click() >>> 'Changes saved' in browser.contents True
完成了!以贡献者身份登录时,我们添加了一个新的 FaqGroup 内容项。
最后,让我们以管理员的身份重新登录。
>>> browser.getLink('Log out').click() >>> browser.open(portal_url) >>> browser.getControl(name='__ac_name').value = portal_owner >>> browser.getControl(name='__ac_password').value = default_password >>> browser.getControl(name='submit').click() >>> browser.open(portal_url)
FaqItem内容类型
在本节中,我们通过执行添加、更新和删除 FaqItem 内容项等基本操作来测试 FaqItem 内容类型。
添加新的FaqItem内容项
我们使用“添加新”菜单来添加新的内容项。
>>> browser.getLink('Add new').click()
然后我们选择要添加的项目类型。在这种情况下,我们选择“FaqItem”,然后点击“添加”按钮进入添加表单。
>>> browser.getControl('FaqItem').click() >>> browser.getControl(name='form.button.Add').click() >>> 'FaqItem' in browser.contents True
现在我们填写表单并提交它。
>>> browser.getControl(name='title').value = 'FaqItem Sample' >>> browser.getControl('Save').click() >>> 'Changes saved' in browser.contents True
完成了!我们已经向门户添加了一个新的“FaqItem”内容项。
更新现有的FaqItem内容项
让我们单击“编辑”标签并更新对象属性值。
>>> browser.getLink('Edit').click() >>> browser.getControl(name='title').value = 'New FaqItem Sample' >>> browser.getControl('Save').click()
我们检查更改是否已应用。
>>> 'Changes saved' in browser.contents True >>> 'New FaqItem Sample' in browser.contents True
删除FaqItem内容项
如果我们访问主页,我们可以在全局导航标签中看到一个带有“新 FaqItem 样本”标题的标签。
>>> browser.open(portal_url) >>> 'New FaqItem Sample' in browser.contents True
现在我们将删除“新 FaqItem 样本”对象。首先我们转到内容标签,并选择“新 FaqItem 样本”进行删除。
>>> browser.getLink('Contents').click() >>> browser.getControl('New FaqItem Sample').click()
我们单击“删除”按钮。
>>> browser.getControl('Delete').click() >>> 'Item(s) deleted' in browser.contents True
因此,如果我们回到主页,就不再有“新 FaqItem 样本”标签。
>>> browser.open(portal_url) >>> 'New FaqItem Sample' in browser.contents False
以贡献者身份添加新的FaqItem内容项
不仅网站管理员可以添加 FaqItem 内容项,网站贡献者也可以。
让我们注销,然后以“贡献者”身份登录,这是一个分配了贡献者角色的门户成员。
>>> browser.getLink('Log out').click() >>> browser.open(portal_url) >>> browser.getControl(name='__ac_name').value = 'contributor' >>> browser.getControl(name='__ac_password').value = default_password >>> browser.getControl(name='submit').click() >>> browser.open(portal_url)
我们使用“添加新”菜单来添加新的内容项。
>>> browser.getLink('Add new').click()
我们选择“FaqItem”,然后点击“添加”按钮进入添加表单。
>>> browser.getControl('FaqItem').click() >>> browser.getControl(name='form.button.Add').click() >>> 'FaqItem' in browser.contents True
现在我们填写表单并提交它。
>>> browser.getControl(name='title').value = 'FaqItem Sample' >>> browser.getControl('Save').click() >>> 'Changes saved' in browser.contents True
完成了!以贡献者身份登录时,我们添加了一个新的 FaqItem 内容项。
最后,让我们以管理员的身份重新登录。
>>> browser.getLink('Log out').click() >>> browser.open(portal_url) >>> browser.getControl(name='__ac_name').value = portal_owner >>> browser.getControl(name='__ac_password').value = default_password >>> browser.getControl(name='submit').click() >>> browser.open(portal_url)
FaqFolder内容类型
在本节中,我们通过执行添加、更新和删除 FaqFolder 内容项等基本操作来测试 FaqFolder 内容类型。
添加新的FaqFolder内容项
我们使用“添加新”菜单来添加新的内容项。
>>> browser.getLink('Add new').click()
然后我们选择要添加的项目类型。在这种情况下,我们选择“FaqFolder”,然后点击“添加”按钮进入添加表单。
>>> browser.getControl('FaqFolder').click() >>> browser.getControl(name='form.button.Add').click() >>> 'FaqFolder' in browser.contents True
现在我们填写表单并提交它。
>>> browser.getControl(name='title').value = 'FaqFolder Sample' >>> browser.getControl('Save').click() >>> 'Changes saved' in browser.contents True
完成了!我们已经向门户添加了一个新的“FaqFolder”内容项。
更新现有的FaqFolder内容项
让我们单击“编辑”标签并更新对象属性值。
>>> browser.getLink('Edit').click() >>> browser.getControl(name='title').value = 'New FaqFolder Sample' >>> browser.getControl('Save').click()
我们检查更改是否已应用。
>>> 'Changes saved' in browser.contents True >>> 'New FaqFolder Sample' in browser.contents True
删除 FaqFolder 内容项
如果我们访问主页,我们可以在全局导航标签中看到一个带有“新 FaqFolder 样本”标题的标签。
>>> browser.open(portal_url) >>> 'New FaqFolder Sample' in browser.contents True
现在我们将删除“新 FaqFolder 样本”对象。首先我们转到内容标签,并选择“新 FaqFolder 样本”进行删除。
>>> browser.getLink('Contents').click() >>> browser.getControl('New FaqFolder Sample').click()
我们单击“删除”按钮。
>>> browser.getControl('Delete').click() >>> 'Item(s) deleted' in browser.contents True
因此,如果我们回到主页,就不再有“新 FaqFolder 样本”标签。
>>> browser.open(portal_url) >>> 'New FaqFolder Sample' in browser.contents False
作为贡献者添加新的 FaqFolder 内容项
不仅网站管理员可以添加 FaqFolder 内容项,网站贡献者也可以。
让我们注销,然后以“贡献者”身份登录,这是一个分配了贡献者角色的门户成员。
>>> browser.getLink('Log out').click() >>> browser.open(portal_url) >>> browser.getControl(name='__ac_name').value = 'contributor' >>> browser.getControl(name='__ac_password').value = default_password >>> browser.getControl(name='submit').click() >>> browser.open(portal_url)
我们使用“添加新”菜单来添加新的内容项。
>>> browser.getLink('Add new').click()
我们选择“FaqFolder”,然后点击“添加”按钮进入添加表单。
>>> browser.getControl('FaqFolder').click() >>> browser.getControl(name='form.button.Add').click() >>> 'FaqFolder' in browser.contents True
现在我们填写表单并提交它。
>>> browser.getControl(name='title').value = 'FaqFolder Sample' >>> browser.getControl('Save').click() >>> 'Changes saved' in browser.contents True
完成了!以贡献者身份登录时,我们添加了一个新的 FaqFolder 内容项。
最后,让我们以管理员的身份重新登录。
>>> browser.getLink('Log out').click() >>> browser.open(portal_url) >>> browser.getControl(name='__ac_name').value = portal_owner >>> browser.getControl(name='__ac_password').value = default_password >>> browser.getControl(name='submit').click() >>> browser.open(portal_url)
贡献者
本尼欧·苏托尔 - CIRB/CIBG,作者
古斯塔沃·莱普里
埃克托尔·韦尔达雷