PbootCms扩展控制器源码分享

稿件作者 CMS博客 2020-04-14 11:44 CMS教程

补充说明

有同学提示我教程里的代码被解析了,还有反斜杠不灵光,稍后我会补充下载地址。以免产生不必要的歧义。

准备工作

PbootCms自V2.0.6开始新增了扩展控制器功能,最大的优点是升级不被覆盖,再也不懂担心自己二开的内容被升级覆盖啦。

每个人都有自己习惯的一些代码风格、方式,以下是我个人对PbootCms的一些扩展集合,会不定期更新一些内容。

各位只需要将以下代码复制到:/apps/home/controller/ExtLabelController.php

这个路径下就好啦。

当然最好还是要做一点点修改,如下:

文件路径:/apps/home/controller/ParserController.php大约在50行的如下代码:

// 解析个人扩展标签,升级不覆盖
if (file_exists(APP_PATH . '/home/controller/ExtLabelController.php')) {
   if (class_exists('apphomecontrollerExtLabelController')) {
      $extlabel = new ExtLabelController();
      $content = $extlabel->run($content);
   }
}

移动到该方法的最下面,也就是在该方法的:

return $content;

之前,这个代码之前,最终方法如下:

    // 解析全局后置公共标签
    public function parserAfter($content)
    {
        // 默认页面信息替换
        $content = str_replace('{pboot:pagetitle}', '{pboot:sitetitle}-{pboot:sitesubtitle}', $content);
        $content = str_replace('{pboot:pagekeywords}', '{pboot:sitekeywords}', $content);
        $content = str_replace('{pboot:pagedescription}', '{pboot:sitedescription}', $content);
               
        $content = $this->parserSingleLabel($content); // 单标签解析
        $content = $this->parserSiteLabel($content); // 站点标签
        $content = $this->parserCompanyLabel($content); // 公司标签
        $content = $this->parserUserLabel($content); // 自定义标签
        $content = $this->parserNavLabel($content); // 分类列表
        $content = $this->parserSelectAllLabel($content); // CMS筛选全部标签解析
        $content = $this->parserSelectLabel($content); // CMS筛选标签解析
        $content = $this->parserSpecifySortLabel($content); // 指定分类
        $content = $this->parserListLabel($content); // 指定列表
        $content = $this->parserSpecifyContentLabel($content); // 指定内容
        $content = $this->parserContentPicsLabel($content); // 内容多图
        $content = $this->parserContentCheckboxLabel($content); // 内容多选调取
        $content = $this->parserContentTagsLabel($content); // 内容tags调取
        $content = $this->parserSlideLabel($content); // 幻灯片
        $content = $this->parserLinkLabel($content); // 友情链接
        $content = $this->parserMessageLabel($content); // 留言板
        $content = $this->parserFormLabel($content); // 自定义表单
        $content = $this->parserSubmitFormLabel($content); // 自定义表单提交
        $content = $this->parserQrcodeLabel($content); // 二维码生成
        $content = $this->parserPageLabel($content); // CMS分页标签解析(需置后)
        $content = $this->parserLoopLabel($content); // LOOP语句(需置后)
        $content = $this->parserIfLabel($content); // IF语句(需置最后)
        $content = $this->restorePreLabel($content); // 还原不需要解析的内容
        $content = $this->parserReplaceKeyword($content); // 页面关键词替换

        // 解析个人扩展标签,升级不覆盖
        if (file_exists(APP_PATH . '/home/controller/ExtLabelController.php')) {
            if (class_exists('apphomecontrollerExtLabelController')) {
                $extlabel = new ExtLabelController();
                $content = $extlabel->run($content);
            }
        }

        return $content;
    }

为什么要这么做?因为实际开发过程中,会需要对后台输出的字段进行二次处理,那么如果扩展控制器放在前面处理,就会发生无法获取后台字段的情况。

那么我们只要将扩展控制器放到最后来执行,就可以啦。


最终版本

以下代码不定期更新,欢迎常来看看。

<?php
/**
 * @author 9029855@qq.com
 */
namespace app\home\controller;

use core\basic\Controller;
use core\basic\Url;
use app\home\model\ParserModel;

class ExtLabelController extends Controller
{

    protected $content;

    protected $model;

    public function __construct()
    {
        $this->model = new ParserModel();
    }

    /* 必备启动函数 */
    public function run($content)
    {
        // 接收数据
        $this->content = $content;
        
        // 执行个人自定义标签函数
        $this->diylabel();

        //快速标签
        $this->fastUrl();

        //智能模板路径、自动更新CSS,JS版本号,不用再让客户强制刷新啦
        $this->smartURL();
        
        //广告词违禁词替换
        $this->disablewords();

        // 返回数据
        return $this->content;
    }

