【问题标题】:What is the most elegant way to print breadcrumbs on a website?在网站上打印面包屑的最优雅方式是什么?
【发布时间】:2014-04-26 09:35:18
【问题描述】:

我已经考虑这个问题很久了。创建面包屑的最佳或最优雅的方法是什么?

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

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

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

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

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})。我无法为面包屑项目构建正确的 URL,因为路由数据仅在控制器内部使用。

你能想到其他方法吗?对这些例子有何看法?

【问题讨论】:

    标签: breadcrumbs


    【解决方案1】:

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

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

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

    即用c#

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

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

    GetHierarchy("Users") 将返回列表“管理面板”、“用户”

    然后构建面包屑串:

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

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

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

    &lt;a href="admin/users"&gt;Users&lt;/a&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多