关于如何在CMS中为动态内容构建面包屑路径的建议


Suggestions on how to build a breadcrumb trail for dynamic content in a CMS

对于我们构建的CMS的各个部分,我有一个URL命名约定,并且希望在您浏览它时构建一个breadcrumb踪迹。我遇到的问题是,你不能简单地用反向链接(和大写单词)替换URL路径的部分;URL路径的每个部分都告诉CMS要执行什么操作。我将尽我所能在这个空间里说明:

URL:

/news/list/item/1

将创建breadcrumb:

Home > News > General News (category ID=1)

并列出categoryID=1

但同时URL:

/news/add/category

将创建breadcrumb:

Home > News > Add Category

和URL:

/news/edit/item/25 (let's assume post 25 is in category 1)

将创建breadcrumb:

Home > News > General News > Edit Post (post ID=25)

和显示postID=25编辑

希望你们能看到我哪里出错了;"列表"、"编辑"answers"添加"基本上是您在CMS中移动时可以做的三件事(删除的方式略有不同,以防有人好奇我为什么省略了这一点),但是面包屑不匹配URL。因此,这不是简单地将URL路径解析为数组并基于各个部分创建breadcrumb的问题。

我希望我能解释得足够好…这不是一个编码问题(尽管任何示例代码都将受到赞赏),而是一个关于如何实现这一目标的结构和策略的问题。此外,值得注意的是,URL的"news"部分将更改为CMS中安装的其他模块,每个模块都有一个单独的Module.class.php文件,其中存储了它们的所有函数。

您还没有分享太多关于CMS的设计,例如您如何将请求结构为模块和操作。然而,只要你想要一个面包屑,那些通常只是一个链接列表。

如果你将一个列表(数组)封装到一个类中,你可以用请求实例化面包屑,然后让应用程序的各个部分添加他们需要添加的面包屑。

前端控制器可以添加home link (Home)。模块可以为索引操作(News)添加模块链接,然后特定操作可以根据需要添加最后一个链接(General News)。

它们都只是与请求和完成的工作共享breadcrumb对象。

这是一个MVC类型的应用程序,我认为它很容易采用任何类型的设计。

class BreadcrumbTrail
{
    private $breadcrumbs = array();
    public function add($label, $link)
    {
        $this->breadcrumbs[] = array($label, $link);
    }
    public function toArray()
    {
        return $this->breadcrumbs;
    }
}

$breadcrumbs = new BreadcrumbTrail();
$breadcrumbs->add('Home', '/');

将breadcrumb作为依赖项注入,或者使用一些上下文将其提供给不同的模块/控制器。

当你的应用程序越来越大或者你需要更多的功能时,你可以扩展这个结构(例如接口,为breadcrumb本身创建一个具体的类等),这只是为了演示基本的思想