    // 扩展单个标签
    private function diylabel()
    {
        //{ pboot:walle } 每日一图的图片URL //这里自己去掉空格哦。
        $this->content = str_replace('{ pboot:walle }', $this->getBingImage(), $this->content);
    }

    //抓取必应每日一图
    private function getBingImage(){
        $url = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1';
        $data = json_decode(get_url($url));
        $result = $data->images[0];
        $image = 'https://www.bing.com'.$result->url;
        return $image;
    }
    
    //解析快速URL{ @about.1 }{ @list.2 }{ @content.3 } 为啥要用@,因为$用不了了,咱们就用@召唤神兽吧
    private function fastUrl(){
        $url_break_char = $this->config('url_break_char') ?: '_';
        $url_rule_suffix = $this->config('url_rule_suffix') ?: '.html';
        $url_rule_sort_suffix = $this->config('url_rule_sort_suffix') ? $url_rule_suffix : '/';

        $pattern = '/{@(about|list|content).([a-z0-9_]+)}/';
        if (preg_match($pattern, $this->content, $matches)) {
            $this->content = preg_replace_callback(
                $pattern, 
                function($matches) use ( $url_break_char, $url_rule_suffix, $url_rule_sort_suffix ){
                    switch ($matches[1]){
                        case 'about';
                            $data = $this->model->getAbout($matches[2]);
                            $data->urlname = $data->urlname ?: 'about';
                            if ($data->sortfilename) {
                                 $link = Url::home($data->sortfilename, $url_rule_sort_suffix);
                            } else {
                                 $link = Url::home($data->urlname . $url_break_char . $data->scode, $url_rule_sort_suffix);
                            }
                            return $link;
                            break;
                        case 'list';
                            $data = $this->model->getSort($matches[2]);
                            $data->urlname = $data->urlname ?: 'list';
                            if ($data->filename) {
                                $link = Url::home($data->filename, $url_rule_sort_suffix);
                            } else {
                                $link = Url::home($data->urlname . $url_break_char . $data->scode, $url_rule_sort_suffix);
                            }
                            return $link;
                            break;
                        case 'content';
                            $data = $this->model->getContent($matches[2]);
                            $data->urlname = $data->urlname ?: 'list';
                            if ($data->sortfilename && $data->filename) {
                                $link = Url::home($data->sortfilename . '/' . $data->filename, true);
                            } elseif ($data->sortfilename) {
                                $link = Url::home($data->sortfilename . '/' . $data->id, true);
                            } elseif ($data->filename) {
                                $link = Url::home($data->urlname . $url_break_char . $data->scode . '/' . $data->filename, true);
                            } else {
                                $link = Url::home($data->urlname . $url_break_char . $data->scode . '/' . $data->id, true);
                            }
                            return $link;
                            break;
                    }
                },
                $this->content);
        }
    }

    //智能路径
    private function smartURL(){
        $pattern = '/<(.*?)(src=|href=|value=|background=)["|'](images/|img/|css/|js/|style/)(.*?)["|'](.*?)>/';
        if (preg_match($pattern, $this->content, $matches)) {
            $this->content = preg_replace_callback(
                $pattern, 
                function($matches){
                    if( strstr($matches[4], '.js') || strstr($matches[4],'.css') ){
                        return '<'.$matches[1].$matches[2].'"'.$this->auto_version(APP_THEME_DIR.'/'.$matches[3].$matches[4]).'"'. $matches[5] .'>';
                    }else{
                        return '<'.$matches[1].$matches[2].'"'.APP_THEME_DIR.'/'.$matches[3].$matches[4].'"'. $matches[5] .'>';
                    }
                }, 
                $this->content);
        }
    }

    //禁用词
    private function disablewords(){
        $words = \core\basic\Db::table('ay_label')->field('value')->where("name='disablewords'")->find();
        if(!!$words){
            $textlist = explode('<br>', $words->value);
            foreach ($textlist as $k => $v) {
                $jg = strpos($v, ",") ? "," : ',';
                $ciar = explode($jg, $v);
                $this->content = str_replace($ciar[0], (isset($ciar[1]) ? $ciar[1] : ''), $this->content);
            }
        }
     }
    
    //自动更新时间版本号
    public function auto_version($url){
        $ver = filemtime(DOC_PATH . $url);
        return $url.'?v='.date("YmdHis",$ver);
    }


}


ExtLabelController.zip

  • 分享:

文章评论(审核通过可见)

说点什么
共有2条评论

Marc

  • 2020-04-22 13:49:29
  • Windows 7
感谢分享,很实用

小超仔

  • 2020-04-17 16:22:22
  • Windows 10
这个扩展真的很方便。感谢分享。