2016-09-06 3 views
2

複数のURL構造を許可する必要があるサイトがあります。たとえば、次のようになります。CakePHPルートを使ったさまざまなレベルのURL

www.examplesite.com/people/add // <-- example company 
www.otherexample.com/xyz/people/add // <-- "xyz" company (not location based) 
www.otherexample.com/florida/abc/people/add //<-- "abc" company (location based) 

各URLは、URLに基​​づいてどの会社が検出されるべきかを示します。

はこれまでのところ、私はそれがどの会社を決定するためにうまくURLを解析することができましたが、私はアプリの残りの部分が機能するようにルートにこれらの余分な/florida/abc/パーツを追加する方法?

私は、変数を '/ florida/abc'(またはそれが何であれ)にルートファイルの先頭に設定してから、各ルートの前に追加してみましたが、そうではありませんすべてのコントローラー/アクションを処理し、非常にヒットしたり、ミス/バグのようです。

例えば、それはまた、このように動作する必要がありますので、私はまた、 admin接頭辞を使用

:私の仮定は、私がroutes.phpファイルを使用する必要があるということですが、私は内に決定することはできません

www.otherexample.com/admin/florida/abc/people/add 

私がこれをどうやって起こせるか。

答えて

0

私はウェブアプリケーションfarm.ba(所有者がこれ以上管理していない)でこのアプローチを使用しました。

私が何をしたか

:ノードを処理

  • ..フィールドのID、スラグ、モデル、FOREIGN_KEY、タイプとテーブル "ノード" を作成したカスタムルート(1)を作成し、(2)クラスポストを保存した後、モデル
  • 、店舗やキャッシュスラグノードモデルで
  • ポストを削除した後、キャッシュノード、レコードに
を削除

これは、多くのwordpressのルーティングと同じように動作しますが、カスタムスラグを入力することができます、など

EDIT:

のようなアプリケーション/ libに/ルーティング/ルータ/ MultiRoute.phpでカスタムルートクラスを作成します。

をroutes.phpの

余分な要求を使用して、コントローラの検索結果で
App::uses('MultiRoute', 'Lib/Routing/Route'); 

Router::connect('/admin/*', 
    array('admin' => true),// we set controller name in MultiRoute class 
    array('routeClass' => 'MultiRoute') 
    ); 

Router::connect('/*', 
    array(),// we set controller name in MultiRoute class 
    array('routeClass' => 'MultiRoute') 
    ); 

<?php 
App::uses('CakeRoute', 'Routing/Route'); 
/** 
* MultiRoute 
*/ 
class MultiRoute extends CakeRoute 
{ 

    public function parse($url) 
    { 
     // debug($url); '/florida/abc/people/add' 

     // Add custom params 
     $params = array(
      'location' => null, 
      'company' => null, 
      'controller' => 'peoples', 
     ); 

     $params += parent::parse($url); 
     // debug($params); 
     /** 
     * array(
     * 'location' => null, 
     * 'company' => null, 
     * 'controller' => 'peoples', 
     * 'named' => array(), 
     * 'pass' => array(
     *  (int) 0 => 'florida', // location 
     *  (int) 1 => 'abc', //company 
     *  (int) 2 => 'people', // controller 
     *  (int) 3 => 'add' // action, default index 
     * ), 
     * 'action' => 'index', 
     * 'plugin' => null 
     *) 
     * 
     */ 

     // reverse passed params 
     $pass = array_reverse($params['pass']); 
     // debug($pass); 
     /** 
     * array(
     *  (int) 0 => 'add', 
     *  (int) 1 => 'people', 
     *  (int) 2 => 'abc', 
     *  (int) 3 => 'florida' 
     * ) 
     */ 

     if(isset($pass[3])) { $params['location'] = $pass[3]; } 
     if(isset($pass[2])) { $params['company'] = $pass[2]; } 
     // if you need load model and find by slug, etc... 
     return $params; 
    } 

    public function match($url) 
    { 
     // implement your code 
     $params = parent::match($url); 
     return $params; 
    } 
} 

パラメータ:

$this->request->location; 
$this->request->company; 

この情報は役に立ちましたか?

+0

カスタムルートが何を覚えていますか?私はCustom Routesを選択肢として見ましたが、この問題を解決する方法を確信できません。 – Dave

+0

こんにちは@Dave、残念ながら、私は上記のアプリケーションのコードがありません。私はあなたの編集された答えであなたにアイデアをあげます、 – Salines

関連する問題