功能通过某些阵列生成用于菜单链接时

问题描述 投票:0回答:1

我想产生一个菜单中的链接

我与引用一个JSON文件,我试图生成菜单

我使用这个函数调用dnd进行调试

function dnd($data) //debug function
{
 echo '<pre>';
 var_dump($data);
 echo '</pre>';
  die();}

我有这样的功能:

  public static function getMenu($menu)
  {
  $menuAry  = [];
  $menuFile = file_get_contents(ROOT . DS . 'app' . DS . $menu . '.json');
  $acl = json_decode($menuFile, true);
  foreach($acl as $key => $val)
  {
    if(is_array($val)) {
      $sub = [];
      foreach($val as $k => $v) {
        if($k == 'separator' && !empty($sub)) {
          $sub[$k] = '';
          continue;
        }else if($finalVal = self::get_link($v)) {
          $sub[$k] = $finalVal;
        }
      }
      if(!empty($sub))
      {
        $menuAry[$key] = $sub;
      }
    }
    else
    {
      if($finalVal = self::get_link($val))
      {
        $menuAry[$key] = $finalVal;
      }
    }
  }
  return $menuAry;
}

而get_link函数看起来像:

private static function get_link($val) {
  //check if external link
  if(preg_match('/https?:\/\//', $val) == 1) {
    return $val;
  } else {
    $uAry = explode(DS, $val);
    $controller_name = ucwords($uAry[0]);
    $action_name = (isset($uAry[1]))? $uAry[1] : '';
    if(Self::hasAccess($controller_name, $action_name)) {
      return PROOT . $val;
    }
    return false;
  }
}

如果我想要在foreach之前dnd ACL中,我得到这个:

 array(6) {
  ["Home"]=>
  string(4) "home"
  ["Tools"]=>
  array(5) {
    ["My Tools"]=>
    string(5) "tools"
    ["Tool 1"]=>
    string(11) "tools/first"
    ["Tool 2"]=>
    string(12) "tools/action"
    ["separator"]=>
    string(0) ""
    ["Tool 3"]=>
    string(11) "tools/third"
  }
  ["Google"]=>
  string(23) "https://www.google.com/"
  ["PHP Docs"]=>
  string(25) "https://php.net/manual/en"
  ["Login"]=>
  string(14) "register/login"
  ["Logout"]=>
  string(15) "register/logout"
}

而且我不知道为什么它会跳过工具的一部分,因为我得到这个结尾,因为它应该在开始添加/framework/作为ROOT\framework\,它跳过工具,最后,我已经看过了YouTube导览10时间和下载的源,但似乎没有任何解决它

array(3) {
  ["Home"]=>
  string(15) "/framework/home"
  ["Google"]=>
  string(23) "https://www.google.com/"
  ["PHP Docs"]=>
  string(25) "https://php.net/manual/en"
}

acl.json

{
  "Guest" : {
    "denied" : {},
    "Home" : ["*"],
    "Register" : ["login", "register"],
    "Restricted" : ["*"]
  },
  "LoggedIn" : {
    "denied" : {
      "Register" : ["login", "register"]
    },
    "Register" : ["logout"],
    "Tools" : ["*"]
  }
}

menu_acl.json

{
"Home" : "home",
"Tools":
  {
    "My Tools" :"tools",
    "Tool 1" :"tools/first",
    "Tool 2" :"tools/action",
    "separator" :"",
    "Tool 3" :"tools/third"
  },
  "Google" :"https://www.google.com/",
  "PHP Docs" :"https://php.net/manual/en",
  "Login" :"register/login",
  "Logout" :"register/logout"
}
php
1个回答
0
投票

(如在评论讨论)

有两个不同的问题:

  • 从YouTube视频的例子中,开发使用全局DS分裂的数组项到控制器和行动,但在Linux / UNIX主机,其中目录分隔符/相同的JSON网站所使用的这只作品描述。分裂已经由一个普通'/'来完成(如user741在YouTube上他的评论中指出)
  • 为登录用户访问tools选项仅授予,因此它没有列出。

这样的事情发生在我身上所有的时间,这就是为什么那么多人喜欢做结对编程 - 更可能的一个人注视他的思想比两个人都一个办法注视同一个;-)

© www.soinside.com 2019 - 2024. All rights reserved.