1

我为网站制作的面包屑有点问题...我对 Kohana 比较陌生,所以我不确定我的处理方式是否正确。

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

但是,这仅包括实际视图,我想获取它的控制器(并通过控制器进行模型),因为我需要确定在哪个页面上并相应地更改面包屑视图。

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

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

PS,而不是仅仅使用其他人已经制作的模块,我很想了解如何正确地做到这一点 - 我很接近,我能感觉到!

4

2 回答 2

1

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

<?=View::factory('elements/breadcrumb', $breadcrumbs)?>
于 2012-02-29T13:19:02.960 回答
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;
        }
    )
);

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

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

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

}

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

于 2012-02-29T13:50:16.710 回答