对于我们构建的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本身创建一个具体的类等),这只是为了演示基本的思想