如何在控制器on_start()方法中读取url-parameters?

时间:2012-09-10 21:15:40

标签: php url-routing concrete5

在我目前的Contrete5项目中,我有一个页面,它需要一个url参数。所以网址看起来像这样:

domain.com/[singlepagename]/[id]

并且控制器具有相应的视图功能:

function view($id) { ... }

现在我需要访问on_start()函数中的id。但function on_start($id) { ... }抛出错误,$this->get()返回一个空数组。

任何想法如何在on_start()中获取网址部分?

1 个答案:

答案 0 :(得分:1)

之前我遇到过这个问题...问题是C5的Request对象在各种包控制器的on_start事件被触发之后才被初始化。我相信人们提出的唯一解决方案是在包控制器的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文件中复制相应的代码