跳转到主要内容

使用select2的z3c表单关键字小部件。

项目描述

简介

ftw.keywordwidget 提供了六个功能

  1. 一个小部件,它加载 select2 以提高单选和多选字段的可用性。

  2. 一个 ChoicePlus 字段,允许新术语。这防止我们创建一个具体的、复杂的来源,该来源允许新项目。

  3. 为新的术语渲染一个额外的 New Entry 文本区域。

  4. 使用 select2 的标签功能来添加新关键词。

  5. 一个异步选项,用于使用 select2 AJAX 选项获取可选择的选项。

  6. 结果和所选项目的自定义模板

该小部件支持 schema.Choice、schema.Tuple 和 schema.List 字段。

Unicode或utf-8??

此包提供的 ICategorization 行为依赖于 plone 默认索引“主题”。在 DX 中,“主题”是“subject”的访问器,它返回 utf-8。“subject”本身有一个属性获取器“subjects”,其中存储了实际值。

Plone KeywordsVocabulary 使用目录值构建其术语,在“主题”索引的情况下是 utf-8。按照惯例,索引值应始终为 utf-8,DX 值应始终为 unicode。

这意味着在 KeywordsVocabulary 的情况下,值需要存储为 utf-8,因为词汇表值已编码为 utf-8。SequenceWidget fieldToWidget 转换器包含一个健全性检查,确保只计算也是词汇表中的字段值。这意味着如果您将新术语作为 unicode 值存储,整个系统就会崩溃。当前该小部件确保与“主题”索引完美工作,该索引依赖于 utf-8 值,这在 DX 类型中并不常见。

除了主要的使用案例之外,该小部件还支持具有 unicode 值的词汇表,但需要在小部件上单独进行配置。然后,新术语作为 unicode 而不是 utf-8 添加。

directives.widget('unicode_keywords', KeywordFieldWidget, new_terms_as_unicode=True)
unicode_keywords = schema.Tuple(
    title=u'UnicodeTags',
    value_type=ChoicePlus(
        title=u"Multiple",
        vocabulary='ftw.keywordwidget.UnicodeKeywordVocabulary',
        ),
    required=False,
    missing_value=(),
)

异步选项

异步选项只能在源是 z3c.formwidget.query.interfaces 的 IQuerySource 时使用。该接口通过一个 search 方法扩展了 ISource 规范,这对于异步选项至关重要。

基本上,如果 async=True,select2 小部件会通过一个给定的搜索词向一个搜索端点请求可能的选项。此外,搜索端点查询字段上定义的 IContentSourceBinder

directives.widget('async', KeywordFieldWidget, async=True)
async = schema.Tuple(
    title=u'Some async values',
    value_type=ChoicePlus(
        source=MySourceBinder(),
        ),
    required=False,
    missing_value=(),
)

主要用例

该小部件提供与 AT Keywordwidget 相同的功能,并带来一些好处。

AT 小部件的功能

  • 通过权限/角色保护添加新术语

  • 显示所有可能的值

  • 添加新术语

好处

  • 可配置的 select2 小部件

  • 小部件的正常默认值

  • z3c.form 小部件

  • 基于 SelectWidget(无需新转换器等)

  • 每个字段/小部件可配置“添加新术语权限”

界限

还有几个其他 plone 4.x 的 z3c form 小部件,提供了类似的功能集,如 collective.z3cform.keywordwidgetAutocompleteWidget

  • 它们不适合主要的使用案例。

此外,您可以根据需要配置 select2 插件。

兼容性

Plone 4.3.x 和 5.1.x

请注意,Plone 5.1.x 使用 Select2 的 v3.5 版本,而此产品使用 v4.0.2。

安装

  • 将包添加到您的 buildout 配置中

[instance]
eggs +=
    ...
    ftw.keywordwidget

使用/集成

此小部件不会自动应用于所有可能的 select 字段。想法是您根据自己的需要自行集成。

但对于上述提到的主要使用案例,有一个行为

  1. 如果需要,安装 default 配置文件和 select2js 配置文件。

  2. 在您的内容类型上启用 ftw.keywordwidget.behavior.IKeywordCategorization 行为。

对于一些其他使用案例,您还可以启用 ftw.keywordwidget.behavior.IKeywordUseCases 行为。这启用了单选和多选字段。

请查看 behaviors.py 以获取示例

from ftw.keywordwidget.widget import KeywordFieldWidget


