Chris Withers wrote:
What's the difference between zope:view, browser:view, browser:page and browser:viewlet?

It's a mess. Here's the gist:


zope:adapter
  Registers an adapter and optionally applies a permission to the
  interface that you're adapting to, e.g.::

    <adapter
        factory="..."
        provides="...IFoo"
        permission="foo.permission"
        />

  will cause the adapter's attributes as specified in IFoo to be
  protected with the 'foo.permission' (everything else will not be
  accessible).

zope:view
  Registers an adapter and optionally applies a permission to all
  "allowed_attirbutes" or the "allowed_interface" if the "permission"
  parameter is given.

browser:view
  Like zope:view, except:

    * the request type (second adapted object) defaults to
      IBrowserDefaultLayer

    * the "permission" always applies to 'publishTraverse',
      'browserDefault' and '__call__' attributes, in addition to the
      optionally specified "allowed_attributes" or "allowed_interface"

    * support sub-pages that will be available as
      obj/@@viewname/subpage.

  Note: browser:view always creates new classes on the fly.

browser:page
  Registers an adapter where the second adapted object defaults to
  IBrowserDefaltLayer. Always creates a new class on the fly and
  mixes in functionality that makes the adapter a *publishable view*.

browser:viewlet
  Registers an adapter for (context, request, view). It's out of
  scope here, I think.


I wish we could clean this up some day, but all my earlier attempts to walk this direction have mostly been shot down because people apparently hate deprecation warnings.

I'm sick of ZCML and its magic and its inconsistency. The typing and the pointy brackets I could live with... ME GROK SMASH ZCML.

I'm trying to register an adapter in such a way that I can do the following in a page template:

<p tal:content="structure someobj/@@render"/>

Which of the myriad flavours of view registration should I be using?

Inherit from BrowserView and use either a simple <adapter /> or a <view /> or a <browser:view /> directive to register it. Note that this thing won't be publishable via the URL then (which is probably what you want).

If you want it to be published, inherit from BrowserPage and use <browser:page />

Also, why, when zope:view is described as a synonym for zope:adapter, does zope:view support an allowed_attributes attribute, while zope:adapter does not?

zope:adapter assumes the "provides" interface as the "allowed_interface".


--
http://worldcookery.com -- Professional Zope documentation and training
_______________________________________________
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com

Reply via email to