Kohana 3.1.1 Проблема маршрутизации с вкладками jQuery

#jquery-ui #kohana

#jquery-пользовательский интерфейс #kohana

Вопрос:

Чтобы задать свой вопрос, мне нужно сначала объяснить свой код…

У меня есть контроллер (Controller_App), который расширяет Controller_Template. Внутри представления шаблона контроллера у меня есть вкладки jQuery с 3 вкладками. Когда я обращаюсь к URI: /view/26 , запускается следующий маршрут:

 Route::set('view_story', '<action>/<id>(/<stuff>)', array(
    'action'    => 'view',
    'id'        => 'd ',
    'stuff'     => '.*',
))
->defaults(array(
    'controller' => 'app',
));
  

Затем в Controller_App вызывается следующая функция, которая устанавливает URI вкладки jQuery «Explore» и делает ее выбранной по умолчанию:

 public function action_view($id)
    {
        $this->template->controller['explore'] = Route::get('explore')
            ->uri(array(
                'controller' => 'explore',
                'id'         => $id,
            ));
        $this->template->default_tab = 2;
    }
  

Вот мой маршрут «исследовать»:

 Route::set('explore', '<controller>/<id>', array(
    'controller'    => 'explore',
    'id'            => 'd ',
))
->defaults(array(
    'action'    => 'index',
));
  

Проблема:
Когда я пытаюсь получить доступ к истории с URL: «myhost.com/view/26 «, он устанавливает все нормально, но он думает, что «/ view» — это каталог, поэтому он пытается вызвать «myhost.com/view/explore/26 . Поскольку нет контроллера с именем «view», я получаю ошибку 404. Я смог обойти ошибку 404, создав следующий маршрут:

 Route::set('explore', '(<directory>/)<controller>/<id>', array(
    'directory'     => 'view',
    'controller'    => 'explore',
    'id'            => 'd ',
))
->defaults(array(
    'directory' => '',
    'action'    => 'index',
));
  

… и затем меняю мою функцию на:

 public function action_view($id)
    {
        $this->template->controller['explore'] = Route::get('explore')
            ->uri(array(
                'directory'  => '',
                'controller' => 'explore',
                'action'     => 'index',
                'id'         => $id,
            ));
        $this->template->default_tab = 2;
    }
  

Но когда страница загружается, она вызывает jQuery.get(), но пытается вызвать PHP-файл в каталоге «/ view» вместо текущего каталога.

Я не знаю, является ли это простой проблемой маршрутизации, или я вообще запускаю правильное дерево. Но я перепробовал все различные комбинации маршрутов и ни за что на свете не могу в этом разобраться. Все предложения приветствуются!

Спасибо, Брайан

Комментарии:

1. Вы говорите, что при переходе к myhost.com/view/26 все в порядке, но он пытается вызвать myhost.com/view/explore/26 ? Что пытается вызвать myhost.com/view/explore/26 ? Может быть, вам нужно обернуть URL::site() вывод маршрута?

2. @davgothic — Извините, для меня было довольно поздно прошлой ночью, когда я опубликовал это. 😉 В action_view функции (первой) она создает маршрут для контроллера explore. Но когда это происходит, он сохраняет /view каталог и добавляет его к моему маршруту. Если я изменю определение маршрута и изменю свою action_view функцию (как показано во 2-м примере), это устранит проблему, но тогда мои вызовы AJAX будут сбиты с толку, потому что вместо вызова core/stories он вызывает /view/core/stories . Похоже, мне нужно изменить мою текущую работу непосредственно на один уровень…

Ответ №1:

Route::uri(...) генерирует uri, которые не являются абсолютными. Переключитесь на использование Route::url(...) , и у вас все должно получиться.

Route::url(...) это короткий путь для Route::uri(...) прохождения URL::site(...) .

 public function action_view($id)
{
    $this->template->controller['explore'] = Route::get('explore')
        ->url(array(
            'controller' => 'explore',
            'id'         => $id,
        ));
    $this->template->default_tab = 2;
}
  

Комментарии:

1. Проблема заключается в выполнении AJAX-вызова из моего внешнего JS-файла. Куда бы я поместил метод Route / URL?

2. я подозревал, что коду AJAX был присвоен относительный URI, а не абсолютный (т.Е. foo.html вместо /foo.html ), в результате код пытается найти каталог из текущего URL, а затем добавить к нему относительный URL. Измените его там, где вы выполняете это назначение: $this->template->controller['explore'] = ..