2013-07-18 4 views
1

Возможно ли, чтобы элементы темы Diazo зависели от роли пользователя в Plone? Например: я хотел бы предложить другое изображение заголовка в теме для некоторых определенных ролей и внести эти изменения на сайт, как только пользователь войдет в систему.Изменить элементы темы Diazo на основе роли пользователя

This question может быть связано, но я бы предпочел управлять это только через назначение ролей.

ответ

5

Это может быть возможно, указав theme parameter. Непроверенная, но вы можете определить параметр как это:

roles = python: portal_state.member().getRolesInContext(context) 

или что-то вроде:

is_manager = python: 'Manager' in portal_state.member().getRolesInContext(context) 

Затем использовать этот параметр в файле rules.xml. Это переключение тематизации от менеджеров:

<notheme if="$is_manager" /> 

Это не делает ничего с заголовками, но вы должны быть в состоянии экстраполировать от этого.

+0

Ничего себе! Я поражен тем, насколько прост и силен этот способ работы. Вы также используете другой пример, но настройка условий через диазо-тему напрямую происходит быстрее и проще. Для тех, кто пытается это сделать: обязательно перезапустите plone после изменения файла rules.xml. Перезагрузки css недостаточно для распространения изменений. – FvD

1

Если вы знаете, как обрабатывать код Python и создавать представление в браузере, вы можете определить представление браузера, которое возвращает некоторые css. Я использовал следующий код в клиентском проекте для вставки некоторого css, который устанавливает в качестве фона ближайший header.jpg, поэтому вы можете иметь разные фоны в разных разделах.

В configure.zcml:

<browser:page 
    for="*" 
    permission="zope.Public" 
    name="header-image-css" 
    class=".utils.HeaderImageCSS" 
    /> 

В качестве utils.py файла:

HEADER_IMAGE_CSS = """ 
#portal-header { 
    background: url("%s") no-repeat scroll right top #FFFFFF; 
    position: relative; 
    z-index: 2; 
} 

""" 


class HeaderImageCSS(BrowserView): 
    """CSS for header image. 

    We want the nearest header.jpg in the acquisition context. For 
    caching it is best to look up the image and return its 
    absolute_url, instead of simply loading header.jpg in the current 
    context. It will work, but then the same image will be loaded by 
    the browser for lots of different pages. 

    This is meant to be used in the rules.xml of the Diazo theme, like this: 

    <after css:theme="title" css:content="style" href="@@header-image-css" /> 

    Because we set the Content-Type header to text/css, diazo will put 
    a 'style' tag around it. Nice. 
    """ 

    def __call__(self): 
     image = self.context.restrictedTraverse('header.jpg', None) 
     if image is None: 
      url = '' 
     else: 
      url = image.absolute_url() 
     self.request.RESPONSE.setHeader('Content-Type', 'text/css') 
     return HEADER_IMAGE_CSS % url 

Для вашего случая использования вы могли бы получить роль, как это и затем возвращать различные CSS на основе этой информации (код непроверен):

def __call__(self): 
    from zope.component import getMultiAdapter 
    pps = getMultiAdapter((self.context, self.request), name='plone_portal_state') 
    member = pps.member() 
    roles = member.getRolesInContext(self.context) 
    css = "#content {background-color: %s}" 
    if 'Manager' in roles: 
     color = 'red' 
    elif 'Reviewer' in roles: 
     color = 'blue' 
    else: 
     color = 'yellow' 
    self.request.RESPONSE.setHeader('Content-Type', 'text/css') 
    return css % color 
+0

Большое спасибо за подходы, которые вы предлагаете! Дайте мне несколько дней, чтобы попробовать их и протестировать код, прежде чем я пометьте ответ как правильный. – FvD

Смежные вопросы