补充说明
有同学提示我教程里的代码被解析了,还有反斜杠不灵光,稍后我会补充下载地址。以免产生不必要的歧义。
准备工作
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 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); } }
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。