我有一个问题,我正在为一个网站制作面包屑...我对Kohana相对较新,所以我不确定我的方式是否正确。
我的所有页面都有正确的控制器工作正常,我需要在每个页面的顶部有一个面包屑,由于设计必须放在每个视图的顶部 - 这包括使用
<?=View::factory('elements/breadcrumb')?>
我一直在四处寻找并遇到HMVC,但我不确定这是如何运作的,或者它是否应该是我应该看的!
任何人都可以对此有所了解吗?
P.S。而不是只使用别人已经制作的模块,我很想知道如何正确地做到这一点 - 我很接近,我能感受到它!
答案 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);
}
警告:有些人可能认为这非常混乱,但它对我来说很有效。