当前位置: 首页 > news >正文

PHPCMS v9城市分站插件

PHPCMS自带的有多站点功能,但是用过的朋友都知道,自带的多站点功能有很多的不方便之处,例如站点栏目没法公用,每个站点都需要创建模型、每个站点都需要单独添加内容,还有站点必须静态化。如果你内容很多这些功能当然无可厚非,但是实际情况我们网站内容不会这么多的,所以决定开发一款简单使用的PHPCMS城市分站插件。

演示站点:全国分站列表 - 郑州腾石网络科技有限公司--专注于网站建设、网站推广

phpcms城市分站插件的优势:
1、后台一键导入全国城市,无需一个一个的手动添加
2、每个分站都支持动态、静态、伪静态,还支持绑定二级域名,并仍然支持动态静态伪静态。 
3、可以任意定义每个分站的标题、关键词、描述、版权以及支持自定义url。如果不填,则默认调用分站通用设置
4、每个分站都支持自定义模板风格
5、前端调用方便,在不修改phpcms官方默认调用的前提下,尽量减少对模板调用的修改,仅修改分站首页、面包屑、分页以及每个循环前处理一下内容链接等
6、设置为静态的分站,可点击“一键生成”,自动帮你生成分站全站

分站列表截图:
 



 



后台截图:
 


 


 


 



安装使用教程:

一、后台操作
1、上传源码到对于目录,然后后台---模块----模块管理----找到分站插件,点击安装插件
2、安装之后打开“分站管理”---首先进行“分站设置”,设置通用标题,关键词描述和底部版权,以及设置自定义url。
3、导入城市,打开分站列表---导入城市,可根据自己需要导入对应级别即可,如果城市不多可以自己手动添加;
4、对每个分站站点单独设置每个分站域名、关键词,是否静态化、以及设置自定义url。

注意:
1、多次点击导入城市,会自动安装分站设置重新更新所有分站
2、对分站操作之后,记得点击“更新分站缓存”

二、前端调用
1、安装之后会自动在模板风格中创建文件夹fenzhan(如果创建到了default中,可以手动转移到你自己的风格中)
2、可以把你的content里边用到的模板复制一份到fenzhan文件夹中,模板修改
(1)、fenzhanlist.html为分站列表页
首页访问路径:{APP_PATH}index.php?m=fenzhan&c=index&a=index或者{fzsiteurl(0)}。当然你也可以自己写,调用代码是:(注:分站主键是$sid)

  1. {pc:fenzhan action="sitelists" num="1000" parentid="0" order="listorder DESC"} 
  2. {loop $data $r} 
  3.  <span><a href="{$r['url']}">{$r['name']}</a></span> 
  4. {/pc} 


(2)、fenzhan中所有的模板的头部调用分站的头部{template "fenzhan","header"},底部头部{template "fenzhan","footer"},同理其他页面也调用分站页面。(调用content模板不会自动帮你处理链接的)
(3)凡是调用栏目或者调用列表的地方在{loop $data $r} 之前加入代码:
如果是对栏目的调用则加:{php $data = checkUrl($data,$sid,1)}(其中1表示是处理栏目)
如果是对列表的调用则加:{php $data = checkUrl($data,$sid)}

  1. {pc:content action="lists" catid="13" num="1" thumb="1" siteid="$siteid" order="listorder DESC"} 
  2. {php $data = checkUrl($data,$sid)} 
  3. {loop $data $r} 

(4)需要分页的地方,需要加入参数 sid="$sid",同时分页代码改成:{$fzpages},例:

  1. {pc:content action="lists" catid="$catid" num="12" order="listorder desc,id DESC" page="$page" sid="$sid"} 
  2. {php $data = checkUrl($data,$sid);} 
  3. {loop $data $r} 
  4.          ...... 
  5. {/loop} 
  6. {/pc} 
  7. <div id="pages">{$fzpages}</div> 


