2016-05-23 9 views
0

私はSilverStripe 3.3.1を使用しており、多くのパラメータを持つURLを処理するカスタムルートを設定しています。それは動作します。Silverstripe:カスタムルートでコントローラのページフィールドにアクセスできません

ただし、ルーティングルールにより、Page_Controllerとテンプレートでページフィールドと関数にアクセスできなくなります。任意のアイデアをどのようにこれを修正するには?この質問はまたSilverstripeフォーラムに掲載されて

Director: 
    rules: 
    'mypage': 'MyPage_Controller' 

config.ymlで

//MyPage class 
class MyPage extends Page { 

    //Not accessible if route to controller specified in config.yml 
    private static $db = array(
     'MyPageVar' => 'Int', 
    ); 

    //Not accessible if route to controller specified in config.yml 
    public function getMySpecialVar() { 
     return $this->MyPageVar; 
    } 
} 

//MyPage_Controller class 
class MyPage_Controller extends Page_Controller { 

    private static $allowed_actions = array(
     'index', 
     'detailsearch', 
    ); 

    private static $url_handlers = array (
     'detailsearch/$Key1/$Value1/$Key2/$Value2/$Key3/$Value3/$Key4/$Value4/$Key5/$Value5' => 'detailsearch', 
    ); 


    /** 
    * UseMyPageVar() 
    * 
    * @return Boolean 
    */ 
    public function UseMyPageVar() { 
     //Empty if route to controller specified in config.yml 
     Debug::show($this->MyPageVar); 
     Debug::show($this->Title); 
     Debug::show($this->Content); 
     //Error if route to controller specified in config.yml 
     Debug::show($this->getMySpecialVar()); 

     return true; 
    } 
} 

MyPage.ss

<!-- This work as expected if no route is specified. --> 
<!-- But all vars are empty if route is specified in config.yml --> 
<p>MyVar: $MyPageVar</p> 
<p>Title: $Title</p> 
<p>Content: $Content</p> 

ルーティングルール:それはかなりではありません http://www.silverstripe.org/community/forums/general-questions/editpost/413506

答えて

0

、しかし今のところ私はプライベートvarを使ってこの問題を解決しましたeページへの参照を保持するControllerクラス。

//MyPage_Controller class 
class MyPage_Controller extends Page_Controller { 

    private $_page; //reference to page that's lost with custom routing   

    //ContentController uses route, which has been changed to 
    // 'MyPage_Controller' by routing rule, to initialize 
    // page reference. Can't find anything so reference 
    // not set. (set to -1) 
    public function init() { 
     parent::init(); 

     //Initialize using default route overwritten in routing rule 
     // This will break if URL segment changed in CMS 
     $route = array_search($this->URLSegment, 
         Config::inst()->get('Director', 'rules')); 
     $link = str_replace($this->URLSegment, $route, $this->Link()); 
     $this->_page = $this->Page($link); 
    } 


    //Use private var to access page fields 
    public function MyPageVar() { 
     Debug::show($this->_page->MyPageVar); 
    } 

    //expose $Content to templates 
    public function Content() { 
     return $this->_page->Content; 
    } 

    //Can't use Title() so expose Page Title as $PageTitle 
    public function PageTitle() { 
     return $this->_page->Title; 
    } 
} 
0

三私はあなたのコードを見たときの事は心に春:config.ymlの「マイページ」はMyPage_Controllerのパブリックメソッドの名前でなければなりません

  1. こと。 SilverStripeは一致するメソッドmypageを見つけることができず、デフォルトではindex()を呼び出します。

  2. ルートは実際に別のroutes.ymlファイルに格納する必要があります。そのため、SilverStripe自身のコアルートの前後に呼び出されるように「名前空間」を設定することができます。あなたがこれをしないと、それはあなたが経験している奇妙な行動を引き起こすかもしれません。

  3. ?debug_request=1 URLパラメータを使用してルートをデバッグできることはご存知ですか?参照:https://docs.silverstripe.org/en/3.3/developer_guides/debugging/url_variable_tools#general-testing

+0

ご返信ありがとうございます。 1)ルーティングとURLハンドラーは期待どおりに動作します。問題は、コントローラとテンプレートのページフィールドにアクセスすることです。 2)私はroutes.ymlにルーティングルールを移動しました。ルーティングは引き続き機能しますが、コントローラでページ・フィールドにはまだアクセスできません。 3)ルーティングは既にソートされていました。コントローラのPageクラスに失われた参照をデバッグする必要がありました。 – cmc

関連する問題