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 获取active menu id并添加到生成的链接中,即参数"&Itemid=MyActiveMenuId"(这发生在route.php文件中)。但由于该文章不存在于活动菜单中,因此生成的链接将不起作用。

我知道如果 API 只是忽略“项目菜单 ID”而不是获取“活动菜单 ID”它会起作用,但我可以在不更改 Joomla 代码的情况下做到这一点吗?另外,我希望在文章实际属于菜单的情况下继续考虑“项目菜单 ID”,因此生成的 URL 将是 SEF。

有什么办法可以解决这个问题?还是每篇文章都必须属于一个菜单项?

我的 Joomla 版本是 2.5.13

4

2 回答 2

2

如果您尝试根据文章 ID($articleID在您的代码中)生成 URL,您的查询应该类似于以下内容:

select id from #__menu where link='index.php?option=com_content&view=article&id=$articleID';

对于此示例,我们假设您将结果存储在$menuID或 that 中$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 安全等等。

于 2013-12-30T14:46:19.630 回答
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)和视图(对于文章来说是文章)。您可以通过检查 /components/com_content/views/ 下的文件结构来查看可用于 com_content 的不同视图。除了文章,您应该看到文章、类别和类别以及其他一些。

于 2014-01-06T05:25:55.747 回答