在网站上打印面包屑的最优雅方式是什么?

时间:2014-03-19 20:48:26

标签: breadcrumbs

我已经考虑了很长时间了。创建面包屑的最佳或最优雅的方法是什么?

一种方法是从控制器调用方法。像这样:

function showUsers()
{
    $this->breadcrumbs->add('Users', URL::route('admin.users'));
    // ...
}

我个人不喜欢这种方式,因为我想将面包屑逻辑与控制器分开。另外,如果我想要,例如对于控制器内的许多页面都有一个Admin Panel -item,我需要在构造函数或每个控制器方法中定义它。

另一种方法是利用命名路线,将它们分成几段。这显然要求路线以某种方式明智地命名和构造。这是一些伪代码:

if($segment[0] == 'admin') {
    $breadcrumbs->add('Admin Panel', URL::route('admin');
    if($segment[1] == 'users') {
        $breadcrumbs->add('Users', URL::route('admin.users');
    } elseif($segment[1] == 'foo') {
        $breadcrumbs->add(...);
    }
}

这种方法的一个问题是很难获得数据"关于当前的路线。例如,我可以有一个显示单个用户(admin.users.single)的路由,该路由获取路由中的用户ID(例如admin/users/{id})。我没有为nativecrumb项构造正确的URL的本地方法,因为路由数据仅在控制器内使用。

你能想到其他方法吗?关于这些例子的意见?

1 个答案:

答案 0 :(得分:0)

使其更通用,而不是在控制器中对用户和用户名等具有条件语句。我认为最好先定义某种类别的层次结构或树。在您的后端存储该信息取决于您(即db,text file,nosql):

+--------------+--------------+---------------------+------------+
|  CategoryId  | CategoryName | CategoryDisplayName | ParentId   |
+--------------+--------------+---------------------+------------+
|      1       | admin        |  Admin Panel        | NULL       |
+--------------+--------------+---------------------+------------+
|      2       | admin.users  |  Users              | 1          |
+--------------+--------------+---------------------+------------+

您可以分离遍历类别和构建面包屑字符串的逻辑。这更容易理解,测试等。

即。用c#

您可以根据该数据检索面包屑列表:

IEnumerable<Category> GetHierarchy(string categoryName) {
  ...
}

即。 GetHierarchy("Users")将返回列表&#34;管理员面板&#34;,&#34;用户&#34;

然后构建breadcrumb字符串:

var currentPage = "admin.users"
strings.Join(">", GetHierarchy(currentPage)
                   .Select(c => GetLink(c.categoryName, c.categoryDisplayName)))

您可以使用帮助程序将其嵌入到视图中,或者只是从控制器中设置它。

GetLink方法将返回包含该类别路由的链接。 即

<a href="admin/users">Users</a>