#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'] = ..