在没有main_template的情况下渲染Plone SchemaAddForm?

时间:2014-03-24 19:03:17

标签: tinymce plone

我正在尝试编写一个需要“添加新”表单的Plone插件。到目前为止,我已经设法使用plone.directives.form.SchemaAddForm非常好地工作了。我在configure.zcml中注册了“@@ create-snippet”视图,当我正常查看页面时,它可以正常工作。

但是,此项目的最终目标是将此添加表单添加到TinyMCE弹出窗口中。我为附加组件的另一个不相关的部分创建了一个有效的TinyMCE插件,并且运行良好。但是,当我尝试在tinyMCE窗口中导航到我的“@@ create-snippets”视图时,我得到:

LocationError :( Products.Five.metaclass.DirectoryResource2对象位于0x107162fd0,'main_template')

我对这个问题的理解是,基本上,SchemaAddForm类(或其中一个超类,确切地说)在呈现表单时用主Plone main_template包装表单。由于TinyMCE窗口是他们自己的,孤立的小世界,模板不可用,因此,无法呈现....或类似的东西?如果我要离开,请纠正我。

我真正想知道的是,是否有可能进行设置,只有表单本身才能呈现,而不使用main_template?我真的希望能够利用基于模式的表单(及其内置验证),但仍然能够将所有内容保存在TinyMCE窗口中。

我玩弄了创建自己的ViewPageTemplateFile()模板,并让表单在其中呈现(不知何故?),但坦率地说,我不知道如何....或者甚至是否可能。

如果我省略了什么,请随时询问更多信息。我对这种Plone开发有点新意。

生成表单的代码:

from Products.Five.browser import BrowserView
from uwosh.snippets.snippet import SnippetManager
from plone.directives.form import SchemaAddForm
import zope.interface
from plone.autoform.form import AutoExtensibleForm
import zope.schema
from plone.directives import form
import z3c
from Products.statusmessages.interfaces import IStatusMessage

_ = zope.i18nmessageid.MessageFactory(u'uwosh.snippets')


class ISnippet(form.Schema):
    title = zope.schema.TextLine(
                                 title=u'Title',
                                 description=u'The title to associate with the snippet.',
                                 required=True)

    description = zope.schema.TextLine(
                                 title=u'Description',
                                 description=u'A short explanation of the snippet.',
                                 required=True)

    body = zope.schema.Text(
                                 title=u'Body',
                                 description=u'The actual content to be rendered on the page.',
                                 required=True)

class SnippetForm(SchemaAddForm):

    schema = ISnippet

    @z3c.form.button.buttonAndHandler(_('Save'), name='save')
    def handleAdd(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return
        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(_(u"Snippet saved"), "info")

    @z3c.form.button.buttonAndHandler(_(u'Cancel'), name='cancel')
    def handleCancel(self, action):
        IStatusMessage(self.request).addStatusMessage(_(u"Add New Snippet operation cancelled"), "info")
        self.request.response.redirect(self.nextURL())


    def create(self, data):
        sm = SnippetManager()

        #TODO:
        #Include support for different folders from this form.
        snippet = sm.createSnippet(data['title'], None ,data)


        return snippet

    def add(self, object):
        #Since, for now, snippets are based upon ATDocuments, their creation is fairly staight-forward.
        #So, we don't really need separate Add/Create steps.
        return

    def nextURL(self):

        return self.context.absolute_url() + '/@@create-snippet'

0 个答案:

没有答案