1

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 have method has_read_permission( $node_id ) - true/false を返す

完全な再帰メニューを生成できましたが、ACL で保護されていません。

PHP はサーバーのバックエンドです。

DB テーブル構造:

node_id | parent id | node_content

どうも

PS

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>';
        }
}
4

1 に答える 1

0

テーブルとテーブルm-to-nの間にリレーションシップを作成し、ピボット テーブルでアクセス許可を保持することで、自分で行うことができます。usersnodes

ユーザー_ノード

  • ユーザーID
  • node_id
  • 読める
于 2012-07-03T09:38:47.453 に答える