我一直在安静地花些时间弄清楚它是如何工作的 - 所以我想在这里问一下这个问题。
我知道如何在router.php的帮助下在Joomla中自定义URL - 至少我是这么认为的。创建像这样的东西很简单
domain.com/country/id
示例:
domain.com/germany/12
然而,你不会知道id代表一个城市。所以在这个例子中我们假设id为12的城市是柏林。
因此,对于我的自定义组件(名为:countries),我希望显示以下内容:
for view = countries(1st level)
domain.com/country
即:
domain.com/germany
for view = city(2nd level)
domain.com/country/city-id
即:
domain.com/country/berlin-12
(或者只是:domain.com/country/berlin - 但我认为ID是自定义组件工作所必需的 - 以及页面上任何读取ID以知道该做什么的相关模块)
到目前为止我有什么:
function CountriesBuildRoute(&$query)
{
$segments = array();
//if(isset($query['view'])) {
// $segments[] = $query['view'];
// unset( $query['view'] );
//}
if (isset($query['task'])) {
$segments[] = implode('/',explode('.',$query['task']));
unset($query['task']);
}
if (isset($query['id'])) {
$segments[] = $query['id'];
unset($query['id']);
}
if (isset($query['name'])) {
$segments[] = $query['name'];
unset($query['name']);
}
unset( $query['view'] );
return $segments;
}
function CountriesParseRoute( $segments )
{
$vars = array();
$app =& JFactory::getApplication();
$menu =& $app->getMenu();
$item =& $menu->getActive();
// Count segments
$count = count( $segments );
//Handle View and Identifier
switch( $item->query['view'] )
{
case 'countries':
if($count == 1) {
$vars['view'] = 'city';
}
break;
case 'city':
$id = explode( ':', $segments[$count-2] );
$name = explode( ':', $segments[$count-1] );
$vars['id'] = $id[0].'-'.$name;
break;
}
return $vars;
}
我从查看国家/地区调用城市网页的方式如下:
<a href="<?php echo JRoute::_('index.php?option=com_countries&view=city&id=' . (int)$item->id) .'&name='. $item->city_name; ?>">
如果有人可以提供帮助,那会很棒!干杯
答案 0 :(得分:0)
如果你想从网址获取ID,你必须添加每个国家/地区菜单项或创建将在数据库中搜索项目ID的rooter(大型网站的坏主意)。这还需要将您的主页设置为您的某个组件视图。最简单的方法。
构建路由器时,需要两个功能。首先返回SEF网址CountriesBuildRoute
,第二个将SEF网址翻译回查询CountriesParseRoute
。你实际上认为在这个级别编写SEF比较困难。我不会给你写整个路由器但只指向正确的方向。
在Joomla 1.5中,你想要的更容易。如果你有时间从一些Joomla 1.5组件(com_weblinks)查看rooter。 CountriesBuildRoute
返回将构建您的网址的数组。例如,当您返回$query
数组时,如下所示:array('country','berlin')
网址将如您所愿:domain.com/country/berlin
。但是逆转这个过程(你会在CountriesParseRoute
中做的事情)会变得更难。你必须检查第一段是否是一个国家(如果第二段应该是城市)。
因此,在函数CountriesBuildRoute
中,检查传递的视图,并直接构建$segments
数组,就像您想要的网址或选定视图一样。请记住,该数组中的单个元素将是URL中的单个元素。
在函数CountriesParseRoute
中检查第一个数组元素是否为国家(数据库检查,缓存国家/地区列表,有很多方法可以执行此操作),那么您必须对数组中的第二个元素执行相同的操作(如果是存在)。
我总是先按照自己的意愿创建BuildRoute。然后花费数小时来制作解析路线,尽可能精确有效。如果你想做好路由器,你可以花上几个小时甚至几天。