class IKeywordUseCases(model.Schema):

    directives.widget('types', KeywordFieldWidget)
    types = schema.List(
        title=u'Types',
        value_type=schema.Choice(
            title=u"Multiple",
            vocabulary='plone.app.vocabularies.PortalTypes',
            ),
        required=False,
        missing_value=(),
    )

    directives.widget('types2', KeywordFieldWidget)
    types2 = schema.Choice(
        title=u'Single type',
        vocabulary='plone.app.vocabularies.PortalTypes',
        required=False,
        missing_value=(),
    )

alsoProvides(IKeywordUseCases, IFormFieldProvider)

您可以通过向小部件工厂提供 js_config 来按需配置 select2。

directives.widget('types',
                  KeywordFieldWidget,
                  js_config={'placeholder': 'Select something...'})

此软件包附带 select2 4.0.2 JS 插件。但它不是默认配置文件中安装的,因为您可能已经为其他目的安装了 select2 JS。如果需要 select2,您可以安装 ftw.keywordwidget Install select2 jquery plugin 配置文件。

模板

您可以定义每个 plone-widget 的自定义模板,或者替换所有使用的关键字小部件的默认小部件。

首先,您需要创建一个新的模板(查看 select2 文档以了解 select2 上下文中的模板是什么)。将其包装在一个构造函数函数中,以便访问小部件本身(上下文感知)。

function myPurpleTemplate(widget) {
    return function(data) {
        return $('<span style="background-color:purple" />').text(data.text);
    }
}
function myBlueTemplate(widget) {
    return function(data) {
        return $('<span style="background-color:blue" />').text(data.text);
    }
}

然后您需要注册它

$(document).on('ftwKeywordWidgetInit', function(e) {
  window.ftwKeywordWidget.registerTemplate('purple', myPurpleTemplate);
  window.ftwKeywordWidget.registerTemplate('blue', myBlueTemplate);
});

并在您期望的小部件中使用它

directives.widget('colours', KeywordFieldWidget,
                  template_selection='purple'
                  template_result='blue')
colours = schema.Tuple(
    title=u'Some colours',
    value_type=ChoicePlus(source=MySourceBinder()),
    required=False,
    missing_value=(),
)

如果您希望覆盖默认模板,只需为以下模板注册模板:

defaultResultTemplatedefaultSelectionTemplate,具体取决于您想覆盖哪个默认模板。

function myBlackTemplate(data) {
    return $('<span style="background-color:black" />').text(data.text);
}

$(document).on('ftwKeywordWidgetInit', function(e) {
  window.ftwKeywordWidget.registerTemplate('defaultResultTemplate', myBlackTemplate);
});

开发

Python

  1. 分支此存储库

  2. 克隆您的分支

  3. Shell: ln -s development.cfg buidlout.cfg

  4. Shell: python boostrap.py

  5. Shell: bin/buildout

运行 bin/test 以测试您的更改。

或通过运行 bin/instance fg 来启动实例。

变更日志

2.2.4 (2021-05-10)

  • 修复无效的初始化,例如在 PAM 视图中。[mathias.leimgruber]

2.2.3 (2021-05-03)

  • 确保自定义焦点事件不会在非关键字wifget select2 字段上触发。[mathias.leimgruber]

  • 将 Plone 5 升级步骤移动到正确的文件夹,以便 ftw.upgrade 可以获取它。[Nachtalb]

2.2.2 (2020-07-23)

  • 停止为 JavaScript 生成 sourcemaps(它不与 Plone 一起使用)。[djowett-ftw]

  • 修复初始化过早时的空 select2 小部件。[Nachtalb]

2.2.1 (2020-05-12)

  • 修复 Plone5 JS 初始化 + 修复在标签页更改时加载关键字小部件。[mathias.leimgruber]

