joomla 自定义组件的高级 url sef

Posted

技术标签:

【中文标题】joomla 自定义组件的高级 url sef【英文标题】:Advance url sef for joomla custom component 【发布时间】:2014-04-02 17:00:02 【问题描述】:

您好,我搜索了房子,但没有解决方案...

我在joomla3上开发了一个组件

joomla sef 组件的地址是这样的:

orginal address: domain.com/index.php?option=com_bahaedini&keyword=22&year=2005&month=1&day=4

带菜单:domain.com/menu_name/view_name/keyword/2005/1/4

没有菜单:domain.com/component/bahaedini/view_name/keyword/2005/1/4

我最喜欢的域名是:domain.com/keyword/2005/1/4

但至少如何删除 URL 中的“view_name”或“component/bahaedini”?

我可以通过 hatccess 删除它,但我无法将参数发送到组件...

我希望至少有以下格式之一:

domain.com/keyword/2005/1/4
domain.com/menu_name/keyword/2005/1/4

domain.com/view_name/keyword/2005/1/4
domain.com/bahaedini/keyword/2005/1/4



<?php
defined('_JEXEC') or die ;


//http://127.0.0.1/archives?option=com_bahaedini&view=items&date=2014-12-9
function BahaediniBuildRoute(&$query)

       $segments = array();
       if(isset($query['view']))
       
                $segments[] = $query['view'];
                unset( $query['view'] );
       

       if(isset($query['keyword']))
       
                $segments[] = $query['keyword'];
                unset( $query['keyword'] );
       

       if(isset($query['year']))
       
                $segments[] = $query['year'];
                unset( $query['year'] );
       
       if(isset($query['month']))
       
                $segments[] = $query['month'];
                unset( $query['month'] );
       
       if(isset($query['day']))
       
                $segments[] = $query['day'];
                unset( $query['day'] );
       


       return $segments;


//http://127.0.0.1/archives?option=com_bahaedini&view=items&date=2014-12-9
function BahaediniParseRoute($segments)

       $vars = array();


       switch($segments[0])
       

               case 'items':
                       $vars['view'] = 'items';

                       if(isset($segments[2]))
                       
                       $year = explode( ':', $segments[2] );
                       $vars['year'] =  (int)$year[0];
                       

                       if(isset($segments[3]))
                       
                       $month = explode( ':', $segments[3] );
                       $vars['month'] = (int)$month[0]; 
                       

                       if(isset($segments[4]))
                       
                       $day = explode( ':', $segments[4] );
                       $vars['day'] = (int)$day[0]; 
                       

                       if(isset($segments[1]))
                       
                       $search = explode( ':', $segments[1] );
                       $vars['keyword'] = (int)$search[0]; 
                       

                       break; 


       
       return $vars;
?>

【问题讨论】:

您必须拥有组件,因为您无法控制关键字或 bahaedini 是用作菜单别名还是其他组件中的别名,因此组件是一个保留字,可防止出现两个通过制作组件/bahaedini 具有相同 url 的页面。您应该做的是创建一个菜单项,并为您的组件编写一个自定义路由器,这样您就没有视图名称。 感谢您的回答。可以给我更多信息吗?...我用 router.php 代码编辑了我的问题...如何更改它以隐藏视图名称? 【参考方案1】:

任何设置为$segments 的内容都会出现在网址中。所以这个$segments[] = $query['view']; 将视图添加到 url。由于你的解析器会自动设置视图,所以仍然在构建函数中取消设置视图,但不要将其推送到$segments

function BahaediniBuildRoute(&$query)

   $segments = array();
   if(isset($query['view']))
   
            unset( $query['view'] );
   
   ...

当然,你可能需要调整你的解析器,因为现在段的数量会不同,所以你需要不同的索引值。

【讨论】:

太棒了...谢谢....我理解 $segments 规则,并且通过 ParseRoute 函数的一些更改,我可以解决我的问题...:)

以上是关于joomla 自定义组件的高级 url sef的主要内容,如果未能解决你的问题,请参考以下文章

使 Joomla 组件与 SEF/SEO 兼容

Joomla 2.5 高级参数

Joomla home 丢失了组件的 sef 别名

在 Joomla 3 中向组件添加带有自定义 url 参数的菜单类型

在 joomla 组件中传递获取变量

Joomla - 创建自定义重写规则