如何用Thinkphp5实现批量生成静态网页

问题描述

实现一个类似wiki的东西,现在可以解决的是实现PHP遍历了文件夹以文件并能在前台显示,但是我现在想解决的是怎么协调好让每个文件对应着相应的静态网页,应该怎么批量实现。

问题出现的环境背景及自己尝试过哪些方法

用过白痴的办法,手动添加网页,然后被骂了,当然我也知道这个方法不对。Thinkphp3版本有个函数可以,但是5把它给取消了。

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
控制器部分:
public function frame_wiki_index()//展示目录

{
    /**@var callable $getDir */
    $getDir = function ($path) use (&$getDir) {
        $lists = [];
        //判断目录是否为空
        if (!file_exists($path)) {
            return $lists;
        }

        $files = scandir($path);
        foreach ($files as $v) {
            /**@var string $v */
            $newPath = $path . DIRECTORY_SEPARATOR . $v;
            if (is_dir($newPath) && $v != '.' && $v != '..') {
                $lists[] = [
                    "title" => $v,
                    "lists" => $getDir($newPath)
                ];
            } else if (is_file($newPath)) {
                $lists[] = [
                    "title" => $v,
                    "lists" => []
                ];
            }
        }

        return $lists;
    };

    $path = realpath(__DIR__ . '/../view\Book\test');
    $list = $getDir($path);
    dump($list);

    $num = count($list);
    //拼接路径
    while ($num--) {
        $apath_route = $list[$num]["title"];
        $bpath_route = $list[$num]["lists"][0]["title"];
        $cpath_route = $list[$num]["lists"][0]["lists"][0]["title"];
        $str_s = $path . '/' . $apath_route . '/' . $bpath_route . '/' . $cpath_route;
        echo $str_s;
        echo "<br>";

        $file_path = $str_s;

        //读取文件
        if (file_exists($file_path)) {
            $fp = fopen($file_path, "r");
            echo "this is here";
            $str = "";
            $buffer = 1024; //每次读取 1024 字节
            while (!feof($fp)) { //循环读取,直至读取完整个文件
                $str .= fread($fp, $buffer);
            }
            $str = str_replace("\r\n", "<br />", $str);//文件内容
        }
    }
    $this->assign('test', $list);
    return $this->fetch();

}

前端部分
<html>
<body>

{volist name = "test" id="vo"}
<h2>
    <a href="index_one.html?id={$i}" target="abc">章节{$vo.title}.{$i}</a></h2>
{volist name = "vo[ 'lists'] " id="voo "}
<h3><a href="index_one_1.html?di={$i}" target="abc">一级菜单{$voo.title}</a></h3>
{volist name = "voo[ 'lists'] " id="vooo "}
<ul>
    <li><a href="index_one_2.html?id={$i}" target="abc">二级菜单{$vooo.title}</a></li>
</ul>
{/volist} {/volist} {/volist}

</body>
</html>

你期待的结果是什么?实际看到的错误信息又是什么?

想实现静态网页的功能
图片描述
就是点击左侧的目录,然后右侧的内容刷新。

阅读 3.5k
2 个回答
$getTitle = function ($list, $path, $fpath = '') use (&$getTitle) {
            foreach ($list as $v) {
                if (isset($v['lists'])) {
                    $str_s = $path . '/' . $fpath . $v['title'];
                    echo $str_s;
                    echo "<br>";
                    $file_path = $str_s;

                    //读取文件
                    if (is_file($file_path)) {
                        $fp = fopen($file_path, "r");
                        echo "this is here";
                        $str = "";
                        $buffer = 1024; //每次读取 1024 字节
                        while (!feof($fp)) { //循环读取,直至读取完整个文件
                            $str .= fread($fp, $buffer);
                        }
                        $str = str_replace("\r\n", "<br />", $str);//文件内容
                        dump($str);
                    }
                    $getTitle($v['lists'], $path, $fpath . $v['title'] . '/');
                }
            }
        };
        $getTitle($list, $path);

前台用get传回,后台拼接字符串,然后再调出来就好了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