plone.resource

HomePage: https://svn.plone.org/svn/plone/plone.resource

Author: David Glick, Plone Foundation

Download: https://pypi.python.org/packages/source/p/plone.resource/plone.resource-1.0.2.zip

        Introduction
============

``plone.resource`` publishes directories of static files via the ZPublisher.
These directories may be located either in the ZODB (as OFS folders and
files), or on the filesystem.

Each resource directory has a type and a name. When combined, these are used
to traverse to the resource directory. For example::

    /++theme++mytheme/<subpath>
    /++sitelayout++mylayout/<subpath>
    /++templatelayout++mylayout<subpath>


Where resources can be stored
-----------------------------

Resource directory contents can be found by the traverser in several different
places. The following locations are tried in order.

Files in the ZODB
^^^^^^^^^^^^^^^^^

  Installing ``plone.resource`` creates a folder called portal_resources which
  can be used to store resource directories persistently. By convention, the
  top-level folders under this folder correspond to resource types, and the
  second-level folders correspond to the resource directory name.

  So, the file traversable at /++theme++mytheme/myfile could be physically
  located at some_site/++etc++site/resources/theme/mytheme

  (XXX: provide a helper to upload a tarball/zip)


Files in Python distributions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  A folder in a Python distribution (e.g. egg) can be registered as a resource
  directory of a particular type and name using the plone:static ZCML
  directive.  For example, this registers a directory named "theme" as a
  resource directory of type "theme". It would be accessible at
  ++theme++mytheme::

    <plone:static
      directory="theme"
      type="theme"
      name="mytheme"
      />

  .. note::
     You must do ``<include package="plone.resource" file="meta.zcml"/>``
     before you can use the plone:static directive.

  The name of the resource directory defaults to the name of the package, so
  can be omitted. e.g. the following directive in a package named "mytheme"
  would result in the same registration as above::

    <plone:static
      directory="resources"
      type="theme"
      />

  Traversing upward in directory paths using .. is not supported, as it could
  allow unwanted file access.

Minimum zcml config example
^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Note::

      <configure xmlns:plone="http://namespaces.plone.org/plone">
      <include package="plone.resource" file="meta.zcml"/>
      <plone:static
        directory="resources"
        type="theme"
        name="myproject"
        />
      </configure>

    ..

Files in a central resource directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    If the ``plone:static`` directive is used from ``site.zcml`` (i.e., with no
    active package in the ZCML import context), then it may specify the
    absolute path to a top-level resources directory.  This directory should
    have the same sub-directory structure as the in-ZODB resources directory in
    that top-level directories are resource types, and 2nd-level directories
    are resource directory names.  In addition, in order for resources to be
    available, the top-level directories require a traverser to be registered.

    For example, the following in ``site.zcml`` would register the given path
    within the buildout root::

      <plone:static
        directory="/path/to/buildout/var/resources"
        />

    Typically, this can be injected into ``site.zcml`` by specifying the
    ``resources option`` in the `plone.recipe.zope2instance`_
    buildout recipe, like this::

      resources = ${buildout:directory}/resources

    As a worked example, if one wanted to serve resources for use with
    ``plone.app.theming``, which provides the ``++theme++`` traverser, then
    a resource located at::

        ${directory}/resources/theme/my.project/logo.png

    would be traversable at a URL like so::

        http://localhost:8080/Plone/++theme++my.project/logo.png

.. _`plone.recipe.zope2instance`: http://pypi.python.org/pypi/plone.recipe.zope2instance

Additional traversers
---------------------

    Traversers can be registered via ZCML using an adapter like so::

     <adapter
       name="d