Re: Conditionally render viewlet

Jonathan Bowlas <j.bowlas-hclig2XLE9Zaa/[email protected]> Mon, 13 Jun 2011 13:43:35 +0100
Newsgroups gmane.comp.web.zope.silva.devel
Message-ID <[email protected]>
Hi Devs,

I've added this into my local version of silva.core.views view.py:

def isAvailable(viewlet):
    try:
        return viewlet.available
    except AttributeError:
        return True

class ConditionalViewletManager(ViewletManager):
    """A conditional viewlet manager in Silva.
    """
    grok.baseclass()
    grok.context(ISilvaObject)
    grok.implements(IViewletManager)

    def filter(self, viewlets):
      viewlets =3D super(ConditionalViewletManager, self).filter(viewlets)
      return [(name, viewlet) for name, viewlet in viewlets if
isAvailable(viewlet)]

Hopefully this can go into the core, although if you'd require any
modifications let me know so I can update our views.py file.

Usage in theme:

class LeftColumn(silvaviews.ConditionalViewletManager):
    """Left Content Area
    """
    pass

class LeftTopPortlet(silvaviews.Viewlet):
    """Left Column Topper Viewlet
    """
    grok.viewletmanager(LeftColumn)
    grok.name('lefttopportlet')
    available=3D False

class LeftNavigation(silvaviews.Viewlet):
    """Left Navigation Viewlet
    """
    grok.viewletmanager(LeftColumn)
    grok.name('leftnavigation')
    available=3D True

#usage with a method
class LeftPortlet(silvaviews.Viewlet):
    """Left Portlet Viewlet
    """
    grok.viewletmanager(LeftColumn)
    grok.name('leftportlet')

    @property
    def available(self):
        return self.layout.atts.ucl_left_col_include

HTH someone, thanks.

Jon

On 9 June 2011 12:41, Jonathan Bowlas <j.bowlas-hclig2XLE9Zaa/[email protected]> wrote:
> I think that would be best, I'm using it a lot and it seems a bit
> excessive to include a available() method to every viewlet I want
> included. (Although I have written a separate silvaviews.Viewlet class
> called IsAvailable with has the available() method which I subclass
> when I want a Viewlet available).
>
> Cheers
>
> J
>
> On 9 June 2011 12:28, Sylvain Viollon <[email protected]> wrote:
>> On Wed, 8 Jun 2011 15:54:05 +0200
>> Antonin AMAND <[email protected]> wrote:
>>
>> =A0Hello,
>>
>>> On Wed, Jun 8, 2011 at 1:37 PM, Jonathan Bowlas <j.bowlas-hclig2XLE9Zaa/[email protected]>
>>> wrote:
>>> > Is there an example infrae extension or theme where the filter
>>> > method is overridden?
>>> >
>>> > J
>>>
>>> Sorry. filter method takes the viewlets as parameter.
>>>
>>> def filter(self, viewlets):
>>> =A0 =A0viewlets =3D super(LeftColumn, self).filter(viewlets)
>>> =A0 =A0return [(name, viewlet) for name, viewlet in viewlets if
>>> viewlet.available()]
>>>
>>>
>>
>> =A0If this is often used, we could add a base class into
>> =A0silva.core.views that contains it by default.
>>
>> =A0Regards,
>>
>> =A0Sylvain,
>>
>>
>> --
>> Sylvain Viollon -- Infrae
>> t +31 10 243 7051 -- http://infrae.com
>> Hoevestraat 10 3033GC Rotterdam -- The Netherlands
>> _______________________________________________
>> silva-dev mailing list
>> silva-dev-IAPFreCvJWM6s/[email protected]
>> https://lists.infrae.com/mailman/listinfo/silva-dev
>>
>
>
>
> --
> Jonathan Bowlas
> Web Support Officer
> Media Services
> University College London
> Email: j.bowlas-hclig2XLE9Zaa/[email protected]
>



-- =

Jonathan Bowlas
Web Support Officer
Media Services
University College London
Email: j.bowlas-hclig2XLE9Zaa/[email protected]