生成菜单链接时传递一些数组的函数

时间:2019-02-03 19:06:58

标签: php

我正在尝试为菜单生成链接

我有一个带有引用的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\略过工具,最后,我看了10次youtube指南并下载了源,但似乎没有任何解决方法

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"
}

1 个答案:

答案 0 :(得分:0)

(如评论中所述)

有两个单独的问题:

  • 在youtube视频的示例中,开发人员使用全局DS将数组项分为控制器和操作,但这仅适用于Linux / unix主机,其中目录分隔符/与json网站说明中使用的相同。拆分必须使用普通的'/'(如user741在youtube上的评论中指出的那样)
  • 仅向登录用户授予对tools选项的访问权限,因此未列出。

这样的事情一直在我身上发生,这就是为什么如此多的人喜欢进行结对编程的原因-一个人将自己的思想固定在一种方法上的可能性比两个人同时固定在一个相同的问题上的可能性大; -)