1. 程式人生 > >YII的自定義路由規則類的使用(初級)

YII的自定義路由規則類的使用(初級)

發現網上的yii自定義路由規則類的使用介紹比較少

前兩天做了網站SEO方面的URL優化工作。

具體要求是:商城門店的URL中需要有門店的地區id和分頁p出現,

如:http://www.abc.com/store-provinceid(門店地區id)-p(分頁數).html  

本人分享自己的使用心得

對於複雜的url美化,yii可以設定url 規則類的使用  

第一步:mian.php中urlManage配置中rules陣列中新增規則時可以新增一個規則

array(
        'class' => 'application.components.StoreUrlRule',
    ), 
第二步:在conponents 檔案下創一個自定義的規則類,例如StoreUrlRule.PHP

這個StoreUrlRule必須繼承CBaseUrlRule這個類,自定義類必須實現基類中createUrl和parseUrl2個方法

createUrl這個方法在控制器中$this->createUrl('store/index',$this->parameter)可以呼叫到,在分頁類中可以用Yii::app()->createUrl('store/index',$this->parameter)這個方法動態呼叫

 public function createUrl($manager,$route,$params,$ampersand)
     {
         if ($route=='store/index')
         {
             if (isset($params['province'], $params['p']))
                 return 'store-'.$params['province'] . '-' . $params['p'].'.html';
             else if (isset($params['province']))
                 return 'store-'.$params['province'];
         }
        // return false;  // this rule does not apply
     }
     
     public function parseUrl($manager, $request,$pathInfo,$rawPathInfo)
     {
         
         if (preg_match('/^(\w+)(-(\d+))(-(\d+))?$/', $pathInfo, $matches))
         {
             $province=$matches[3];
             if(!empty($matches[5])){
                 $p=$matches[5];
             } 
            // There is a match from db check above
                 if(isset($p)){
                     $_GET['p']=$p;
                     $_GET['province']=$province;
                     return 'web110/store/index';
                 }else{
                     $_GET['province']=$province;
                     return 'web110/store/index';
                 }
         }
     }
在這個規則類中還可以完成更變態的url,例如:

具體要求是:商城門店的URL中需要有門店的地區拼音和分頁p出現,

如:http://www.abc.com/store-拼音(門店地區拼音)-p(分頁數).html

在createUrl()中先修改$params(將id轉換為地區pinyin,轉換後如果有多餘的引數,可以unset掉。);

在parseUrl()中解析完$params後,新增地區拼音轉id的程式碼。

需要在規則類中新增一個方法獲取所有地區id和對應的拼音

 protected function getRegionNames()
     {
          $store = new B2cStore();
          $result = $store->getAllRegions();
          return $result;
     }
在createurl方法中新增
$regions = CHtml::listData($this->getRegionNames(),'region_id','local_name');
YII內建方法listData將二維陣列轉換為region_id與拼音對應的一維陣列
<span style="color:#333333;">if (isset($params['province'], $params['p']))
                 return 'store-'</span><span style="color:#ff6666;">.$regions[$params['province']]</span><span style="color:#333333;"> . '-' . $params['p'].'.html';
             else if (isset($params['province']))
                 return 'store-'.</span><span style="color:#ff6666;">$regions[$params['province']</span><span style="color:#333333;">];</span>
即可 解析同建立 ,本人初學yii,更深度的挖掘http://my.oschina.net/liuxiaobo/blog/202568



相關推薦

YII定義路由規則的使用初級

發現網上的yii自定義路由規則類的使用介紹比較少 前兩天做了網站SEO方面的URL優化工作。 具體要求是:商城門店的URL中需要有門店的地區id和分頁p出現, 如:http://www.abc.com/store-provinceid(門店地區id)-p(分頁數).

golang定義路由控制實現

    由於本人之前一直是Java Coder,在Java web開發中其實大家都很依賴框架,所以當在學習Golang的時候,自己便想著在Go開發中脫離框架,自己動手造框架來練習。通過學習借鑑Java的思想還有部分框架的原始碼,在golang上面進行實現,從而達到對Java和

MVC路由學習:定義路由參數用戶看不到參數名,重新定義路由規則

