求助 版主:官方研发技术组
在hooks里如何实现生成首页静态文件
类型:迅睿CMS 更新时间:2020-09-30 21:47:30

请教一个代码实现:在hooks里如何实现生成首页静态文件。

思路:在“module_content_after”内容发布后挂钩点中执行生成首页静态代码。

问题:以下代码从“dayrui/Core/Controllers/Home.php”代码中复制过来的,虽然成功生成了index.html文件,但是里边的内容不对,检查了下发现主要是

\Phpcmf\Service::V()->display('index.html');方法并没有渲染出index模板内容,而是渲染了“/dayrui/Core/Views/share_list.html"的内容。

请问各路大神,应该如何修改才能实现内容发布后生成首页静态,谢谢。


附思路实现代码:

\Phpcmf\Hooks::on('module_content_after', function($data, $old) {
    // 内容发布或者修改之后
    
    ob_start();
    \Phpcmf\Service::V()->assign([
        'indexc' => 1,
        'fix_html_now_url' => defined('IS_MOBILE') && IS_MOBILE ? SITE_MURL : SITE_URL,
    ]);
    \Phpcmf\Service::V()->assign(\Phpcmf\Service::L('Seo')->index());
    \Phpcmf\Service::V()->display('index.html');
    $html = ob_get_clean();

    // 开启过首页静态时
    if (SITE_INDEX_HTML) {
        if (defined('IS_MOBILE') && IS_MOBILE) {
            // 移动端,当移动端独立域名情况下才生成静态
            if (SITE_MURL != SITE_URL) {
                file_put_contents(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', 'mobile/index.html'), $html);
            }
        } else {
            // pc
            file_put_contents(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', 'index.html'), $html);
        }
    }

});


回帖
  • 靠悬赏赚钱买授权
    #1楼    靠悬赏赚钱买授权
    2020-09-03 20:31:49
    Chrome 0
    \Phpcmf\Hooks::on('module_content_after', function($data, $old) {
        // 内容发布或者修改之后
        
        dr_catcher_data(SITE_URL'index.php', 10);
    
    });
  • 周大侠
    #2楼    周大侠
    2020-09-03 20:37:09
    Chrome 0
    楼主的代码完全错误的,一楼的代码理论上应该是对的
  • rewalax
    #3楼    rewalax
    2020-09-03 22:06:57
    Chrome 0
    靠悬赏(设置悬赏)赚钱买授权
    \Phpcmf\Hooks::on('module_content_after', function($data, $old) {
        // 内容发布或者修改之后
       
        $html = dr_catcher_data(SITE_URL.'index.php',30);
        
        // 开启过首页静态时
        if (SITE_INDEX_HTML) {
            if (defined('IS_MOBILE') && IS_MOBILE) {
                // 移动端,当移动端独立域名情况下才生成静态
                if (SITE_MURL != SITE_URL) {
                    file_put_contents(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', 'mobile/index.html'), $html);
                }
            } else {
                // pc
                file_put_contents(\Phpcmf\Service::L('html')->get_webpath(SITE_ID, 'site', 'index.html'), $html);
            }
        }
    
    });
    并没有成功生成首页,生成一个0kb的index.html,请大侠明示。
  • 靠悬赏赚钱买授权
    #4楼    靠悬赏赚钱买授权
    2020-09-03 22:11:11
    Chrome 0
    哥,你代码太多了,改成我一楼梯写的代码啊,你为什么加一些无用的代码啊,你这样肯定是0kb啊
  • rewalax
    #5楼    rewalax
    2020-09-03 22:20:52
    Chrome 0
    靠悬赏(设置悬赏)赚钱买授权 还是不行啊,好像明白你意思了,相当于直接用这个函数访问一下首页,然后就会自动生成这个文件了,但实际并没有生成,你可以测试一下。另外你这个思路虽然可以解决需求,但相当于多了一次网络请求,不如官方的那种直接读取模板文件然后生成index.html内容效率高呀。还是非常感谢你的回复。
  • 百鬼夜行
    #6楼    百鬼夜行
    2020-09-03 22:23:19
    Chrome 0
    \Phpcmf\Hooks::on('module_content_after', function($data, $old) {
        // 内容发布或者修改之后
        
        dr_catcher_data(SITE_URL'index.php', 10); // pc
    
        dr_catcher_data(SITE_MURL'index.php', 20); // yd
    });
    pc和移动都有了,两句话就搞定,不用那么多,多了反而无用
  • rewalax
    #7楼    rewalax
    2020-09-04 06:53:57
    Chrome 0
    百鬼夜行 感谢回复,测试并不能成功生成。
  • 官方研发实习技术
    #8楼    官方研发实习技术
    2020-09-04 08:23:04
    Chrome 0
    你要在hook里面二次开发,就不能使用控制器里面的代码,只能用一楼的代码,是最完美的了
  • rewalax
    #9楼    rewalax
    2020-09-04 08:26:59
    Chrome 0
    官方研发实习技术 谢谢官方技术,但是为什么实际使用中没有生成静态文件呢,直接访问首页是可以生成的。
  • 易学习
    #10楼    易学习
    2020-09-04 08:31:40
    Chrome 0
    \Phpcmf\Hooks::on('module_content_after', function($data, $old) {
        // 内容发布或者修改之后
        
        file_get_contents(SITE_URL'index.php');
    
    });
    这样写
    满意答案
  • rewalax
    #11楼    rewalax
    2020-09-04 08:36:40
    Chrome 0
    易学习 成功执行!有点奇怪官方dr_catcher_data函数是file_get_contents函数的加强版,不知道那个函数为什么没有成功生成静态首页
  • 易学习
    #12楼    易学习
    2020-09-04 08:38:54
    Chrome 0
    可能一楼的兄弟加了10参数吧,我习惯用php自带的函数,原理跟一楼一样
  • rewalax
    #13楼    rewalax
    2020-09-04 08:46:54
    Chrome 0
    易学习 去掉10参数也不行,找到官方dr_catcher_data的定义了,可能是官方用了curl。但是我的服务器也是支持curl的。可能是题外话了,但是强迫症还是想研究清楚,请大家不吝赐教。
    /**
     * 调用远程数据
     *
     * @param   string  $url
     * @param   intval  $timeout 超时时间,0不超时
     * @return  string
     */
    function dr_catcher_data($url, $timeout = 0) {
    
        // 获取本地文件
        if (strpos($url, 'file://')  === 0) {
            return file_get_contents($url);
        }
    
        // curl模式
        if (function_exists('curl_init')) {
            $ch = curl_init($url);
            if (substr($url, 0, 8) == "https://") {
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
            }
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            // 最大执行时间
            $timeout && curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
            $data = curl_exec($ch);
            $code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
            if (CI_DEBUG && curl_errno($ch)) {
                log_message('error', '获取远程数据失败['.$url.']:'.curl_error($ch));
            }
            curl_close($ch);
            if ($code == 200) {
                return $data;
            } else {
                return '';
            }
        }
    
        //设置超时参数
        if ($timeout && function_exists('stream_context_create')) {
            // 解析协议
            $opt = [
                'http' => [
                    'method'  => 'GET',
                    'timeout' => $timeout,
                ],
                'https' => [
                    'method'  => 'GET',
                    'timeout' => $timeout,
                ]
            ];
            $ptl = substr($url, 0, 8) == "https://" ? 'https' : 'http';
            $data = @file_get_contents($url, 0, stream_context_create([
                $ptl => $opt[$ptl]
            ]));
        } else {
            $data = @file_get_contents($url);
        }
    
        return $data;
    }
  • 易学习
    #14楼    易学习
    2020-09-04 08:57:13
    Chrome 0
    我不太懂程序,只是我经验比较多而已,能实现就行,我从来不去研究为什么
  • 帝云网络
    #15楼    帝云网络
    2020-09-04 09:35:59
    Chrome 0
    新版程序已支持自动生成首页了
  • perweb
    #16楼    perweb
    2020-09-30 14:33:09
    Chrome 0
    最新版,首页自动生成静态,不起作用,是怎么回事?
  • rewalax
    #17楼    rewalax
    2020-09-30 21:47:30
    Chrome 0
    @易学习:感谢回复