Package: yafowil.plone
This is thePlone IntegrationforYAFOWILFunctionalityResources Integration with GenericSetupAddon widgets may provide custom javascripts, CSS, images and so on.This package registers the directories containing these assets as
resource directories. Thus they can be accessed from the webbrowser.
The registration schema is++resource++MODULENAME/....The “YAFOWIL Form Library” GS profile registers all resources related to
so called “resource groups” in the CSS and javascript registries.This resource groups must be enabled explicitly(!). The resource groups
configuration happens via the portal registry.You need to provide a Generic setup profile containing aregistry.xmlwith
the resource groups configuration, e.g.:<!-- yafowil.widget.array -->
<record name="yafowil.widget.array.common">
  <field type="plone.registry.field.Bool">
    <title>Array widget common resources</title>
  </field>
  <value>True</value>
</record>The recordnamemaps to the resource group name.NoteThe profile to register the resoures in resource registries (the default
profile) must run AFTER the resource groups have been configured. Thus you
are forced to use 2 profiles; one registering the resource groups, and one
depending on the resource groups profile and the yafowil profile in it’smetadata.xml. In other words, if you add a plugin
(like yafowil.widget.autocomplete)after yafowil.plone installationyou MUST re-install yafowil.plone in order to get new plugin’s resources
registered.Take a look intoregistry.xmlof theyafowil.plone:profiles/demoresourcesprofile for more examples or consider
the referring resource providing code inside the addon widgets, usually
contained in the packages__init__.pyfile to get available resource
groups.Integration with TranslationThe package adds an translation method for Zope2 i18n messages. It’s added
using by defining a global preprocessorRequest wrapperThis package registers a global preprocessor for YAFOWIL. It wraps the Zope2
request by an own request instance providing the behavior expected by YAFOWIL.
Spezial behaviors:File Uploads provided by Zope2 asZPublisher.HTTPRequest.Fileuploadobjects are turned into Dicts with the keys:filefile-like object to read data fromfilenamesubmitted name of the uploadmimetypetype of the uploadheadersall headersoriginalkeeps the originalZPublisher.HTTPRequest.FileuploadobjectBase FormsThis package ships with base forms to be extended.The following form base classes are available:yafowil.plone.form.BaseFormdoes not define a`__call__`method: define a template in ZCML or a`__call__`method. It provides a method named`render_form`which processes and renders the form.yafowil.plone.form.Formrenders the naked form on__call__.yafowil.plone.form.YAMLBaseFormsimilar toBaseFormabove. Expects propertiesform_templatepointing to a YAML file andmessage_factoryproviding the message
factory used for YAML message strings.yafowil.plone.form.YAMLFormsimilar toYAMLBaseFormrenders the naked YAML form on__call__.Concrete implementation may look like:>>> from yafowil.base import factory
>>> from yafowil.plone.form import Form

>>> class MyForm(Form):
...     action_resource = '@@view_name_callable_by_browser'
...
...     def prepare(self):
...         form = factory(
...             'form',
...             name='myform',
...             props={
...                 'action': self.form_action,
...             })
...
...         # form widgets creation here...
...
...         self.form = formConvenience for creating YAML forms:>>> from zope.i18nmessageid import MessageFactory
>>> from yafowil.plone.form import YAMLBaseForm

>>> class MyYAMLForm(YAMLBaseForm):
...     action_resource = '@@view_name_callable_by_browser'
...     form_template = 'package.name:forms/myform.yaml'
...     message_factory = MessageFactory('package.name')Form classes inherit fromProducts.Five.BrowserPage, thus they
must be registered via ZCMLbrowser:pagedirective:<browser:page
  for="*"
  name="form_registration_name"
  class=".forms.MyYAMLForm"
  template="myyamlform.pt"
  permission="cmf.ModifyPortalContent"
/>Forms build with this base form classes need a template in
order to insert such a form in a layout. It must be called inside a
wrapper template`myform.yaml`:<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="package.name">
  <body>
    <metal:content-core fill-slot="content-core">
      <metal:block define-macro="content-core">
        <tal:form replace="structure view/render_form" />
      </metal:block>
    </metal:content-core>
  </body>
