我为我们构建的CMS的各个部分设置了一个URL命名约定,并希望在您浏览它时构建一个痕迹路径。我遇到的问题是你不能简单地用反向链接(和大写单词)替换URL路径的各个部分; URL路径的每个部分都告诉CMS要执行的操作。我将尽力在这个空间中进行说明:
网址:
/news/list/item/1
会创建面包屑:
Home > News > General News (category ID=1)
并列出categoryID=1
所在的新闻帖子。
但同时URL:
/news/add/category
会创建面包屑:
Home > News > Add Category
网址:
/news/edit/item/25 (let's assume post 25 is in category 1)
会创建面包屑:
Home > News > General News > Edit Post (post ID=25)
并显示postID=25
进行编辑
所以你希望能看到我被绊倒的地方; “列表”“编辑”和“添加”基本上是你在CMS中移动时可以做的三件事(删除有点不同,如果有人好奇为什么我把它关掉了),但是面包屑不匹配URL级别的级别。因此,这不是简单地将URL路径解析为数组并基于各个部分创建面包屑的问题。
我希望我能够很好地解释这一点......这不是一个编码问题(虽然任何示例代码都会受到赞赏),而是一个关于如何处理这个问题的结构和策略的问题。此外,值得注意的是,URL的“新闻”部分将更改为CMS中安装的其他模块,每个模块都有一个单独的Module.class.php文件,其中存储了所有功能。
答案 0 :(得分:3)
您没有太多关于CMS设计的信息,例如:如何将请求构建为模块和操作。但是,只要您要求使用面包屑,那些通常只是一个链接列表。
如果将列表(数组)封装到类中,则可以使用请求实例化面包屑,而不是使应用程序的各个部分添加需要添加到其中的面包屑。
前端控制器可以添加主链接(Home
)。模块可以为索引操作添加模块链接(News
),然后特定操作可以添加适合的最后一个链接(General News
)。
他们只是在请求和工作完成时共享面包屑对象。
对于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', '/');
然后将面包屑注入依赖项或使用某些上下文将其提供给您拥有的不同模块/控制器。
您的应用程序越多或所需的功能越多,您可以扩展此结构(例如,接口,面包屑本身的具体类等),这仅用于演示基本概念。