Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 28 мар 2024, 15:56

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Роутинг
СообщениеДобавлено: 16 янв 2014, 19:11 
Не в сети
Зеленый

Зарегистрирован: 15 ноя 2013, 19:08
Сообщения: 7
Доброго времени суток! Помогите, пожалуйста, в решении одного моего вопроса. У меня есть меню сайта, в нем подпункты. Когда нахожусь на главной, мои ссылки в меню работают как надо (http://yourscr.com/ed765ded6a577e2d88d6b2834433081a.png), но когда я нахожусь уже на одной из выбранных страниц, ссылка начинает работать неправильно (http://yourscr.com/220c01f76df7e32781b7f2e6f1922724.png) - появляется лишний путь "page/". Такая же ситуация и с другими разделами сайта. К примеру, это со страницы с новостями (http://yourscr.com/8b5d12e5923a2c0681c0e174b8610928.png). Понимаю, что дело в роуте, но не могу сообразить в каком именно и как это обойти.
Контроллер меню:
Код:
<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Widgets_Menu extends Controller_Widgets {

    public $template = 'Widgets/W_menu';

    public function action_index()
    {
        //Получаем пункты меню
        $actionPage = Request::initial()->param('url_page');
        var_dump($actionPage);
        $selectMenu = ORM::factory('page')->select('category_id')->where('url_page', '=', $actionPage)->find();
        var_dump($selectMenu->category_id);
        $menu = ORM::factory('category')->find_all();
        $this->template->menu = $menu;
        $this->template->selectMenu = $selectMenu;
        $this->template->actionPage = $actionPage;
    }
}

Вид меню:
Код:
<div class="row" style="margin: 10px 0px;">
    <div class="col-md-1"><img src="/public/img/logo.png"/></div>
    <div class="col-md-11">
        <ul class="nav nav-pills" style="float:right;">
            <? foreach($menu as $one): ?>
            <li class="dropdown <?=$selectMenu->category_id == $one->id ? 'active' : '';?>" style="padding-top: 5px;">
                <a class="dropdown-toggle" data-toggle="dropdown" href="#"><?=$one->menu?></a>
                <ul class="dropdown-menu">
                    <? $pages = $one->page->find_all();?>
                    <? foreach ($pages as $page): ?>
                    <li <?=$actionPage==$page->url_page ? 'class="active"' : '';?>>
                        <a href="page/<?=$page->url_page?>"><?=$page->title?></a>
                    </li>
                    <? endforeach ?>
                </ul>
            </li>
            <? endforeach ?>
        </ul>
    </div>
</div>

Роуты (скопирую все, т.к. не знаю в каком именно проблема):
Код:
Route::set('widgets', 'widgets(/<controller>(/<param>))', array('param' => '.+'))
    ->defaults(array(
        'directory'  => 'widgets',
        'action'     => 'index',
    ));

Route::set('auth', '<action>', array('action' => 'login|logout|register'))
    ->defaults(array(
        'directory'  => 'index',
        'controller' => 'auth',
    ));

Route::set('search', 'search')
    ->defaults(array(
        'directory'  => 'index',
        'controller' => 'search',
    ));

Route::set('contacts', 'page/contacts')
    ->defaults(array(
        'directory'  => 'index',
        'action' => 'contacts',
        'controller' => 'page',
    ));

Route::set('page', 'page(/<url_page>)')
    ->defaults(array(
        'directory'  => 'index',
        'action' => 'index',
        'controller' => 'page',
    ));

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Роутинг
СообщениеДобавлено: 17 янв 2014, 02:39 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
url_page у тебя в Route::set('page', 'page(/<url_page>)') , хотя вообще какой-то треш судя по роутам, ты лучше внятно распиши какие у тя разделы и какого вида ссылки нужны, а потом проанализируешь роуты которые тебе в ответ написали

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Роутинг
СообщениеДобавлено: 17 янв 2014, 17:00 
Не в сети
Зеленый

Зарегистрирован: 15 ноя 2013, 19:08
Сообщения: 7
WinterSilence писал(а):
ты лучше внятно распиши какие у тя разделы и какого вида ссылки нужны

У меня есть два основных контроллера Page и News. Страницы и новости соответственно. В контроллере Page есть action_index, который занимается всеми статичными страницами, которые есть на сайте и ряд других методов, в которых будет содержаться "специфическая" информация, которую я не могу вытащить из БД и обработать как "обычную" статическую страницу. К примеру, это страница контактов (action_contacts), где должна быть форма обратной связи.
Код:
class Controller_Index_Page extends Controller_Index {

    public function action_index() {
        $pageURL = $this->request->param('url_page');

        $page = ORM::factory('page')->where('url_page', '=', $pageURL)->find();
        $menu = ORM::factory('category')->where('id', '=', $page->category_id)->find();

        if(!$page->loaded() || $page->status == 0) {
            $this->redirect();
        }

        $page = $page->as_array();

        //Формируем хлебныекрошки
        $breadcrumb[] = array('name' => 'Главная', 'link' => '/');
        $breadcrumb[] = array('name' => $menu->menu, 'link' => '/');
        $breadcrumb[] = array('name' => $page['title'], 'link' => "/page/".$page['url_page']);

        $content = View::factory('index/page/v_page_index')
            ->set('page', $page)
            ->set('breadcrumbs', Breadcrumbs::generate($breadcrumb));

        // Выводим в шаблон
        $this->template->title = $page['title'];
        $this->template->description = $page['title'];
        $this->template->blocksCenter = array($content);
    }

    // Контакты
    public function action_contacts() {

        $content = View::factory('index/page/v_page_contacts');

        // Выводим в шаблон
        $this->template->page_title = 'Контакты';
        $this->template->block_center = array($content);
    }
}

По всей видимости, какой-то роут перед этими ссылками "вставляет" дополнительный путь (скрины в предыдущем посте). Т.е. когда я нахожусь на какой-то из статических страниц - добавляется лишний путь page/, если на странице с новостью какой-то -news/get/. Все сводится к тому, что мне нужно получать просто нормальные ссылки, которые я генерирую в своем виде без добавления лишнего пути:
Код:
<a href="page/<?=$page->url_page?>"><?=$page->title?></a>

WinterSilence писал(а):
а потом проанализируешь роуты которые тебе в ответ написали

Немного не понял, что ты имеешь в виду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Роутинг
СообщениеДобавлено: 19 янв 2014, 05:30 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Должно быть что-то вроде этого:
Код:
Route::set('search', 'search')
   ->defaults(array(
      'directory'  => '',
      'controller' => 'search',
      'action'     => 'index',
   ));

$url = Route::url('search');

class Controller_Search extends Controller_... {
   public function action_index() {}
}


Route::set('contacts', 'contacts')
   ->defaults(array(
      'directory'  => '',
      'controller' => 'page',
      'action'     => 'contacts',
   ));

Route::set('page', 'page/<id>', array('id' => '[-\w\/]+'))
   ->defaults(array(
      'directory'  => '',
      'controller' => 'page',
      'action'     => 'dynamic',
      'id'         => '',
   ));

$url = Route::url('page', array('id' => 'about'));
$url = Route::url('contacts');

class Controller_Page extends Controller_... {
   public function action_contacts() {}
   public function action_dynamic() {}
}


Route::set('news', 'news/<id>', array('id' => '[-\w\/]+'))
   ->defaults(array(
      'directory'  => '',
      'controller' => 'news',
      'action'     => 'index',
      'id'         => '',
   ));

$url = Route::url('news', array('id' => 'first-post'));

class Controller_News extends Controller_... {
   public function action_index() {}
}

Route::set('widget', 'widget/<controller>(/<param>)', array('controller' => '[\w]+', 'param' => '[-\w\.\/]+'))
   ->defaults(array(
      'directory'  => 'widget',
      'controller' => '',
      'action'     => 'index',
      'param'      => '',
   ));

$url = Route::url('widget', array('controller' => 'menu'));

class Controller_Widget_... extends Controller_... {
   public function action_index() {}
}

Route::set('auth', '<action>', array('action' => '(login|logout|register)'))
   ->defaults(array(
      'directory'  => '',
      'controller' => 'auth',
      'action'     => 'login',
   ));

$url = Route::url('auth');
$url = Route::url('auth', array('action' => 'logout'));

class Controller_Auth extends Controller_... {
   public function action_login() {}
   public function action_logout() {}
   public function action_register() {}
}


Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))', array('controller' => '[\w]+', 'action' => '[\w]+', 'id' => '[-\w]+'))
   ->defaults(array(
      'directory'  => 'admin',
      'controller' => 'main',
      'action'     => 'index',
      'id'         => '',
   ));

$url = Route::url('admin');
$url = Route::url('admin', array('controller' => 'admin', 'action' => 'add'));

class Controller_Admin_Main extends Controller_... {
   public function action_index() {}
}


Route::set('default', '(<controller>(/<action>(/<id>)))', array('controller' => '[\w]+', 'action' => '[\w]+', 'id' => '[-\w]+'))
   ->defaults(array(
      'directory'  => '',
      'controller' => 'main',
      'action'     => 'index',
      'id'         => '',
   ));

$url = Route::url('default');
$url = Route::url('default', array('controller' => 'news'));

class Controller_Main extends Controller_... {
   public function action_index() {}
}


основные моменты:
1. задаем regexp выражения и значения по умолчанию для всех параметров роутов
2. роуты объявляются в порядке от наиболее простых к сложным
3. ссылки генерим с помощью Route::url()

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Роутинг
СообщениеДобавлено: 26 янв 2014, 13:40 
Не в сети
Зеленый

Зарегистрирован: 15 ноя 2013, 19:08
Сообщения: 7
WinterSilence, спасибо большое! Помогло.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group