在昨天的开发基础上,阅读了OELOVE
的官方宣传介绍文档后,开发出了能够传递参数并实现绝大部分PHP
功能的OE
插件:大超超OE
伪静态助手。
开发思路:主要运用了系统预留的XHook
钩子类,由于OE
源代码加密无从得之其具体实现方法。
安装方法:将源代码保存为dv_rewrite.php
,在/source/plugin/
下建立dv_rewrite
文件夹,将dv_rewrite.php
复制到新建立的文件夹下,然后在后台插件和应用里找到插件列表,启用大超超OE
伪静态助手即可。
调用方法:在模版相应输出位置调用XHook::doAction
并传入参数,分别是插件内添加的识别名
和传入的参数
(多参数传递尚未尝试),将分页动态链接替换为静态链接的示例调用方法如下。
<!--{if !empty($showpage)}-->
<div class="ft result-y">
<div class="pagenum">
<!--{XHook::doAction('dv_rewrite_page', $showpage)}-->
</div>
</div>
插件源代码:
<?php
/*
Plugin Name: 大超超OE伪静态助手
Version: v1.3
Plugin URL: http://www.thinkful.cn/archives/400.html
Description: 针对疑难伪静态,提供地区id转拼音、分页链接替换、分页标题SEO等优化功能。
For Version: OElove v3.x所有版本
Author: DCC
Author URL: http://www.thinkful.cn/
Last Update: 2014-01-27 16:32:55
*/
if(!defined('IN_OESOFT')) {
exit('Access Denied');
}
// 返回城市id对应的拼音
function dv_rewrite_getSpreadnameById($arr) {
$provinceid = $arr['provinceid'];
$cityid = $arr['cityid'];
$sql = "select spreadname from ".DB_PREFIX."area where areaid=$cityid";
$res = mysql_query($sql);
// 如果没有cityid,则调用provinceid @ 2014-01-26 15:51:27
if( mysql_result($res, 0)=='' ){
$sql = "select spreadname from ".DB_PREFIX."area where areaid=$provinceid";
$res = mysql_query($sql);
}
return mysql_result($res, 0);
}
// 替换列表页分页href内容,生成伪静态链接
function dv_rewrite_replacePagination($p, $rw_type='-init') {
if( $rw_type==='-init' ){
// 用户列表替换
$rw_type = $_GET['s_marry']==1 ? 'yk' : 'by';
// 微播列表替换
if( $_GET['c']=='weibo' ) $rw_type = 'weibo';
// 招聘、日记(共用模版)列表替换
if( $_GET['c']=='diary' ){
$rw_type = $_GET['cid']==1 ? 'zp' : 'rj';
}
}
$pattern = '/href="(.*?)index.php(.*?)page=(\d+)"/';
$rewrite_res = 'href="${1}'.$rw_type.'/page-$3/"';
echo preg_replace($pattern, $rewrite_res, $p);
}
// 详细信息页地区静态链接函数
function dv_rewrite_spread($arr){
echo dv_rewrite_getSpreadnameById($arr);
}
// 地区模版列表替换静态链接
function dv_rewrite_locationPagination($p){
$arr = array(
'provinceid' => $_GET['s_dist1']+0,
'cityid' => $_GET['s_dist2']+0
);
// 生成list-type,共用替换函数
$rw_type = dv_rewrite_getSpreadnameById($arr);
dv_rewrite_replacePagination($p, $rw_type);
}
// 向文本后添加第几页(如果有)
function dv_rewrite_fixTitle($s){
if( $_GET['page'] ){
$page = '第'.$_GET['page'].'页';
// 是标题
if( strpos($s, '-') ){
$tmparr = explode('-', $s);
$end = end($tmparr);
$tmparr[count($tmparr)-1] = $page.'-'.$end;
$s = join('-', $tmparr);
}
// 是关键词和描述
else{
$s = $s.','.$page;
}
}
echo $s;
}
// 根据地区id生成附近地区链接 @ 2014-01-27 15:52:13
function dv_rewrite_generateAreaLinks($provinceid){
$sql = "select areaname,spreadname from ".DB_PREFIX."area where rootid=$provinceid";
$res = mysql_query($sql);
while( $r=mysql_fetch_array($res, MYSQL_ASSOC) ){
extract($r);
$s .= '<a href="'.PATH_URL.$spreadname.'/">'.$areaname.'*</a>';
}
echo $s;
}
// 添加绑定事件
// 列表页(用户、日记、招聘共用)替换静态链接
XHook::addAction('dv_rewrite_page', 'dv_rewrite_replacePagination');
// 详细信息页地区静态链接
XHook::addAction('dv_rewrite_spreadname', 'dv_rewrite_spread');
// 地区模版列表替换静态链接
XHook::addAction('dv_rewrite_morepage', 'dv_rewrite_locationPagination');
// 分页时便于SEO需要修改标题、关键词和描述
XHook::addAction('dv_rewrite_pageSEO', 'dv_rewrite_fixTitle');
// 生成附近地区链接
XHook::addAction('dv_rewrite_arealinks', 'dv_rewrite_generateAreaLinks');
?>
开发这个插件的同时在做一个WEB
项目,时间相对较紧迫,难免有些疏忽和不高效之处,欢迎指正。
项目为大,插件为小,开发插件权当练手,一点一点积累基础才能出大成绩,加油。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。