Как прочитать 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 файл

Другие вопросы по тегам