我有自定义的Joomla(v1.5)组件,目前正在使用组件的路由器。问题是我无法从SEF网址中删除ID号。我明白了:
http://myaddress.com/componentalias/17-city-alias/130-item-alias
我想得到什么:
http://myaddress.com/componentalias/city-alias/item-alias
看看下面的router.php方法:
function ComponentnameBuildRoute(&$query) {
$segments = array();
if(isset($query['city_id'])){
$segments[] = $query['city_id'];
unset($query['city_id']);
}
if(isset($query['item_id'])){
$segments[] = $query['item_id'];
unset($query['item_id']);
}
if(isset($query['task'])){
switch($query['task']){
case 'pay':
$segments[] = JText::_('payment');
unset($query['task']);
break;
}
}
unset($query['view']);
return $segments;
}
/*
* Function to convert a SEF URL back to a system URL
*/
function ComponentnameParseRoute($segments) {
$var = array();
if(isset($segments[0])){
$cityData = explode(':',$segments[0]);
if(isset($cityData[0])){
$vars['city_id'] = $cityData[0];
}
}
if(isset($segments[1])){
$itemData = explode(':',$segments[1]);
if(isset($itemData[0])){
$vars['item_id'] = $itemData[0];
}
}
if(isset($segments[2])){
switch($segments[2]){
case JText::_('payment'):
$vars['task'] = 'pay';
break;
}
}
return $vars;
}
有什么想法吗?感谢您的帮助。
答案 0 :(得分:3)
开始使用router.php
文件的最佳位置是reading this article(它有点过时但仍然很好),然后查看com_content的router.php
文件(components/com_content/router.php
)。您会注意到文章确实达到了您想要的最佳状态,可以查看工作代码并从中获得。
更长的答案:
如果存在直接指向该项目的菜单项,则只能删除内容元素路径中的项目ID变量,否则无法找到该项目。
< / LI>Joomla中的SEF网址! 1.5等是由各个元素的别名
例如。如果我有这个菜单结构:
Recipes (The menu)
-- Seafood (<-- Category blog where category alias is `seafood` )
-- Grilled Snapper (<-- Recipe Item where item alias is `grilled-snapper` )
-- 'Other category' (<-- Another Category blog )
如果您正在为配方构建SEF URL,则可以通过获取网站菜单$menu = &JSite::getMenu();
并比较查询{{1}来查找可能显示的菜单项来构建路径。在传入的id
数组中的id
值的当前菜单项中。
如果匹配,则可以使用菜单路径和配方别名中的别名来构建段。 (并在$query
方法中颠倒过程。)
因此,从上面的示例中,您可以为Grilled Snapper配方构建一个SEF URL,其类似于:ParseRoute($segments)
。
现在说你还有另一个配方(例如'Garlic Prawns'别名大蒜虾),它没有直接链接到菜单,但会显示在“海鲜”类别博客页面中。在这种情况下,您最终会得到recipes/seafood/grilled-snapper
如果您没有匹配项(例如 Garlic Prawns ),如果您的组件具有类别博客等列表视图或我们的示例配方类别页面,您可以建立部分匹配...基本上在这种情况下,您查看当前菜单项并确定它是否是包含内容项的列表/类别视图。
如果是,则类别/列表视图的路径形成初始段,但由于该文章没有菜单项,您仍然必须使用URL的最后一个元素中的项目ID。 / p>
当内容项直接链接(例如来自文章,模块或搜索结果)并且没有指向它或可能包含它的菜单项时,您仍然可以创建一个没有id的URL但是你将以直接组件访问URL的形式提供路径。
例如。 recipes/seafood/2:garlic-prawns
其中/component/recipes/recipe/ice-cream-sundae
是组件的名称,recipes
是视图,recipe
是文章的别名。