我已经在joomla中构建了自己的组件,客户端现在想要一个友好的网址f.e website.com/someplace/{product-id}-{product-name}。所以我像这样构建自己的路由器。
function componentBuildRoute(&$query)
{
$segments = [];
if (isset($query['view'])) {
$segments[] = "szkolenie";
unset($query['view']);
}
if (isset($query['product_id'])) {
$productName = JFilterOutput::stringURLSafe(strtolower(getProductName($query['product_id'])));
$newName = $query['product_id'] . '-' . $productName;
$segments[] = $newName;
unset($query['product_id']);
}
return $segments;
}
并解析路由功能
function componentParseRoute($segments)
{
$app = JFactory::getApplication();
$menu = $app->getMenu();
$item =& $menu->getActive();
$count = count($segments);
switch ($item->query['view']) {
case 'catalogue' : {
$view = 'training';
$id = $segments[1];
}
break;
}
$data = [
'view' => $view,
'product_id' => $id
];
return $data;
}
虽然在buildroute函数段结束时还可以,但我在解析路径的开头就有了我想要的东西我有类似的东西 website.com/szkolenie/1-krakow< - 我不知道wtf是这个克拉科夫(我知道这是波兰的城市),但它仍然来自哪里? getProductName函数实现是
function getProductName($productId)
{
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('#__component_training.id as id, #__component_product' . name)
->from($db->quoteName('#__component_training'))
->where('#__s4edu_product.product_id = ' . $productId)
->leftJoin('#__component_product ON
#__component_training.product_id=#__component_product.product_id');
$training = $db->loadObject();
return trim($training->name);
}
所以考虑到所有这些因素我认为buildRoute和parseRoute之间发生了一些事情,过滤了$ segment [1]变量,但是如何禁用它以及它为什么会发生?
P.S 请不要把我发给https://docs.joomla.org/Joomla_Routes_%26_SEF 我已经知道joomla网站上包含sef的所有教程。
P.S.S
它基于joomla 3.7.0
答案 0 :(得分:0)
您没有名为“krakow”的产品?
如果没有,你可以尝试从构建函数中删除$ productName,只是为了检查这个“krakow”是自动添加还是来自getProductName()函数。
另外我注意到你在函数getProductName()
中有一个错误->where('#__s4edu_product.product_id = ' . $productId)
应该是
->where('#__component_product.product_id = ' . $productId)