2.2.0 (2019-12-14)

  • 修复产品以在 Plone5 生产环境中运行(解决 #46)[djowett-ftw]

  • 修复点击事件以编辑表单标签页(解决 #42)[djowett-ftw]

2.1.2 (2019-11-12)

  • 在构建词汇表之前明确清除 collective.indexing 队列,以解决一些竞态条件,在这些条件下目录内容不是最新的。[lgraf]

2.1.1 (2019-10-17)

  • 确保来自 KeywordSearchableSource 的术语有一个标题。[njohner]

  • 将变更日志附加到 long_description。[Nachtalb]

2.1.0 (2019-08-20)

  • 允许在非异步模式下使用来源。[njohner]

  • 允许在异步模式下添加新术语。[njohner]

  • 修复了一个错误,即在使用另一个异步小部件后不再可能添加标签。[elioschmutz]

2.0.0 (2019-04-18)

  • 添加对 Plone 5.1.x 的支持。[mbaechtold]

  • 将 select2 的新版本集成到关键字小部件资源中,以防止与 plone 所需的旧版 select2 发生冲突。[mathias.leimgruber, busykoala]

1.5.2 (2018-09-21)

  • 修复法语翻译。[phgross]

1.5.1 (2018-08-27)

  • 从 ChoicePlus 中删除不适当的父级验证的父级。[Rotonen]

1.5.0 (2017-12-14)

  • 重大更改:不允许在初始化时设置自定义权限。[Rotonen]

  • 将意外持续存在的权限检查从字段移动到小部件,并将结果缓存在请求中。[Rotonen]

1.4.2 (2017-11-23)

1.4.1 (2017-11-15)

  • 在初始化小部件后添加事件。[elioschmutz]

1.4.0 (2017-11-14)

  • 为select2小部件添加添加模板的功能。[elioschmutz]

1.3.6 (2017-08-31)

  • 只有当它确实是一个新选中的术语时,才将术语添加到新字段列表中。[mathias.leimgruber]

1.3.5 (2017-08-31)

  • 修复了一个我在1.3.3中引入的,但在1.3.4中未捕获的bug :-( [mathias.leimgruber]

1.3.4 (2017-08-30)

  • 自动打开单值字段的搜索菜单。[mathias.leimgruber]

  • 修复Bug:修复单值字段上的JS错误。[mathias.leimgruber]

1.3.3 (2017-07-31)

  • 修复Bug:如果项目没有被“真正”选中,则不再添加项目。[mathias.leimgruber]

1.3.2 (2017-07-11)

  • 删除了无< cite>factory配置的行为的冗余< cite>for属性。[phgross]

1.3.1 (2017-06-14)

  • 添加了法语翻译。[phgross]

  • 修复Bug:在搜索端点不使用值作为id。[mathias.leimgruber]

  • 修复Bug:由于self.value存储小部件的值,因此通过令牌而不是值获取存储的术语。[mathias.leimgruber]

1.3.0 (2017-05-11)

  • 为具有异步选项的关键字小部件添加测试浏览器小部件。[mathias.leimgruber]

  • 不再在控件中内联加载关键字小部件的JS。[mathias.leimgruber]

  • 实现新的异步选项。[mathias.leimgruber]

1.2.0 (2017-04-24)

  • 实现新的选项,以创建具有Unicode值的新术语,而不是UTF-8。[mathias.leimgruber]

1.1.4 (2017-03-20)

  • 始终隐藏新条目字段。[mathias.leimgruber]

1.1.3 (2017-03-09)

  • 不再使用非ASCII字符重复关键字。[deiferni]

  • 当表单包括控件且具有验证错误时,不要删除用户输入。[deiferni]

  • 修复用户仅向控件中插入一个关键字时的问题。[elioschmutz]

  • 修复selec2js配置文件路径到select2资源的错误。[deiferni]

1.1.2 (2017-03-02)

  • 将select2从4.0.3降级到4.0.2以修复ie11问题。请参阅https://github.com/select2/select2/issues/4525。[elioschmutz]

  • 将select2文件移至不带版本后缀的文件夹。这使得在没有升级步骤的情况下升级/降级select2版本变得更加容易。[elioschmutz]

1.1.1 (2017-02-22)

  • 修复Bug:有关词汇表和select2的标签功能。[mathias.leimgruber]

1.1.0 (2017-02-08)

  • 添加i18n辅助程序以进行翻译。[mathias.leimgruber]

  • 实现select2标签选项以添加新关键字。这隐藏了新关键字文本区域。警告:这是新的默认值,您可以通过传递< cite>tags: false来禁用它。[mathias.leimgruber]

1.0.4 (2017-02-07)

  • 添加对< cite>schema.Tuple字段的支持。[mathias.leimgruber]

1.0.3 (2016-10-04)

  • 禁用已压缩的“select2.min.js”的压缩。[mbaechtold]

1.0.2 (2016-09-28)

  • 将“添加新术语权限”配置为可配置的,并支持lawgiver。[mathias.leimgruber]

1.0.1 (2016-09-28)

  • 如果覆盖内容被替换,则重新初始化select2。[mathias.leimgruber]

1.0.0 (2016-09-28)

  • 初始化发布 [mathias.leimgruber]

项目详细信息


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

ftw.keywordwidget-2.2.4.tar.gz (188.8 kB 查看哈希值)

上传时间

支持者