补充说明
有同学提示我教程里的代码被解析了,还有反斜杠不灵光,稍后我会补充下载地址。以免产生不必要的歧义。
准备工作
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);
}
}