在昨天的開發基礎上,閱讀了OELOVE
的官方宣傳介紹文檔後,開發出了可以傳遞參數並實現絕大部分PHP
功能的OE
插件:大超超OE
僞靜態助手。php
開發思路:主要運用了系統預留的XHook
鉤子類,因爲OE
源代碼加密無從得之其具體實現方法。html
安裝方法:將源代碼保存爲dv_rewrite.php
,在/source/plugin/
下創建dv_rewrite
文件夾,將dv_rewrite.php
複製到新創建的文件夾下,而後在後臺插件和應用裏找到插件列表,啓用大超超OE
僞靜態助手便可。mysql
調用方法:在模版相應輸出位置調用XHook::doAction
並傳入參數,分別是插件內添加的識別名
和傳入的參數
(多參數傳遞還沒有嘗試),將分頁動態連接替換爲靜態連接的示例調用方法以下。sql
<!--{if !empty($showpage)}--> <div class="ft result-y"> <div class="pagenum"> <!--{XHook::doAction('dv_rewrite_page', $showpage)}--> </div> </div>
插件源代碼:segmentfault
<?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://www.thinkful.cn/archives/400.htmlfetch