Запрос представления с его контроллером от другого представления / контроллера - Kohana 3.2 - PullRequest
1 голос
/ 29 февраля 2012

У меня возникла небольшая проблема с хлебными крошками, которые я делаю для сайта ... Я относительно новичок в Kohana, поэтому я не уверен, правильно ли я поступаю по этому поводу.

У меня все мои страницы с их правильными контроллерами работают нормально, мне нужны хлебные крошки вверху каждого, которые из-за дизайна должны были идти вверху каждого представления - это включалось с использованием<?=View::factory('elements/breadcrumb')?>

это, однако, включает в себя только фактическое представление, и я хочу получить его контроллер (и модель через контроллер), потому что мне нужно выяснить, какая страница была включена, и соответственно изменить представление крошки.

Я слоняюсь вокруг и сталкиваюсь с HMVC, но я не совсем уверен, как это работает, или если это даже то, на что я должен смотреть!

Может кто-нибудь пролить свет на это ??

PS Вместо того, чтобы просто использовать модуль, который уже сделал кто-то другой, я бы очень хотел понять, как, черт возьми, делать это правильно - я близко, я чувствую это!

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Почему бы вам не создать массив хлебных крошек в контроллере и не передать эти данные в представление?

<?=View::factory('elements/breadcrumb', $breadcrumbs)?>
0 голосов
/ 29 февраля 2012

Недавно я немного подумал о панировочных сухарях и придумал следующее - моя цель состояла в том, чтобы избежать повторения, связав компонент крошки с маршрутом. Так что, если у вас есть URL:

/blog/my-article

Тогда сначала будет найден заголовок крошки для этого URL, а затем:

/blog

Я настроил свои маршруты так:

Route::set('blog', 'blog')
    ->defaults(array(
        'controller' => 'blog',
        'action'     => 'index',
        'breadcrumb' => 'Blog'
    )
);

Route::set('module_view', 'blog/<slug>')
    ->defaults(array(
        'controller' => 'module',
        'action'     => 'view',
        'breadcrumb' => function($params=null) {
            return ORM::factory('article')->where('slug', '=', $params['slug'])->find()->name;
        }
    )
);

Обратите внимание, что крошка может быть либо фиксированным текстом / значением, либо обратным вызовом, позволяющим генерировать его динамически.

Тогда в моем базовом контроллере у меня есть это:

protected function breadcrumb() {

    $breadcrumb = array();

    $uri = substr(Request::detect_uri(), 1);
    $routes = Route::all();
    while ($uri) { 
        foreach($routes as $name => $route) {
            if ($params = $route->matches($uri)) {
                /* @var $route Route */
                if (isset($params['breadcrumb'])) {
                    if (is_callable($params['breadcrumb'])) {
                        $name = $params['breadcrumb']($params);
                    } else {
                        $name = $params['breadcrumb'];
                    }
                    $breadcrumb[$name] =  URL::site($route->uri($params));

                };
                break;
            }
        }
        $uri = preg_replace('#(^|/)[^/]*/*?$#', '', $uri);
    }

    return array_reverse($breadcrumb);

}

Предупреждение: некоторые могут посчитать это довольно грязным, но это хорошо работает для меня.

...