我正在使用Liferay的权限,我正面临一个问题。我有这个页面结构:
->Page 1
---->Child page 1
---->Child page 2
---->Child page 3
->Page 2
(...)
每个子页面(1,2,3)具有不同的权限。我想要的是让“Page 1”仅对至少访问一个子页面的用户可见。另一方面,如果用户无权访问任何子页面,则该页面不可见。
我已经删除了“Page 1”的所有权限,期望它承担子级权限,但是这样页面始终是不可见的。
我该怎么做才能解决这个问题?
**不完善的解决方案**
好吧,在我设置为'对所有已登录用户可见'的权限中,并为子页面提供了所需的权限,然后我在navigation.vm中改变了这种方式:
<ul id="mainTopMenu">
## First Level Generation
#foreach ($nav_item in $nav_items)
#if ($nav_item.hasChildren())
<li>
<a> $nav_item.getName()</a>
<ul>
## Second Level Generation
#foreach ($nav_child in $nav_item.getChildren())
<li>
<a href="$nav_child.getURL()">
$nav_child.getName()
</a>
</li>
#end
</ul>
</li>
#end
</ul>
此代码的作用始终是显示包含子项的页面。但这只有在我只有儿童页面时才有效,但事实并非如此。我有3页没有孩子,所以为了解决这个问题,我做了另外的陈述:
#else
#set ($str = $nav_item.getURL().substring($nav_item.getURL().lastIndexOf("bc"),$nav_item.getURL().length()))
#if ($str.equals("bclogin") || $str.equals("bchome") || $str.equals("bcmaintenance"))
<li>
<a href="$nav_item.getURL()">
$nav_item.getName()
</a>
</li>
#end
#end
这解决了我的整个问题。关于这段代码的唯一问题是我需要指定没有孩子的页面的名称,这不是一个好的原则,因为我每次添加/删除/编辑一个页面时都需要编辑这段代码。
我正在努力寻找更好的解决方案,我愿意接受一些想法:)
答案 0 :(得分:2)
我已经删除了期望它的'Page 1'的所有权限 假设孩子的权限,但总是这样 不可见的。
您可以将Page和子页面之间的关系视为子文件夹中的文件夹。因此,如果您从文件夹中删除权限,那么即使您拥有该子文件夹的权限,您也不会看到该文件夹,因此也看不到子文件夹。
我想要的是让'Page 1'仅对拥有at的用户可见 最少访问一个子页面。
我能想到的是,您可以照常查看Page 1
上的VIEW权限,并自定义呈现页面导航的模板。在该模板中,您可以检查每个子页面的权限,即使有权限,您也可以设置标记以显示Page 1
。
唯一的缺点是,如果用户直接输入Page 1
的网址,则可以查看Page 1
内容(如果有)。我们也可以阻止它,但我认为使用Service-pre动作或Filter-hook会变得有点乏味。
希望这能让您对这种方法有所了解。
答案 1 :(得分:0)
我找到了一个解决方案但它只有在根页面(在我的例子中是第1页和第2页)没有任何内容并且它们只有一个子页面agregator时才有效。这是代码:
<ul id="mainTopMenu">
## First Level Generation
#set($layoutLocalServiceUtil = $serviceLocator.findService("com.liferay.portal.service.LayoutLocalService"))
#foreach ($nav_item in $nav_items)
#if ($nav_item.hasChildren())
<li>
<a> $nav_item.getName()</a>
<ul>
## Second Level Generation
#foreach ($nav_child in $nav_item.getChildren())
<li>
<a href="$nav_child.getURL()">
$nav_child.getName()
</a>
</li>
#end
</ul>
</li>
#else
#set($lay = $layoutLocalServiceUtil.getLayout($nav_item.getLayout().getAncestorPlid()))
#if (!$lay.hasChildren())
<li>
<a href="$nav_item.getURL()">
$nav_item.getName()
</a>
</li>
#end
#end
#end
</ul>
为了完成这项工作,我们还需要将Page 1权限设置为“对所有已登录用户可见”&#39;并为子页面提供了所需的权限。