joomla - 获取产品名称时路由器更改URL

时间:2017-05-15 07:21:54

标签: joomla

我已经在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

1 个答案:

答案 0 :(得分:0)

您没有名为“krakow”的产品?

如果没有,你可以尝试从构建函数中删除$ productName,只是为了检查这个“krakow”是自动添加还是来自getProductName()函数。

另外我注意到你在函数getProductName()

中有一个错误
->where('#__s4edu_product.product_id = ' . $productId)

应该是

->where('#__component_product.product_id = ' . $productId)