我在Joomla 1.5网站上有一个简单的菜单层级:
[Newsletters] -> [publisher A] -> [Newsletter A1]
-> [Newsletter A2]
-> [publisher B] -> [Newsletter B1]
-> [Newsletter B2]
使用菜单项或面包屑导航此层次结构时,sef url与预期一致;
/newsletters/pubA.html
/newsletters/pubA/letterA1.html
/newsletters/pubA/letterA2.html
/newsletters/pubB.html
/newsletters/pubB/letterAB.html
/newsletters/pubB/letterAB.html
但是,当使用页面内的链接导航层次结构时,url会被弄乱。请继续阅读以了解更多详细信息:)
页面由组件生成。我已经实现了一个jrouter来生成sef url,在sef打开的情况下,我可以使用菜单项和标准的breadcrumb来正确地导航层次结构。
但是,我也希望通过页面本身的链接导航(例如,通过链接到发布者页面上的所有发布者新闻稿,或通过从新闻稿页面链接回发布者页面)。从出版商到时事通讯,这很管用。组件调用
JRoute::_('index.php?option=' . $option . '&view=newsletter&newsletterid=' . $newsletterId );
并(正确)生成如下URL:
/newsletters/pubA/letterA1.html
但是,当用户在新闻稿页面上并希望返回到发布者页面时,就会出错。出于某种原因,发布者的别名会添加到url中新闻稿的别名之后,就好像它位于层次结构中新闻稿的下面一样。组件调用
JRoute::_('index.php?option=' . $option . '&view=publisher&publisherid=' . $publisherId );
但这(错误地)生成了一个url,如下所示:
/newsletters/pubA/letterA1/pubA.html
如果我从上面的url再次导航到新闻稿,则url变为
/newsletters/pubA/letterA1/letterA1.html
/newsletters/pubA/letterA1/pubA.html
/newsletters/pubA/letterA1/letterA1.html
/newsletters/pubA/letterA1/pubA.html
(即,深度不超过一段或两段“错误”。)
另外,请注意,导航确实有效(也就是说,打开了正确的页面)——只是URL看起来很奇怪。
我不知道如何生成如顶部所示的预期url;似乎没有办法指定“相对于”第一个段应该是什么。我应该用某种方式访问jsite::getrouter()吗?
路由器代码相当直截了当。这是我第一次写路由器,所以我可能弄糟了一些东西。我确实怀疑parseroute只被一个段调用。
function ComponentBuildRoute(&$query)
{
$segments = array();
if (isset($query['view']))
{
if (isset($query['newsletterid']))
{
$alias = { figure out newsletter alias from newsletter id }
$segments[] = $alias;
unset($query['newsletterid']);
}
else if (isset($query['publisherid']))
{
$alias = { figure out publisher alias from publisher id }
$segments[] = $alias;
unset($query['publisherid']);
}
unset($query['view']);
}
return $segments;
}
function ComponentParseRoute($segments)
{
$vars = array();
$id = { try to retrieve newsletter id matching alias in $segments[0] }
if (!empty($id))
{
$vars['view'] = 'newsletter';
$vars['newsletterid'] = $id;
return $vars;
}
$id = { try to retrieve publisher id matching alias in $segments[0] }
if (!empty($id))
{
$vars['view'] = 'publisher';
$vars['publisherid'] = $id;
return $vars;
}
return $vars;
}
我不想使用绝对URL,因为发布者的菜单项位于“新闻稿”菜单下…显然,必须有一种方法来做到这一点,因为菜单项和面包屑模块都发现了这一点……
谢谢
最佳答案
组件BuildRoute有问题。在处理publisherID的else if块中,取消设置新闻稿ID。我不确定这是否是问题所在,但修复它将是解决这个问题的第一步。