route sys 工具 str optional href clas local amp 一,項目有需求將項目地址中的參數名不顯示給用戶看 在MVC定義一個方法:     public ActionResult GetUserInfo(string Name, str

MVC系列——MVC原始碼學習:打造自己的MVC框架三:定義路由規則

前言:上篇介紹了下自己的MVC框架前兩個版本,經過兩天的整理,版本三基本已經完成,今天還是發出來供大家參考和學習。雖然微軟的Routing功能已經非常強大,完全沒有必要再“重複造輪子”了,但博主還是覺得自己動手寫一遍印象要深刻許多,希望想深入學習MVC的童鞋自己動手寫寫。好了,廢話就此打住。 MVC原始

閘道器服務定義路由規則springcloud+nacos

1. 場景描述 需要給各個閘道器服務類提供自定義配置路由規則,實時生效,不用重啟閘道器(重啟風險大),目前已實現,動態載入自定義路由檔案,動態載入路由檔案中的路由規則,只需在規則檔案中配置下規則就可以了 2.解決方案 2.1 解決思路 新建總的監控總類,監控閘道器服務路由規則配置檔案,然後每個路由配置檔案再監

PHP Yii2 定義業務異常可支援返回任意自己想要的型別資料

public function beforeAction($action) { return parent::beforeAction($action); } public function runAction($id, $params = []) {

jQuery定義陣列操作類似於List集合的增刪改查

js外部檔案,前提需要引入jquery類庫。 封裝類程式碼如下: (function ($) {     $.List = function () {         va

springboot的定義properties注入使用@ConfigurationProperties註解

下面是需要注入屬性的類 package com.springboot.bean; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties;

xgboost 定義評價函數metric與目標函數

binary ret and 參數 cnblogs from valid ges zed 比賽得分公式如下: 其中,P為Precision , R為 Recall。 GBDT訓練基於驗證集評價,此時會調用評價函數,XGBoost的best_iteration和

XAF 框架中,定義參數動作Action,輸入參數的控件可定義,用於選擇組織及項目

示例 app frame tro href express documents 定義 ron XAF 框架中,如何生成一個自定義參數動作(Action),輸入參數的控件可定義? 參考文檔:https://documentation.devexpress.com/eXpres

AngularJs定義指令詳解5 - link

演示 hang cursor off drag font 雙向 事件 date 在指令中操作DOM,我們需要link參數,這參數要求聲明一個函數,稱之為鏈接函數。 寫法: link: function(scope, element, attrs) {  // 在這裏操作DO

sench touch 定義小圖標

found conf custom cmd svg logs 頁面 一個 會有 自定義圖標的方法 Sencha touch自帶圖標有限,有時需要自己添加圖標。下面介紹自定義圖標的方法: 首先需要生成圖標字體。有許多網站提供在線生成圖標字體的功能,比如IcoMoon,通過這個

vue2 定義 折疊列表Accordion組件

rep link 分享圖片 toggle sset pac baseline object 列表 1.自定義 折疊列表 Accordion.vue <!-- 折疊列表 組件 --> <template> <nav :class="$st

ASP.NET MVC 學習筆記-7.定義配置信息後續

字符串 return abstract 新的 work 生成 value DC 連接字符串加密 自定義配置信息的高級應用 通過上篇博文對簡單的自定義配置信息的學習,使得更加靈活的控制系統配置信息。實際項目中,這種配置的靈活度往往無法滿足項目的靈活度和擴展性。 比如,一個

vue--定義指令進行驗證1

指令 borde order hone 大於 正則表達 display UNC pen 實例代碼: <template> <div id="app" class="app"> <h3>{{msg}}</h3> &

定義AXI-IP核

  目的: 自定義一個IP核,通過AXI匯流排與ARM系統連線   環境: Win7 32bit Vivado2014.4.1 Xilinx sdk2014.4 開發板: Zc702 &nbs

Unity3D 定義編輯器介面Inspector

今天看一個指令碼,本想看看在 Inspector 介面的變數在腳本里的用途,然後查詢變數名的時候怎麼也找不到,自己也是驚訝。通過網上搜索才瞭解到原來 Inspector介面 是可以自己定義的。 當然自己定義,當然也需要寫一個指令碼來改的。可能是為了讓介面整潔的目的。 首先

OC中UITableView之定義cell的使用2:通過程式碼建立

在使用UITableView做開發時,常常會遇到 系統提供的樣式無法滿足專案需求的情況,這時就需要根據需求來自定義cell。 自定義cell有兩種方式:   · 通過xib自定義cell(適用於cell中子控制元件個數固定、cell樣式統一的結構,例如:商品的列表頁面)

OC中UITableView之定義cell的使用1:通過xib建立

在使用UITableView做開發時,常常會遇到 系統提供的樣式無法滿足專案需求的情況,這時就需要根據需求來自定義cell。 自定義cell有兩種方式:   · 通過xib自定義cell(適用於cell中子控制元件個數固定、cell樣式統一的結構,例如:商品的列表頁面)

百度地圖--獲取定義區域JSON資料

基於百度地圖的自定義區域繪圖–呼叫地圖 註冊百度地圖的SDK: 這一步是呼叫百度地圖的核心,通過獲取SDK才能進行相關操作。 使用百度地圖: 在html中引入js檔案: <script src="http://api.map.baidu.com/a