2

Plone portal-personaltools メニューのマークアップを置き換えようとしていますが、いくつかの問題に遭遇しています。最初の問題は、XSL 変換が実行されているかどうかわからないことです。タグ内に配置しています。私の rules.xml ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<rules xmlns="http://namespaces.plone.org/diazo"
xmlns:css="http://namespaces.plone.org/diazo/css"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<rules css:if-content="#visual-portal-wrapper">

<theme href="theme.html" />

<!-- Head elements -->
<replace css:theme="html head title" css:content="html head title" />
<after css:theme-children="html head" css:content="html head base" />
<after css:theme-children="html head" css:content="html head script" />

<!-- Logo -->
<copy attributes="href" css:theme="#brand" css:content="#portal-logo" />

<!-- Tabs -->
<replace css:theme-children="#tabs" css:content-children="#portal-globalnav" />

<!-- Personal tools -->
<replace css:theme="#account-info" css:content="#portal-personaltools" />

<!-- This is not a complete XSL transfomation code. I was trying to follow someone elses code. -->


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/*">
<ul class="list-inline navbar-btn navbar-right" id="account-info">
<xsl:apply-templates select="dt"/>
</ul>
</xsl:template>

<xsl:template match="dt">
<li>
<xsl:apply-templates select="following-sibling::dd[1]"/>
</li>
</xsl:template>
</xsl:stylesheet>

<!-- Search -->
<copy attributes="action" css:theme="#searchbox" css:content="#portal-searchbox form" />
<copy attributes="name" css:theme="#searchbox .search-query" css:content="#portal-searchbox form .searchField" />

<!-- Edit bar -->
<before css:theme-children="#content" css:content="#edit-bar" />

<!-- Main columns -->
<replace css:content-children="#content" css:theme-children="#content" />
<replace css:content-children="#portal-column-one" css:theme-children="#left-column" />
<replace css:content-children="#portal-column-two" css:theme-children="#right-column" />

<!-- Footer -->
<replace css:theme-children="#footer" css:content-children="#portal-footer" />
<after css:theme-children="#footer" css:content="#portal-siteactions" />

</rules>

</rules>

正解です?XSL 変換が実行されているかどうかさえわからないため、私の XSL 変換は完了していませんが、変換しようとしているコードは次のとおりです。

<dl id="portal-personaltools" class="actionMenu deactivated">
<dt class="actionMenuHeader">
<a href="#/useractions" id="user-name">admin</a>
</dt>
<dd class="actionMenuContent">
<ul><li id="personaltools-dashboard">
<a href="#/dashboard">Dashboard</a>
</li>
<li id="personaltools-preferences">
<a href="#/@@personal-preferences">Preferences</a>
</li>
<li id="personaltools-plone_setup">
<a href="#/@@overview-controlpanel">Site Setup</a>
</li>
<li id="personaltools-logout">
<a href="#/logout">Log out</a>
</li>
</ul>
</dd>
</dl>

これに:

<ul class="list-inline navbar-btn navbar-right" id="account-info">
<li><a class="btn btn-primary" href="login.html">Sign In</a></li>
<li class="btn btn-primary dropdown">
<a id="drop1" href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">Account<b class="caret"></b></a>
<ul class="dropdown-menu" role="menu" aria-labelledby="drop1">
<li role="presentation"><a role="menuitem" tabindex="-1" href="dashboard.html">Dashboard</a></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="preferences.html">Preferences</a></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="site.html">Site Setup</a></li>
<li class="divider" role="presentation"></li>
<li role="presentation"><a role="menuitem" tabindex="-1" href="index.html">Log Off</a></li>
</ul>
</li>
</ul>

アップデート:

Plone がサインイン ボタンとユーザー アクション メニューをどのように表示するかについて、2 つ目の質問があります。ユーザーがログインしていないときにサインイン ボタンを表示し、ユーザーがログインしている間はユーザー アクション メニューのみを表示するようにルールを変更するにはどうすればよいですか? 私が修正した rules.xml は、この投稿の最後にある、追加のメモ/情報の後にあります。

Dan の修正に基づくスクリーンショット

別のボタンにユーザー名があるボタンと、ユーザー アクション メニューのあるアカウント ボタンを示すスクリーンショット

ダンによって提供されたソリューションにいくつかのわずかな変更を加えた後、ユーザーがログインしている間にユーザー アクション メニューを示すドロップダウンと共にユーザー名を表示するユーザー アクション メニューを用意しました。ユーザーがログオフしている間、私が今持っているのはサインイン ボタンのない空の Twitter Bootstrap ボタン。

ログアウトしたスクリーンショット

ログアウト 空の Twitter Bootstrap ボタンのスクリーンショット

ログイン中のスクリーンショット

ドロップダウンがアクティブなログイン中のスクリーンショット

ユーザーがログに記録されていない場合、HTML マークアップを次のように表示したいと考えています。

<ul id="account-info" class="list-inline navbar-btn navbar-right">
    <li>
      <a href="login.html" class="btn btn-primary">Sign In</a>
    </li>
</ul>

しかし、私の HTML マークアップは現在、ユーザーがログインしていないときに表示されます。

<ul id="account-info" class="list-inline navbar-btn navbar-right">
    <li></li>
    <li class="btn btn-primary dropdown">
        <ul aria-labelledby="drop1" role="menu" class="dropdown-menu"></ul>
    </li>
</ul>

最後に、変更した rules.xml

<replace css:content="#portal-personaltools">
    <ul class="list-inline navbar-btn navbar-right" id="account-info">
        <li>
            <!--Sign out Form-->
            <!--<li><a href="#" class="btn btn-primary">Sign In</a></li>-->
        </li>
        <li class="btn btn-primary dropdown">
            <xsl:apply-templates select="./dt/a" />
            <!--<a id="drop1" href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">Account<b class="caret"></b></a>-->
            <ul class="dropdown-menu" role="menu" aria-labelledby="drop1">
                <xsl:apply-templates select="./dd/ul/li" />
            </ul>
        </li>
    </ul>
</replace>

<replace css:content="#portal-personaltools dt a">
    <a>
        <!--<xsl:attribute name="class">btn btn-primary</xsl:attribute>-->
        <xsl:attribute name="role">button</xsl:attribute>
        <xsl:attribute name="class">dropdown-toggle</xsl:attribute>
        <xsl:attribute name="data-toggle">dropdown</xsl:attribute>
        <xsl:copy-of select="@*|node()" />
        <b class="caret"></b>
    </a>
</replace>

<replace css:content="#portal-personaltools dd li">
    <li role="presentation">
        <xsl:apply-templates select="./a" />
    </li>
</replace>

<replace css:content="#portal-personaltools dd li a">
    <a role="menuitem" tabindex="-1">
        <xsl:attribute name="href">
           <xsl:value-of select="@href" />
        </xsl:attribute>
        <xsl:value-of select="node()" />
    </a>
</replace>

前もって感謝します!

4

1 に答える 1

3

ここにあなたをそこに導く何かがあります。コメントからThis is not a complete XSL transformation code最後の</xsl:stylesheet>.

<replace css:content="#portal-personaltools">
  <ul class="list-inline navbar-btn navbar-right" id="account-info">
    <li>
      <xsl:apply-templates select="./dt/a" />
    </li>
    <li class="btn btn-primary dropdown">
      <a id="drop1" href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">Account<b class="caret"></b></a>
      <ul class="dropdown-menu" role="menu" aria-labelledby="drop1">
        <xsl:apply-templates select="./dd/ul/li" />
      </ul>
    </li>
  </ul>
</replace>

<replace css:content="#portal-personaltools dt a">
  <a>
    <xsl:attribute name="class">btn btn-primary</xsl:attribute>
    <xsl:copy-of select="@*|node()" />
  </a>
</replace>

<replace css:content="#portal-personaltools dd li">
  <li role="presentation">
    <xsl:apply-templates select="./a" />
  </li>
</replace>

<replace css:content="#portal-personaltools dd li a">
  <a role="menuitem" tabindex="-1">
    <xsl:attribute name="href">
      <xsl:value-of select="@href" />
    </xsl:attribute>
    <xsl:value-of select="node()" />
    </a>
</replace>

これにより、その場でコンテンツを変更する Diazo の機能が実行されます。

更新(OPの更新に対応):

私の経験則では、Diazo HTML の書き換えは、非常に予測可能で統一された HTML のみに制限することです。そうしないと、非常に複雑な XSLT になってしまい、保守が難しく破損しやすくなります (たとえば、Plone のマイナー アップグレードで個人用ツールのマークアップが変更された場合はどうなるでしょうか?) この時点で、別の Diazo/plone.app.theming 機能に切り替えます。 :属性を指定して、サポート ビューからコンテンツをフェッチする機能。hrefつまり、すべての個人用ツール ルールをワンライナーに置き換えます。

<replace css:theme="#account-info" css:content="#account-info" href="/@@account-menu" />

...そして、account-menuPython と Zope のページ テンプレートを自由に使用できる Python パッケージにブラウザー ビューを記述します。

(注: ここでは適切ではありませんが、ブラウザ ビューが非常に単純な場合は、plone.app.themingplugins のショートカットを使用して、Python パッケージなしでビューを登録できます。)

または、元のルールを維持することもできます

<replace css:theme="#account-info" css:content="#portal-personaltools" />

...そしてビューレット(パッケージplone.personal_barに登録されている)をオーバーライドします。plone.app.layout欠点の 1 つは、マークアップがテーマのないサイトでもオーバーライドされることです (つまり、 に表示されるデフォルトの「サンバースト」テーマhttp://127.0.0.1/Plone)。

で Diazo ルールを使用し、ビューレットhrefに基づいて独自のビューを作成しplone.personal_barます。

于 2013-09-04T21:39:01.403 に答える