[英]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-behaviour/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.