2

我正在尝试替换 Plone 门户-个人工具菜单的标记,但遇到了一些问题。第一个问题是我不确定我的 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 转换不完整,因为我什至不确定它是否正在运行,但我要转换的代码是:

<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 如何显示登录按钮与用户操作菜单,我还有一个次要问题。如何修改规则以在用户未登录时显示登录按钮,而在用户登录时仅显示用户操作菜单?在我添加注释/信息之后,我修改的 rules.xml 位于这篇文章的底部。

基于 Dan 修改的截图

屏幕截图显示了一个在单独的按钮中包含用户名的按钮,以及一个带有用户操作菜单的帐户按钮

在对 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" />

...并在 Python 包中编写浏览器视图account-menu,您可以在其中使用 Python 和 Zope 页面模板。

(注意:这里不合适,但是如果您的浏览器视图非常简单,您可以使用plone.app.themingplugins 的快捷方式来注册没有 Python 包的视图。)

或者,您可以保留原来的规则

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

...并覆盖plone.personal_barviewlet(在plone.app.layout包中注册)。一个缺点是标记也会在非主题站点中被覆盖(即您在 中看到的默认“Sunburst”主题http://127.0.0.1/Plone)。

我会使用 Diazo 规则href,并根据plone.personal_barviewlet 编写我自己的视图。

于 2013-09-04T21:39:01.403 回答