2012-09-22 43 views
1

我有以下grok'ed plone.directives.form代碼:頭<style>塊與plone.app.z3cform

class EditForm(TreeFormMixin, form.SchemaForm): 
    """ 
    Edit form for our model. 

    We got one dummy button which allows us to manually inspect the data postback values. 
    """ 
    grok.context(ISiteRoot) 
    grok.name("dgftreeselect-test") 
    grok.require('zope2.View') 

    ignoreContext = True 
    schema = IFormSchema 

    label = u"Tree selection demo and manual testing" 

    @button.buttonAndHandler(u'Turbo boost') 
    def handleApply(self, action): 

     data, errors = self.extractData() 
     if errors: 
      self.status = self.formErrorsMessage 
      return 

     raise ActionExecutionError(Invalid(u"Please see that data stays intact over postback")) 

它會導致這種形式 - 這是不是好找:

DGFs in the action

因爲它是一個演示表單,我想保留所有相關的材料在同一個.py文件中。但是,由於表單看起來很醜,我想從Python源代碼字符串在頁面上注入一個<style> CSS塊,以修復一些CSS樣式中最突出的問題。

plone.app.forms/BrowserViews提供了什麼樣的鉤子在<head>或生成的HTML頁面的任何部分插入自己的<style>塊?我不想爲此任務創建任何其他文件和CSS註冊。

完整的源:

https://github.com/miohtama/collective.z3cform.dgftreeselect/blob/master/src/collective/z3cform/dgftreeselect/testform.py

回答

2

plone.app.z3cform和Zope的瀏覽器視圖不提供任何鉤子注入定製的東西放到直接負責人,但你可以通過指定使用自定義模板表單類模板屬性:

template = grok.Template('path/to/template.pt') 

然後在template.pt,填補了style_slot,包括您的風格。整個模板看起來是這樣的:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" 
     xmlns:tal="http://xml.zope.org/namespaces/tal" 
     xmlns:metal="http://xml.zope.org/namespaces/metal" 
     xmlns:i18n="http://xml.zope.org/namespaces/i18n" 
     lang="en" 
     metal:use-macro="context/main_template/macros/master" 
     i18n:domain="plone"> 
<body> 

<metal:block fill-slot="style_slot"> 
    <style type="text/css"> 
     /* insert styles here */ 
    </style> 
</metal:block> 

<metal:content-core fill-slot="main"> 
    <metal:content-core define-macro="content-core"> 
     <tal:button metal:use-macro="context/@@ploneform-macros/titlelessform" /> 
    </metal:content-core> 
</metal:content-core> 

</body> 
</html> 

這不是最好的做法,因爲樣式必須送達每一個物件被渲染時間。相反,在portal_css工具中註冊CSS通常會更好。

+0

好的。這正是我想到的。也許在plone.app.z3cform中添加一些鉤子,以便替代模板+填充槽可以提供子視圖或功能的等價物?例如。 view.head?這對於特定於視圖的Javascript變量注入也是非常有用的。我可以在plone.app.z3cform包中使用它。 –