def getItems(self):
        context = self.context
        request = self.request
        portal_state = getMultiAdapter((context, request), name="plone_portal_state")
        portal_url = portal_state.portal_url()
        settings = getMultiAdapter((context, request), name="megamenu-settings")
        ajax = settings.ajax
        # TODO: Restrict items?
        # Taken from Products/CMFPlone/skins/plone_scripts/getFolderContents.py to bypass show_inactive filter
        catalog = getToolByName(context, 'portal_catalog')
        query = {}
        query['sort_on'] = 'getObjPositionInParent'
        path = {}
        path['query'] = '/'.join(context.getPhysicalPath())
        path['depth'] = 1
        query['path'] = path
        contents = catalog.queryCatalog(query, show_all=1, show_inactive=True, )
        #contents = self.context.getFolderContents(contentFilter={'show_inactive': True})
        
        # Before getting items (actually, before rendering them), remove ICollageEditLayer from request
        composing = ICollageEditLayer.providedBy(request)
        if composing:
            noLongerProvides(request, ICollageEditLayer)
            
        current_url = request.get('ACTUAL_URL') + '/'
        items = []
        for content in contents:
            item = {}
            item['id'] = content.getId
            item['object'] = content
            is_collage = content.meta_type == 'Collage'
            if is_collage:
                collage = content.getObject()
                
            item['with_menu'] = is_collage
            item['title'] = content.Title or ''
            item['description'] = content.Description or ''
            if content.meta_type == 'ATLink':
                # For ATLinks, get the link
                remoteUrl = content.getRemoteUrl
                if remoteUrl[0] == '/':
                    item['url'] = '%s%s' % (portal_url, remoteUrl)
                else:
                    item['url'] = remoteUrl
            else:
                # For other contents, get its url
                item['url'] = content.getURL()
                if is_collage:
                    # Bug if it's a Collage, try to get its first related item
                    related = collage.getRelatedItems()
                    if len(related)>0:
                        item['url'] = related[0].absolute_url();


            # Should item be rendererd as 'selected'?
            # 1. item.url==portal_url and current_url==item.url
            # 2. item.url!=portal_url and current_url.startswith(item.url)
            if (item['url']==portal_url+'/' and current_url==item['url']) or \
               (item['url']!=portal_url+'/' and current_url.startswith(item['url'])):
                item['selected_class'] = 'selected'
            else:
                item['selected_class'] = ''
                
            if is_collage:
                item['class'] = 'menu-dropdown'
                if not ajax:
                    item['dropdown'] = collage.restrictedTraverse('@@menu-renderer')()
                    item['deferred'] = ''
                else:
                    item['dropdown'] = ''
                    item['deferred'] = '%s%s' % (content.getURL(), '/@@menu-renderer')
            else:
                item['class'] = ''
                item['dropdown'] = None
                item['deferred'] = ''
                
            items.append(item)

        if composing:
            alsoProvides(request, ICollageEditLayer)
            
        return items
 def update(self):
     renderer_class = ICollageEditLayer.providedBy(self.request) and \
                      EditRenderer or ViewRenderer
     renderer = renderer_class(self.context, self.request, self, self.manager)
     self.renderer = renderer.__of__(self)
     self.renderer.update()
 def is_edit_mode(self):
     return ICollageEditLayer.providedBy(self.request)
Example #4
0
    def getItems(self):
        context = self.context
        request = self.request
        portal_state = getMultiAdapter((context, request),
                                       name="plone_portal_state")
        portal_url = portal_state.portal_url()
        settings = getMultiAdapter((context, request),
                                   name="megamenu-settings")
        ajax = settings.ajax
        # TODO: Restrict items?
        # Taken from Products/CMFPlone/skins/plone_scripts/getFolderContents.py to bypass show_inactive filter
        catalog = getToolByName(context, 'portal_catalog')
        query = {}
        query['sort_on'] = 'getObjPositionInParent'
        path = {}
        path['query'] = '/'.join(context.getPhysicalPath())
        path['depth'] = 1
        query['path'] = path
        contents = catalog.queryCatalog(
            query,
            show_all=1,
            show_inactive=True,
        )
        #contents = self.context.getFolderContents(contentFilter={'show_inactive': True})

        # Before getting items (actually, before rendering them), remove ICollageEditLayer from request
        composing = ICollageEditLayer.providedBy(request)
        if composing:
            noLongerProvides(request, ICollageEditLayer)

        current_url = request.get('ACTUAL_URL') + '/'
        items = []
        for content in contents:
            item = {}
            item['id'] = content.getId
            item['object'] = content
            is_collage = content.meta_type == 'Collage'
            if is_collage:
                collage = content.getObject()

            item['with_menu'] = is_collage
            item['title'] = content.Title or ''
            item['description'] = content.Description or ''
            if content.meta_type == 'ATLink':
                # For ATLinks, get the link
                remoteUrl = content.getRemoteUrl
                if remoteUrl[0] == '/':
                    item['url'] = '%s%s' % (portal_url, remoteUrl)
                else:
                    item['url'] = remoteUrl
            else:
                # For other contents, get its url
                item['url'] = content.getURL()
                if is_collage:
                    # Bug if it's a Collage, try to get its first related item
                    related = collage.getRelatedItems()
                    if len(related) > 0:
                        item['url'] = related[0].absolute_url()

            # Should item be rendererd as 'selected'?
            # 1. item.url==portal_url and current_url==item.url
            # 2. item.url!=portal_url and current_url.startswith(item.url)
            if (item['url']==portal_url+'/' and current_url==item['url']) or \
               (item['url']!=portal_url+'/' and current_url.startswith(item['url'])):
                item['selected_class'] = 'selected'
            else:
                item['selected_class'] = ''

            if is_collage:
                item['class'] = 'menu-dropdown'
                if not ajax:
                    item['dropdown'] = collage.restrictedTraverse(
                        '@@menu-renderer')()
                    item['deferred'] = ''
                else:
                    item['dropdown'] = ''
                    item['deferred'] = '%s%s' % (content.getURL(),
                                                 '/@@menu-renderer')
            else:
                item['class'] = ''
                item['dropdown'] = None
                item['deferred'] = ''

            items.append(item)

        if composing:
            alsoProvides(request, ICollageEditLayer)

        return items