Как прочитать url-параметры в методе on_start() контроллеров?
В моем текущем проекте Contrete5 у меня есть одна страница, которая принимает один параметр URL. Таким образом, URL выглядят так:
domain.com/[singlepagename]/[id]
и контроллер имеет соответствующую функцию просмотра:
function view($id) { ... }
Теперь мне нужен доступ к идентификатору в функции on_start(). но function on_start($id) { ... }
выдает ошибку и $this->get()
возвращает пустой массив
Любая идея, как я могу получить части URL в on_start()
?
1 ответ
Я сталкивался с этим раньше... проблема в том, что объект Request C5 не инициализируется до тех пор, пока не будут запущены события on_start различных контроллеров пакетов. Я полагаю, что единственное решение, которое люди придумали, было вручную инициализировать класс Request в функции on_start контроллера вашего пакета. Если вы посмотрите на файл 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
файл