从另一个视图/控制器请求使用它的控制器查看 - Kohana 3.2

时间:2012-02-29 10:04:16

标签: kohana breadcrumbs kohana-3.2

我有一个问题,我正在为一个网站制作面包屑...我对Kohana相对较新,所以我不确定我的方式是否正确。

我的所有页面都有正确的控制器工作正常,我需要在每个页面的顶部有一个面包屑,由于设计必须放在每个视图的顶部 - 这包括使用
<?=View::factory('elements/breadcrumb')?>

然而,这只包括实际视图,我想抓住它的控制器(以及通过控制器的模型),因为我需要弄清楚哪个页面已经打开并相应地更改了痕迹视图。

我一直在四处寻找并遇到HMVC,但我不确定这是如何运作的,或者它是否应该是我应该看的!

任何人都可以对此有所了解吗?

P.S。而不是只使用别人已经制作的模块,我很想知道如何正确地做到这一点 - 我很接近,我能感受到它!

2 个答案:

答案 0 :(得分:1)

为什么不在控制器中构建breadcrumbs数组并将该数据传递到视图中?

<?=View::factory('elements/breadcrumb', $breadcrumbs)?>

答案 1 :(得分:0)

我最近一直在思考面包屑并提出以下内容 - 我的目标是通过将面包屑组件与路线相关联来避免重复。所以如果你有网址:

/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;
        }
    )
);

注意,breadcrumb可以是固定的文本/值,也可以是允许动态生成的回调。

然后在我的基本控制器中,我有这个:

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);

}

警告:有些人可能认为这非常混乱,但它对我来说很有效。