</html>In Plone 5.x,
when not using one of the BaseForms,
theCSS/JS resources for YAFOWIL are not loadedautomatically.Add the following lines in order to load it:from Products.CMFPlone.resources import add_bundle_on_request

...

class MyViewWithYafowil(BrowserView):

def __init__(self, context, request):
    super(MyViewWithYafowil, self).__init__(context, request)
    add_bundle_on_request(request, 'yafowil')Detailed DocumentationIf you’re interested to dig deeper: Thedetailed YAFOWIL documentationis available.
Read it and learn how to create your example application with YAFOWIL.Source CodeThe sources are in a GIT DVCS with its main branches atgithub.ContributorsJens W. Klein <jens [at] bluedynamics [dot] com>Peter Holzer <hpeter [at] agitator [dot] com>Benjamin Stefaner <bs [at] kleinundpartner [dot] at>Robert Niederreiter <rnix [at] squarewave [dot] at>History3.0.0 (2019-02-19)Add resources explicit in pages using YAFOWIL.
Do not deliver the CSS/JS chunk on every request.
Code using yafoil w/o theyafowil.plone.form.*as base class need a minimal modification.
See README.
[jensens]Useself.contextinstead ofcontextinCSRFProtectionBehaviorwhen looking up fallback root key manager.
[rnix]Deliver resources asplone.stableResourceto cache JS/CSS in browser.
[jensens]Python 3 support:
[reinhardt]Replaced UserDictReplaced old-style relative importFixed StringIO importFixed text handlingDeliver jqueryui on request and remove dependency on collective.js.jqueryui
[agitator]2.4.1 (2017-03-10)Reduce logging verbosity on load from info to debug.
[jensens]2.4.0 (2017-03-10)Introduceyafowil.plone.form.CSRFProtectionBehavior.
[rnix]2.3.1 (2016-09-14)Fix yafowil dependency minimal version
[jensens]2.3 (2016-09-09)Useyafowil.utils.entry_pointdecorator.
[rnix]Plone 5 support.
[rnix]2.2 (2015-10-10)Usepkg_resources.get_distributioninstead of catchingImportErrorto check whether TinyMCE is installed.
[rnix]Make dependency on Products.TinyMCE a soft dependency.
[thet]2.1 (2013-06-03)Set applyPrefix for CSS resources to True, so that referenced images can
still be found.
[thet, 2014-05-06]Integrate translations.
[rnix, 2014-05-01]2.0.2fix resource group names
[thet]correct getSite import, cleanup
[thet]2.0.1Provdide defaulttitleattribute value forrichtextblueprint ofyafowil.widget.richtextaddon widget in order to provideTinyMCEconfiguration as expected by plone integration.
[rnix]2.0YAFOWIL resource including configuration via generic setup.
[rnix, 2012-10-03]1.3.1Simplify base forms for plone.
[jensens, 2012-05-21]Not ZIP safe!
[jensens, 2012-04-15]1.3GS profile marker - fix wrong filename.
[rnix, 2012-04-11]Addyafowil.plone.formmodule containing base classes.
[rnix, 2012-04-11]1.2Rename to yafowil.plone - seems a 2 at the end of a package name confuses
easy_install. wtf!?
[jensens, 2012-03-20]1.1Depend on yafowil 1.3 in setup.py and bump version.
[jensens, 2012-03-20]1.0Resources are registered using the new plugin infrastructure.
Theres now an import step for generic setup registering all javascripts and
stylesheets provided by the plugins. They are registred without any
thirdparty dependencies. If a resource is already registered its registration
is skipped. Such its possible to register or overide the defaults using xml
files.
[jensens, 2012-02-01]Automatic browserresources for plugins.
[jensens, 2012-02-16]Depends on yafowil 1.3 plugin infrastucture.
[jensens, 2012-02-15]Example form and senseful default-classes and plans for plone.
[hpeter, bennyboy, 2012-02-15]1.0-betaMade it work.
[jensens, rnix, et al, 2010-12-27]LicenseCopyright (c) 2010-2016, BlueDynamics Alliance, Austria
All rights reserved.Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.Neither the name of the BlueDynamics Alliance nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.THIS SOFTWARE IS PROVIDED BY BlueDynamics AllianceAS ISAND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL BlueDynamics Alliance BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.