私は以前にこれに遭遇しました... 問題は、さまざまなパッケージコントローラーの on_start イベントが発生するまで、C5 の Request オブジェクトが初期化されないことです。人々が思いついた唯一の解決策は、コントローラーの on_start 関数をパッケージ化して Request クラスを自分で手動で初期化することだったと思います。dispatcher.php ファイルを見ると、129 行目 (Concrete5.6.0.1 内) 付近に次のコードのチャンクがあることがわかります。
// figure out where we need to go
$req = Request::get();
if ($req->getRequestCollectionPath() != '') {
if (ENABLE_LEGACY_CONTROLLER_URLS) {
$c = Page::getByPath($req->getRequestCollectionPath(), 'ACTIVE');
} else {
$c = $req->getRequestedPage();
}
} else {
$c = Page::getByID($req->getRequestCollectionID(), 'ACTIVE');
}
$req = Request::get();
$req->setCurrentPage($c);
if ($c->isError()) {
// if we've gotten an error getting information about this particular collection
// than we load up the Content class, and get prepared to fire away
switch($c->getError()) {
case COLLECTION_NOT_FOUND:
$v = View::getInstance();
$v->render('/page_not_found');
break;
}
}
...だから、それをすべてパッケージコントローラーの on_start 関数にコピーすると$req
、パス情報と変数を取得するオブジェクトが得られると思います。
注: Concrete5.6.0.1 からそのコードをコピーしました。別のバージョンのシステムを使用している場合は、上で貼り付けたものをそのまま使用するのではなく、/concrete/dispatcher.php
ファイルから適切なコードを自分でコピーする必要があります。