简体   繁体   English

Plone-如何让验证器从行为中验证特定内容类型的字段?

[英]Plone - How can I make a validator validate a field from a behavior for a specific content type?

I am using Plone 4.3 and I have a form.SchemaForm plone.directives have an interface that has a start field from IEventBasic and a validator: 我正在使用Plone 4.3,我有一个form.SchemaForm plone.directives有一个接口,该接口具有IEventBasic的起始字段和验证器:

from datetime import timedelta
from plone.directives import form
from plone.app.contenttypes.interfaces import IEvent
from z3c.form import validator
from zope.component import provideAdapter
from zope.interface import Invalid

class IMyObject(form.SchemaForm)
    my_field_a = schema.TextLine(title='a_field')
    ...

class MyObject(Item):
    implements(IMyObject, IEvent)

class EndMyObjectValidator(validator.SimpleFieldValidator):
    def validate(self,value):
        #code for checking if end field is within a certain range from start field
        if self.end > self.start + timedelta(days=6):
            raise Invalid('The end date is not within range of the start date's week')

validator.WidgetValueDiscriminators(EndMyObjectValidator, field=IEventBasic['end'])
provideAdapter(EndMyObjectValidator)

In my type file (my.object.myobject.xml under profiles/default/types), I place the behavior in the behaviors section. 在我的类型文件(profiles / default / types下的my.object.myobject.xml)中,将行为放在行为部分中。

<behaviors>
    <element value="plone.app.event.dx.behaviors.IEventBasic"/>
</behaviors>

The problem is it validates the end field in any Event object or any object that implements the IEventBasic interface/schema. 问题在于它可以验证任何Event对象或实现IEventBasic接口/架构的任何对象中的end字段。

I thought maybe since the Plone documentation says that the parameters 'view' and 'context' of WidgetValueDiscriminators accept an interface, then I could do either: 我想也许是因为Plone文档说WidgetValueDiscriminators的参数'view'和'context'接受了一个接口,所以我可以这样做:

validator.WidgetValidatorDiscriminators(EndMyObjectValidator, view=IMyObject, field=IEventBasic['end'])

or 要么

validator.WidgetValidatorDiscriminators(EndMyObjectValidator, context=IMyObject,field=IEventBasic['end']

Unfortunately, none of those trigger at all. 不幸的是,这些根本没有触发。 I guess I'm misunderstanding what the context and view parameters actually do. 我想我误解了上下文和视图参数的实际作用。 How can I make it so the validators are specifically for dealing with MyObject? 我怎样才能使验证器专门用于处理MyObject?

Source: http://docs.plone.org/develop/addons/schema-driven-forms/customising-form-behaviour/validation.html 来源: http : //docs.plone.org/develop/addons/schema-driven-forms/customising-form-b​​ehaviour/validation.html

For now I am doing: 现在我正在做:

...
from gpcl.container.my_container import MyContainer

...

class EndMyObjectValidator(validator.SimpleFieldValidator):

    def validate(self,value):
        if self.widgets.form.portal_type <> 'my.object.myobject':
            return

        ...

validator.WidgetValueDiscriminators(EndMyObjectValidator, field=IEventBasic['end'])
provideAdapter(EndMyObjectValidator)

Update 2: I removed my comment before because it was for an unrelated problem. 更新2:我之前删除了我的评论,因为这是一个不相关的问题。 I changed the way I was checking for the type. 我更改了检查类型的方式。

Ok, register your own Add Form and Subclassing the Default Dexterity Add Form. 好的,注册您自己的添加表单并将“默认敏捷添加表单”子类化。 More Information about Validating in action handlers and Custom Add Forms 有关在操作处理程序自定义添加表单中进行 验证的更多信息

in my task.py (Contenttype and so on...): 在我的task.py (Contenttype等...)中:

# -*- coding: utf-8 -*-
from zope.interface import implementer
from zope.interface import Invalid
from z3c.form import button
from z3c.form import validator
from z3c.form import util
from z3c.form.interfaces import ActionExecutionError
from z3c.form.interfaces import WidgetActionExecutionError
from plone.dexterity.content import Item
from plone.dexterity.browser import add
from viisionar.training.interfaces import ITask
from Products.statusmessages.interfaces import IStatusMessage
from my.addon import _

@implementer(ITask)
class Task(Item):
    pass

class AddForm(add.DefaultAddForm):

    portal_type = 'Task'

    def __init__(self, context, request, ti=None):
        super(AddForm, self).__init__(context, request, ti=None)

    @button.buttonAndHandler(_('Save'), name='save')
    def handleAdd(self, action):

        print "Handle Add"
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        # Your Custom validation

        # Debug Do what yo want

        print data

        if error:
            """
            # Global Portal Message
            raise ActionExecutionError(Invalid(_(u"Please provide a valid end date")))

            # or

            # Error Message in Widget
            raise WidgetActionExecutionError('IEventBasic.end', Invalid(u"Please put the the right end date"))
            """
        # /Your Custom validation

        obj = self.createAndAdd(data)

        if obj is not None:
            # mark only as finished if we get the new object
            self._finishedAdd = True
            IStatusMessage(self.request).addStatusMessage(
                self.success_message, "info"
            )

class AddView(add.DefaultAddView):
    form = AddForm

in my configure.zcml i register the custom Add form 在我的configure.zcml我注册了自定义添加表单

<adapter
    for="
        Products.CMFCore.interfaces.IFolderish
        zope.publisher.interfaces.browser.IDefaultBrowserLayer
        plone.dexterity.interfaces.IDexterityFTI"
    provides="zope.publisher.interfaces.browser.IBrowserPage"
    factory="my.addon.task.AddView"
    name="Task" />

<class class="my.addon.task.AddView">
    <require
        permission="cmf.AddPortalContent"
        interface="zope.publisher.interfaces.browser.IBrowserPage"/>
</class>

in my task.xml Definition: 在我的task.xml定义中:

<property name="factory">Task</property>
<property name="schema">my.addon.interfaces.ITask</property>
<property name="klass">my.addon.task.Task</property>
<property name="behaviors">
  <element value="plone.app.content.interfaces.INameFromTitle" />
  <element value="plone.app.event.dx.behaviors.IEventBasic"/>
</property>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我如何验证猫鼬自定义验证器中的类型 - How can i validate type in mongoose custom validator 如何在Symfony中使用sfValidatorEmail验证器来验证单个电子邮件字段 - How can I use the sfValidatorEmail validator in Symfony to validate a single email field 如何在Javascript(Jquery)中定义Validator函数来验证输入字段? - How can I define a Validator function in Javascript (Jquery) to validate an input field? 如何使用 nest.js 中的类验证器验证数组中每个对象的字段 - How I can validate each object's field in array using class-validator in nest.js 在代码背后如何使验证器不验证? - In code behind how do I make a validator to not validate? 可以使用休眠验证器根据来自另一个类的字段值来验证字段 - Can hibernate validator be used to validate a field depending on a field value from another class 如何使用翻译器和/或验证器制作Tapestry 4中所需的String字段? - How can I use a translator and/or validator to make a String field required in Tapestry 4? 如何验证触发器中的字段类型? - How do I validate a field type in a trigger? NHibernate Validator-如何验证枚举类型 - NHibernate Validator - how to validate enum type 如何验证来自特定域的电子邮件地址? - How can I validate an email address from a specific domain?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM