2016-05-11 4 views
0

ControllerからConcrete5(php)に拡張されたクラスを任意のパラメータで作成しようとしています。私はConcrete5とSymfonyの両方のドキュメントを精査しようとしましたが、答えがそこにないか、PHPでうまくいけば大丈夫です。だから、私はこのプロセスを通して私を手に入れるための少しの手持ちを探しています。Concrete5:Route :: registerのオプションパラメータ

私のアプリケーションの\ブートストラップの尾エラーを生成endを超えたパラメータを持つ任意のURIで\ app.php

Route::register(
    '/plotdata/{start}/{end}' //1 below 
    , 'Application\Controller\SinglePage\getplotdata::getData' //2 
    , NULL //3 
    , array() //4 
    , array('var1' <= NULL, 'var2' <= NULL, 'var3' <= NULL, 'var4' <= NULL) //5 
//1 rtPath | path - start and end are required params /{var1}/{var2}/{var3}/{var4} are optional, 
//2 callback 
//3 rtHandle 
//4 requirements = array() see e.g. line below 
//  array('start' => '[0-9]{4}(-[0-9]{2}){2} [ 0-2][0-9](:[0-5][0-9]){2}(.[0-9]{3})?' 
//5 options | additionalAttributes 
); 

結果。例えば

plotdata/2015-02-01 00%3A00%3A00/2016-02-09 23%3A59%3A00/blah 

は404エラーを生成します。適切なディレクトリにgetplotdata.phpが存在し、これらの行が頭の近くにあると仮定して、末尾に/blah(ただし、$var1=blahは設定されていません)を終了するとロードされます。

namespace Application\Controller\SinglePage; 
class getplotdata extends Controller { 

(最初のブロック内の)行 "1" が同じ(5を含む)他のラインを残し

 '/plotdata/{start}/{end}/{var1}/{var2}/{var3}/{var4}' 

を読み取るように変更された場合、Iはそれぞれをパラメータ化する必要があります。例えばplotdata/2015-02-01 00%3A00%3A00/2016-02-09 23%3A59%3A00/blah

plotdata/2015-02-01 00%3A00%3A00/2016-02-09 23%3A59%3A00仕事、

でもないが、そう

plotdata/2015-02-01 00%3A00%3A00/2016-02-09 23%3A59%3A00/1/2/3/4し、どのように私は([symfonyのから$デフォルトを暴露することによって?]デフォルト値の有無にかかわらず)、オプションのパラメータを指定するか、またはそこにありますConcrete5に「オーバーロードされた」クラス定義を生成する方法はありますか?私は何かのようにしますか

$bob = Route::register(
    '/plotdata/{start}/{end}' 
    , 'Application\Controller\SinglePage\getplotdata::getData' 
); //end $bob 
$bob->addDefaults(array('var1' <= NULL, 'var2' <= NULL, 'var3' <= NULL, 'var4' <= NULL)); 
+0

[c5.orgポスト](https://でWWWをあなたは行って、それへの参照を取得することができます.comcrete5.org/community/forums/customizing_c5/concrete5-optional-parameters-for-routeregister /) – mpag

答えて

0

私はそれが今働いているようです。 (

Route::register(
    '/plotdata/{start}/{end}{optparams}' 
    , 'Application\Controller\SinglePage\getplotdata::getData' 
)->addRequirements(
    array('optparams' => '.*') 
)->addDefaults(
    array('optparams' => '/') 
); 
ノートの

  1. {end}{optparams}の間ではありません/、そうでない場合は/{end}後に必要であり、あなたはURIに少なくとも一つの付加価値が必要になります。これは、関連するapp.phpコードです改行またはスペース+改行は、URIの後に動作していないようです)*。
  2. '.*' "RegEx"は、長さが0の文字列にも一致する必要があるため、末尾にスラッシュやその他の値がなくなることがあります。
  3. addDefaultsビットを使用すると、end値の後にURIを終了するか、末尾に/を追加すると、同じ値が渡されます。ちなみに、それをaddDefaults(array('optparams' => ''))として残しておくことは、以下のコントローラーファイルでの私の実装を考えればうまくいくようです。

次に登録コントローラファイル(getplotdata.php)において

$in_ar = explode('/',Request::getInstance()->get('optparams')); 
array_shift($in_ar); //get rid of "empty" parameter at start 

これは、任意の後続の/ Sとの間の各値を配列変数$ in_arを充填します。オプションのパラメータの後に/で終了すると、最後の配列要素に空の文字列が返されます。 URIのどこかに連続して/があったら、おそらく同様のことが起こります。

また、あなたはおそらく両方?&に分割するために爆発変えることによって、?var1=val&var2=value形式に移行でき、空の最初の要素を取り除くためにシフトし、その後、上キー+値のペアに各配列要素を再爆発=文字

*私のConcrete5のインストールとFirefoxの上に、少なくとも... YMMV

参照:この問題を打破するために私を助けたSymfony "cookbook" doc

0

具体的にはRoute :: registerメソッドは便宜上のものです。自分のsymfonyルートインスタンスをSymfonyRouteCollectionに追加することで登録することができます。

$collection = Route::getList(); 
$collection->add($handle, $customRoute); 

をまた、あなたが示唆したものを行うことができるはず最新バージョンで:

$route = Route::register(...); 
$route->setOptions($options); 
+0

私は使用しているバージョンがわかりませんが、route :: registerには5番目の "options"パラメータを指定しています$ route-> setoptions())はうまくいきませんでした。そして、再び、私はそのパラメータに間違った構文を使用している可能性があります.c5とsymfonyのどちらのドキュメントも、実際には "オプション"の意味に入りません。私の限られた読書に基づいた私の理解は、それはURIにはない、いわゆる「隠された」価値を提供する方法ではなく、柔軟に持ち込むことのできる、 add'lパラメータの数。 – mpag