【问题标题】:Recursive HTML ACL protected menu?递归 HTML ACL 保护菜单?
【发布时间】:2012-07-03 09:27:33
【问题描述】:

有没有关于如何创建受 ACL 保护的递归菜单的示例?

想法是打印遍历路径到具有读取权限的最终文档,即使用户没有对父节点的读取权限。

以下是 HTML 代码示例:

<ul>
    <li><a href="some_url">I have read access here</a>
        <ul>
            <li>I don't have read access here - only print node name (traversal)
                <ul>
                    <li><a href="some_url">I have read access here</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

Acl 有方法 has_read_permission( $node_id ) - 返回真/假

我已经设法生成完整的递归菜单,但不受 acl 保护。

PHP 是服务器后端。

数据库表结构:

node_id | parent id | node_content

谢谢

附言

我用来生成非acl保护的递归菜单的PHP代码(codeigniter框架采用):

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Menu extends MY_Controller {

    public static $menu = array();

    function index(){

        $permited_objects=$this->session->userdata('permited_objects');
        $session_email=$this->session->userdata('email');

        self::$menu[] = "<ul id=\"treemenu2\" class=\"treeview\">";

        $this -> _display_children(0, 0, $permited_objects);

        self::$menu[] = "</ul>";
        $menu_imploded = implode("", self::$menu);

        $menu_db = str_replace("<ul></ul>", " ", $menu_imploded);

        //write in db or return

        return $menu_db;

    }


    function _display_children($parent, $level) {

        $sql = "SELECT `title`, `doc_uid` 
                FROM `documents` 
                WHERE `parent_uid` = '" . $parent . "' 
                order by `title` 
                ASC";

        try {
            $this -> db -> trans_start();
            $query = $this -> db -> query($sql);
            $this -> db -> trans_complete();
        } catch (Exception $e) {
            $this -> _log_message('error', 'Model global\Generate_main_menu->execute() => ERROR=' . $e);
        }

        if ($level > 0)
            self::$menu[] = "<ul>";


        foreach ($query->result() as $row) {
                    self::$menu[] = '<li>';
                    self::$menu[] = '<a onclick="javascript: dms_display_document(\'' . $this->ec_crypt-> encode($row -> doc_uid) . '\');" href="#" >';
                    self::$menu[] = $row -> title;
                    self::$menu[] = '</a>';

                $this -> _display_children($row -> doc_uid, $level + 1);
            }

            if ($level > 0) {
                self::$menu[]='</ul>';
            }

            self::$menu[]='</li>';
        }
}

【问题讨论】:

  • 向我们展示您的代码以创建递归菜单

标签: php html acl


【解决方案1】:

您可以通过在users 表和nodes 表之间创建m-to-n 关系并在数据透视表中保留权限来自己完成:

users_nodes

  • user_id
  • node_id
  • can_read

【讨论】:

  • 我不确定你是否理解。正如我所说,如果用户具有对节点的读取访问权限,我有 acl 方法返回真/假,那么你建议的解决方案的目的是什么?谢谢
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2013-11-05
  • 2013-06-13
  • 2015-04-07
相关资源
最近更新 更多