(5)分站模板常用调用:

  1. {fzsiteurl($sid)}//分站首页($sid=0的时候标识分站列表) 
  2. {fzcatpos($catid,$sid)};//面包屑导航 
  3. {$copyright};//分站底部导航 
  4. {$city};//城市名称 
  5. {$dirname}//城市路径 
  6. {$SEO['site_name]}//SEO调用和默认用法一样,自动转换城市关键词 

(6)打开phpcms\libs\classes\template_cache.class.php找到代码(120行左右)

  1. $arr = array('action','num','cache','page', 'pagesize', 'urlrule', 'return', 'start'); 

里边加参数sid,改成:

  1. $arr = array('action','num','cache','page', 'pagesize', 'urlrule', 'return', 'start','sid'); 

然后找到代码:

  1. $str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);'; 

在后边新增代码:

  1. if(isset($sid)){ 
  2.      $str .='$sid = intval('.$sid.');'; 
  3.      $str .= '$fzpages = fzpages($'.$op.'_total, $page, $pagesize, $urlrule,"",$sid);'; 

(7)在phpcms\libs\functions\global.func.php添加对分站分页的处理函数

  1. /** 
  2.  * 分站分页函数 
  3.  * 
  4.  * @param $num 信息总数 
  5.  * @param $curr_page 当前分页 
  6.  * @param $perpage 每页显示数 
  7.  * @param $urlrule URL规则 
  8.  * @param $array 需要传递的数组,用于增加额外的方法 
  9.  * @return 分页 
  10.  */ 
  11. function fzpages($num, $curr_page, $perpage = 20, $urlrule = '', $array = array(),$sid=0,$setpages = 10) { 
  12.     if(!$sid) return pages($num, $curr_page, $perpage, $urlrule, $array,$setpages); 
  13.     $fenzhan = getcache('fenzhan_sid_'.$sid, 'fenzhan'); 
  14.     if(defined('URLRULE') && $urlrule == '') { 
  15.         $urlrule = URLRULE; 
  16.         $array = $GLOBALS['URL_ARRAY']; 
  17.     } elseif($urlrule == '') { 
  18.         $urlrule = url_par('page={$page}'); 
  19.     } 
  20.     $multipage = ''; 
  21.     if($num > $perpage) { 
  22.         $page = $setpages+1; 
  23.         $offset = ceil($setpages/2-1); 
  24.         $pages = ceil($num / $perpage); 
  25.         if (defined('IN_ADMIN') && !defined('PAGES')) define('PAGES', $pages); 
  26.         $from = $curr_page - $offset; 
  27.         $to = $curr_page + $offset; 
  28.         $more = 0; 
  29.         if($page >= $pages) { 
  30.             $from = 2; 
  31.             $to = $pages-1; 
  32.         } else { 
  33.             if($from <= 1) { 
  34.                 $to = $page-1; 
  35.                 $from = 2; 
  36.             }  elseif($to >= $pages) { 
  37.                 $from = $pages-($page-2); 
  38.                 $to = $pages-1; 
  39.             } 
  40.             $more = 1; 
  41.         } 
  42.          
  43.         $multipage .= '<a class="a1">'.$num.L('page_item').'</a>'; 
  44.         if($curr_page>0) { 
  45.             $multipage .= ' <a href="'.fzpageurl($urlrule, $curr_page-1, $array,$sid).'" class="a1">'.L('previous').'</a>'; 
  46.             if($curr_page==1) { 
  47.                 $multipage .= ' <span>1</span>'; 
  48.             } elseif($curr_page>6 && $more) { 
  49.                 $multipage .= ' <a href="'.fzpageurl($urlrule, 1, $array,$sid).'">1</a>..'; 
  50.             } else { 
  51.                 $multipage .= ' <a href="'.fzpageurl($urlrule, 1, $array,$sid).'">1</a>'; 
  52.             } 
  53.         } 
  54.         for($i = $from; $i <= $to; $i++) { 
  55.             if($i != $curr_page) { 
  56.                 $multipage .= ' <a href="'.fzpageurl($urlrule, $i, $array,$sid).'">'.$i.'</a>'; 
  57.             } else { 
  58.                 $multipage .= ' <span>'.$i.'</span>'; 
  59.             } 
  60.         } 
  61.         if($curr_page<$pages) { 
  62.             if($curr_page<$pages-5 && $more) { 
  63.                 $multipage .= ' ..<a href="'.fzpageurl($urlrule, $pages, $array,$sid).'">'.$pages.'</a> <a href="'.fzpageurl($urlrule, $curr_page+1, $array,$sid).'" class="a1">'.L('next').'</a>'; 
  64.             } else { 
  65.                 $multipage .= ' <a href="'.fzpageurl($urlrule, $pages, $array,$sid).'">'.$pages.'</a> <a href="'.fzpageurl($urlrule, $curr_page+1, $array,$sid).'" class="a1">'.L('next').'</a>'; 
  66.             } 
  67.         } elseif($curr_page==$pages) { 
  68.             $multipage .= ' <span>'.$pages.'</span> <a href="'.pageurl($urlrule, $curr_page, $array,$sid).'" class="a1">'.L('next').'</a>'; 
  69.         } else { 
  70.             $multipage .= ' <a href="'.fzpageurl($urlrule, $pages, $array,$sid).'">'.$pages.'</a> <a href="'.fzpageurl($urlrule, $curr_page+1, $array,$sid).'" class="a1">'.L('next').'</a>'; 
  71.         } 
  72.     } 
  73.     return $multipage; 
  74. /** 
  75.  * 返回分页路径 
  76.  * 
  77.  * @param $urlrule 分页规则 
  78.  * @param $page 当前页 
  79.  * @param $array 需要传递的数组,用于增加额外的方法 
  80.  * @return 完整的URL路径 
  81.  */ 
  82. function fzpageurl($urlrule, $page, $array = array(),$sid=0) { 
  83.     if(strpos($urlrule, '~')) { 
  84.         $urlrules = explode('~', $urlrule); 
  85.         $urlrule = $page < 2 ? $urlrules[0] : $urlrules[1]; 
  86.     } 
  87.     $city = ''; 
  88.     $domain = ''; 
  89.     if($sid){ 
  90.         $fenzhan = getcache('fenzhan_sid_'.$sid,'fenzhan'); 
  91.         $city = $fenzhan['dirname']; 
  92.         $domain = trim($fenzhan['domain']); 
  93.     } 
  94.     $findme = array('{$page}','{$city}'); 
  95.     $replaceme = array($page,$city); 
  96.     if (is_array($array)) foreach ($array as $k=>$v) { 
  97.         $findme[] = '{$'.$k.'}'; 
  98.         $replaceme[] = $v; 
  99.     } 
  100.     $url = str_replace($findme, $replaceme, $urlrule); 
  101.     $url = str_replace(array('http://','https://','//','~'), array('~','~','/',SITE_PROTOCOL), $url); 
  102.     if(substr($url,0,4) != 'http'){ 
  103.         if($domain){ 
  104.             $url = $domain.ltrim($url,'/'); 
  105.         }else{ 
  106.             $url = APP_PATH.ltrim($url,'/'); 
  107.         } 
  108.     }else{ 
  109.         if($domain){ 
  110.             $url = str_replace(APP_PATH,$domain,$url); 
  111.         } 
  112.     } 
  113.     return $url; 


3、进入分站列表页,可以点击进入任意分站查看效果

注意:
1、如果主站的图片路径不带域名,那么可能出现绑定域名的分站图片打不开,此时需要给主站图片加上路径
2、设置为静态的分站 点击生成之后是一次性给你生成全站了,如果内容较多可能会比较耗时
3、分站没有绑定域名并开启伪静态的情况下,伪静态路径默认带 /city/当前城市,例如:/city/henen/

相关文章:

PHPCMS v9城市分站插件

PHPCMS自带的有多站点功能&#xff0c;但是用过的朋友都知道&#xff0c;自带的多站点功能有很多的不方便之处&#xff0c;例如站点栏目没法公用&#xff0c;每个站点都需要创建模型、每个站点都需要单独添加内容&#xff0c;还有站点必须静态化。如果你内容很多这些功能当然无…...

学习几个地图组件(基于react)

去年开发时用的公司封装的地图组件&#xff0c;挺方便的&#xff0c;但是拓展性不强&#xff0c;所以看看有哪些优秀的开源地图组件吧 1、React Leaflet 介绍&#xff1a;开源的JavaScript库&#xff0c;用于在web上制作交互式地图&#xff0c;允许你使用React组件的方式在应…...

【测试开发学习历程】计算机编程语言

前言&#xff1a; 学习完数据库&#xff0c;我们便要进入到编程语言的内容当中了。 这里先对编程语言写出大致的分类&#xff0c; 在这之后&#xff0c;我们会以Python为重点&#xff0c; 开始测试开发为重点的编程语言学习。 目录 1 计算机编程语言的发展 2 语言的分类…...

动态内存管理-传值调用错题解析

首先我们来看这个错误代码 首先我们看代码逻辑&#xff0c;首先main函数调用test&#xff0c;test接收的是void类型&#xff0c;设置一个指针变量&#xff0c;指向null&#xff0c;传递给get函数&#xff0c;也就是传递一个空指针给getmemory函数&#xff0c;这个函数接收了&a…...

Java特性之设计模式【装饰器模式】

一、装饰器模式 概述 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装 装饰器模式通过将对象包装在装饰器类中&#xff0c;以…...

Leetcode算法题笔记(2)

目录 图论51. 岛屿数量解法一 52. 腐烂的橘子解法一 53. 课程表解法一 54. 实现 Trie (前缀树)解法一 回溯55. 全排列解法一 56. 子集解法一解法二 57. 电话号码的字母组合解法一 58. 组合总和解法一解法二 59. 括号生成解法一解法二 60. 单词搜索解法一 61. 分割回文串解法一 …...

二手车交易网站|基于JSP技术+ Mysql+Java+ B/S结构的二手车交易网站设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…...

lora-scripts 训练IP形象

CodeWithGPU | 能复现才是好算法CodeWithGPU | GitHub AI算法复现社区&#xff0c;能复现才是好算法https://www.codewithgpu.com/i/Akegarasu/lora-scripts/lora-trainstable-diffusion打造自己的lora模型&#xff08;使用lora-scripts&#xff09;-CSDN博客文章浏览阅读1.1k次…...

Acwing 503. 借教室

Problem: 503. 借教室 文章目录 思路解题方法复杂度Code 思路 这是一个二分查找问题。我们需要找到最大的借教室数量&#xff0c;使得每个教室的借用时间不超过其可用时间。我们可以通过二分查找来找到这个最大的借教室数量。 解题方法 我们首先对所有的借教室请求按照结束时间…...

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.1-3.5

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.1 神经网络概述&#xff08;Neural Network Overview&#xff09;3.2 神经网络的表示&#xff08;Neural Network Representation…...

Linux设备驱动开发 - 三色LED呼吸灯分析

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 展锐UIS7885呼吸灯介绍呼吸灯调试方法亮蓝灯亮红灯亮绿灯展锐UIS7885呼吸灯DTS配置ump9620 PMIC驱动ump9620中的LED呼吸灯驱动LED的tr…...

开发者的瑞士军刀:DevToys

DevToys&#xff1a; 一站式开发者工具箱&#xff0c;打造高效创意编程体验&#xff0c;让代码生活更加得心应手&#xff01;—— 精选真开源&#xff0c;释放新价值。 概览 不知道大家是否在windows系统中使用过PowerToys&#xff1f;这是微软研发的一项免费实用的系统工具套…...

【vue3.0】实现导出的PDF文件内容是红头文件格式

效果图: 编写文件里面的主要内容 <main><div id"report-box"><p>线索描述</p><p class"label"><span>线索发现时间:</span> <span>{{ detailInfoVal?.problem.createdDate }}</span></p><…...

【CSP试题回顾】202012-2-期末预测之最佳阈值(优化)

CSP-202012-2-期末预测之最佳阈值 关键点 1.map的遍历方式 map<int, int>occ0Num, occ1Num; for (auto it thetaSet.begin(); it ! thetaSet.end(); it) {num num occ0Num[*it] - occ1Num[*it];auto nextIt next(it); // 获取下一个迭代器if (num > maxNum &a…...

docker学习笔记 三-----docker安装部署

我使用的部署环境是centos 7.9 1、安装依赖工具 yum install -y yum-utils device-mapper-persistent-data lvm2 安装完成如下图 2、添加docker的软件信息源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo url地址为如…...

FastAPI+React全栈开发02 什么是FARM技术栈

Chapter01 Web Development and the FARM Stack 02 What is the FARM stack and how does it fit together? FastAPIReact全栈开发02 什么是FARM技术栈 It is important to understand that stacks aren’t really special, they are just sets of technologies that cover…...

C#程序结构详解

目录 背景: 一、C#程序的基本组成部分 二、C# Hello World示例 三、程序结构解析 四、编译与执行C#程序 五、总结 背景: 在学习C#编程语言的过程中&#xff0c;了解程序的基本结构是非常重要的。C#程序由多个组成部分构成&#xff0c;每个部分都有其特定的功能和作用。下面…...

linux 清理空间

1. 根目录下执行命令&#xff0c;查看每个目录下文件大小总和 rootvm10-88-88-3 /]# du -h --max-depth1 79M ./tmp 123M ./etc 4.0K ./media 4.0K ./srv 104M ./boot 5.3G ./var 0 ./sys 8.6M ./dev 196G ./usr 4.0K ./mnt 285M ./opt…...

C语言:给结构体取别名的4种方法

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到typedef这个关键字&#xff0c;这个关键字的作用是给现有的类型取别名&#xff0c;在实际使用过程中往往是将一个复杂的类型名取一个简单的名字&#xff0c;便于我们的使用。就像我们给很熟的人取外号一样&#xff…...

今天聊聊Docker

在数字化时代&#xff0c;软件应用的开发和部署变得越来越复杂。环境配置、依赖管理、版本控制等问题给开发者带来了不小的挑战。而Docker作为一种容器化技术&#xff0c;正以其独特的优势成为解决这些问题的利器。本文将介绍Docker的基本概念、优势以及应用场景&#xff0c;帮…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...