【问题标题】:Codeigniter recursive directory map menu file path issueCodeigniter递归目录映射菜单文件路径问题
【发布时间】:2016-04-14 18:18:24
【问题描述】:

使用有关此主题的先前问题,我已经能够创建一个递归函数来在菜单中显示目录的内容,但是,当涉及到实际文件名时,我遇到了递归深度问题。

当目录的深度增加时,我无法弄清楚如何存储/引用父目录路径以使 href 正确。

使用下面的代码和一个示例目录结构,例如我为 href 创建的文件路径下面,它适用于顶级目录,但我需要一种方法来保留父目录路径,因为它在目录结构中更深入。 InnerSection 中的 file.html 链接例如简单生成为 file/InnerSection/file.html 而不是 files/Section2/Innersection/file.html。

任何帮助将不胜感激。

文件
  第一节
  第二节
    文件.html
    内部部分
      文件.html
function findDir($path){
        $dir=directory_map($path, 0);
        return $this->recursive($dir, $path);
    }

function recursive($arr, $path) {
    global $menu;
    global $current_path;
    foreach ($arr as $key => $val) {
        if (is_array($val)){
            $current_path =rtrim($key, '\\');
            $menu.= "<li data-role='collapsible' data-iconpos='right' data-shadow='false' data-corners='false'>";
            $menu.= "<h3>".rtrim($key, "\\")."</h3>";
            $menu.= "<ul data-role='listview' data-shadow='false' data-inset='true' data-corners='false'>";
            $this->recursive($val, $path);
            $menu.= "</ul></li>"; //finish directory listing
        } else {
            $menu.= "<li><a class='load-file' data-file='". $path."/".$current_path."/".$val . "' href='". $path . "/" . $current_path . "/" . "$val''>".$val."</a></li>"; //List file
        }
    }
    return $menu;
}

【问题讨论】:

  • 不会像stackoverflow.com/a/2207739/208809 这样简单得多吗?
  • 感谢 Gordon 的回复,老实说,对我来说这似乎更复杂(也许我对它的理解不够)但它也有一个问题,就像我遇到的许多其他问题一样在网上发现,它们在执行时会回显,而不是附加到返回的变量,这对我正在做的事情至关重要。
  • 那我不明白你的问题。为什么这是必不可少的?你想呈现一个目录列表,所以只是回显它。将字符串存储在迭代器中,并在迭代后使用一种方法来检索它。或者将其包装到输出缓冲区中。
  • 恐怕我没有足够的经验来理解你的建议。但是,我可以尝试解释为什么我认为它是必不可少的。我有一个函数,它在基本控制器中返回菜单字符串,我正在扩展所有后续控制器,每个控制器都需要显示不同目录的内容。因此,我觉得只是调用一个函数,将字符串存储在一个变量中,然后将该变量传递给视图以在页面上呈现它是处理它的最佳方法。
  • 虽然您可以这样做,但控制器的职责不是呈现 HTML。控制器可以做的是在没有附加任何特定渲染的情况下获取目录列表,例如它可以为视图设置一个 RecursiveDirectoryIterator。渲染属于视图的责任,例如在视图中,您可以使用我在该问题中显示的迭代器,将 DirectoryIterator 传递给它并将其呈现为 HTML 列表。见stackoverflow.com/questions/3563863/read-files-in-folder/…

标签: php codeigniter recursion


【解决方案1】:

很遗憾,我无法让上面发布的解决方案正常工作。

我最终选择了一个不太优雅的解决方案。我创建了一个辅助函数,我可以从视图中调用它,这样我就可以使用使用 echo 输出菜单的解决方案。

感谢 Gordon 的意见。

    function createMenu($dir) {
    if(is_dir($dir)) {
        echo "<li><a href='#'>".basename($dir)."</a><ul>";
        foreach(glob("$dir/*") as $path) {
            createMenu($path);
        }
        echo "</ul></li>";
    }
    else {
        $extension = pathinfo($dir);
        $extension = $extension['extension'];
        echo "<li><a class='load-file' data-file='$dir' href='". basename($dir, ".".$extension). "'>".basename($dir, ".".$extension)."</a></li>";
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2019-08-26
    • 2013-06-13
    • 2020-03-05
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多