Liferay只显示有孩子的页面

时间:2015-02-04 17:08:50

标签: java permissions liferay liferay-6

我正在使用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

这解决了我的整个问题。关于这段代码的唯一问题是我需要指定没有孩子的页面的名称,这不是一个好的原则,因为我每次添加/删除/编辑一个页面时都需要编辑这段代码。

我正在努力寻找更好的解决方案,我愿意接受一些想法:)

2 个答案:

答案 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;并为子页面提供了所需的权限。