Joomla 2.5 - 根据文章ID生成URL

4

我正在尝试根据文章ID生成URL。

运行此查询后

SELECT a.sectionid,
CASE WHEN CHAR_LENGTH( a.alias )
THEN CONCAT_WS( ":", a.id, a.alias )
ELSE a.id
END AS slug,
CASE WHEN CHAR_LENGTH( cc.alias )
THEN CONCAT_WS( ":", cc.id, cc.alias )
ELSE cc.id
END AS catslug
FROM #__content AS a
INNER JOIN #__categories AS cc ON cc.id = a.catid
WHERE a.id = $articleID

我将结果存储在$data中,并以这种方式生成链接:

$link = JRoute::_(ContentHelperRoute::getArticleRoute($data[0]->slug, $data[0]->catslug, $data[0]->sectionid));

问题在于当我的文章不属于任何菜单时,生成的链接不正确。我注意到,当我的文章没有关联任何菜单时,API 获取“活动菜单 id”并将其添加到生成的链接中,参数为“&Itemid=MyActiveMenuId”(这发生在“route.php”文件中)。但由于文章不存在于活动菜单中,生成的链接将无法工作。
我知道,如果 API 只忽略“菜单项 id”,而不是获取“活动菜单 id”,它就会起作用,但我能在不更改 Joomla 代码的情况下做到这一点吗?此外,我希望在文章实际属于菜单的情况下继续考虑“菜单项 id”,以便生成的 URL 是 SEF。
有解决办法吗?还是每篇文章都必须属于一个菜单项?
我的 Joomla 版本是 2.5.13

你可以尝试强制使用itemid。无论如何,getArticleRoute的第三个参数是语言而不是sectionid(在Joomla 2.5中已被弃用并设置为0)。 - Riccardo Zorn
强制使用itemid将生成一个URL,但该URL将不是SEF。关于第三个参数,您是正确的,它是语言,但即使传递了正确的参数,URL问题仍将继续存在。 - Rafael
2个回答

2
如果您正在尝试根据文章 ID (在您的代码中为$articleID)生成 URL,则查询应该类似以下内容:
select id from #__menu where link='index.php?option=com_content&view=article&id=$articleID';

在这个例子中,我们假设您已经将结果存储在$menuID中,或者$hasMenuID===false。然后,您可以按以下方式确定输出URL:
if($hasMenuID===false) $outURL = "index.php?option=com_content&id=$articleID";
else $outURL = "index.php?option=com_content&itemid=$menuID";

如果你想要好的SEF友好URL,那么可以使用JRoute。此外,请不要忘记在初始查询之前将$articleID转换为整数。考虑SQL安全性等因素。

1
每篇文章不必链接到菜单才能正常工作。 您需要通过JRoute运行url以获取完整的url。
echo $id =JRequest::getVar('id');
$url = JRoute::_('index.php?option=com_content&view=article&id='.$id);

你可以使用.htaccess将一个url重定向到另一个url。 还有其他扩展程序可帮助您重定向到url。
对于其余的url,您需要知道您正在调用的组件 (像上面添加的选项一样,内容管理器始终是com_content) 和视图(对于文章是article)。 您可以通过检查/components/com_content/views/下的文件结构来查看可用于com_content的不同视图。 除了Article之外,您还应该看到articles、categories和category以及其他一些。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接