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