1

PloneでDiazoテーマの要素をユーザーロールに依存させることは可能ですか? 例: いくつかの特定の役割のテーマで異なるヘッダー画像を提供し、ユーザーがログインするとすぐにサイトでこれらを変更したいと考えています.

この質問は関連している可能性がありますが、役割の割り当てを通じてのみ管理したいと思います。

4

2 に答える 2

5

これは、テーマ パラメータを指定することで可能になる場合があります。テストされていませんが、次のようにパラメーターを定義できます。

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

または次のようなもの:

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

次に、そのパラメーターを rules.xml ファイルで使用します。これにより、マネージャーのテーマがオフになります。

<notheme if="$is_manager" />

それはヘッダーでは何もしませんが、そこから推定できるはずです。

于 2013-07-18T21:55:03.180 に答える
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
于 2013-07-18T22:08:37.253 に答える