Re: Main Layout, Content Provider and Viewlet
Sylvain Viollon <[email protected]> Tue, 7 Jun 2011 13:31:00 +0200
| Newsgroups | gmane.comp.web.zope.silva.devel |
|---|---|
| Organization | Infrae |
| Message-ID | <[email protected]> |
On Tue, 7 Jun 2011 10:19:58 +0100 Jonathan Bowlas <j.bowlas-hclig2XLE9Zaa/[email protected]> wrote: > Hi Silva Devs > Hello, > Quick question, when developing a new visual theme is it possible to > call a function defined within a Main Layout object (i.e. the layout > object in the Porto layout called mainlayout) from another > ContentProvider or Viewlet page template? If so how would I do this? > If you define a method on your Main layout, you can access it from any view, content provider, viewlet or viewlet manager using the layout attribute: def update(self): ... self.layout.method() Or in a template: layout.method() (with Chameleon) layout/method (with regular templates) Your content provider, view, viewlet must have been created by inheriting from one of the base class of silva.core.view. If you add specific methods to your main layout that are used in your layout, don't forget to define them as well on the main layout used for errors, like for example : (https://dev.infrae.com/browser/silva.core.layout/src/silva/core/layout/porto/porto.py#L57) > The reason I ask is that we have a NonPublishable SimpleItem > (UCLAttributes object) that we use to allow Silva Editors to configure > various options within the layout, and rather than having to write a > function to call this from every Viewlet and ContentProvider everytime > I need a parameter it would be prefereable to call it once globally. > Yes, that would be preferable, and you can use the layout object for that, it is partially done for that. I would even recommend that if you have to compute a setting more than two time, you should set it on the layout object, in the update method (don't forget to call the update method on the parent class). Regards, Sylvain, -- Sylvain Viollon -- Infrae t +31 10 243 7051 -- http://infrae.com Hoevestraat 10 3033GC Rotterdam -- The Netherlands