如何在Prestashop 1.7中的自定义控制器中使用seo友好URL

时间:2018-09-05 17:55:04

标签: prestashop smarty prestashop-1.7

我在Prestashop 1.7.1.1安装中定义了一个自定义模块。

此模块定义了一个新的类别页面,其中添加了自定义功能和布局。

类别1034代表Foo Brand,并且可以通过以下两种方式访问​​:

https://www.example.com/module/categorypage/subcategory?id_category=1034

及其seo友好URL:

https://www.example.com/1034-foo-brand

但是,当使用最新版本时,显示的页面是第一页。

在浏览器中进行调试时,我可以看到Prestashop如何返回html 302代码,从而重定向到非seo友好的URL。

这是控制器的初始化功能。但是我无法继续继续或研究如何/寻找为该替代页面/控制器启用seo友好URL的方法:

  1. 是否将返回的seo友好URL合并到控制器中?
  2. 如果是这样,那么在哪里以及如何使用?
public function init()
{

    // Get category ID
    $id_category = (int)Tools::getValue('id_category');
    if (!$id_category || !Validate::isUnsignedId($id_category)) {
        $this->errors[] = Tools::displayError('Missing category ID');
    }

    $checkCategoryDepth = new Category($id_category, $this->context->language->id);

    $depth = $checkCategoryDepth->level_depth - 1;

    if ($depth > 2) {
        Tools::redirect($this->context->link->getCategoryLink($checkCategoryDepth->id, $checkCategoryDepth->link_rewrite));
    }

    if ($depth == 2) {
        $this->context->smarty->assign('selected_category_id', $checkCategoryDepth->id);
        $this->category = new Category($checkCategoryDepth->id_parent, $this->context->language->id);
    } else {
        $this->category = $checkCategoryDepth;
    }

    parent::init();

    // Check if the category is active and return 404 error if is disable.
    if (!$this->category->active) {
        header('HTTP/1.1 404 Not Found');
        header('Status: 404 Not Found');
    }

    // Check if category can be accessible by current customer and return 403 if not
    if (!$this->category->checkAccess($this->context->customer->id)) {
        header('HTTP/1.1 403 Forbidden');
        header('Status: 403 Forbidden');
        $this->errors[] = Tools::displayError('You do not have access to this category.');
        $this->customer_access = false;
    }
}

1 个答案:

答案 0 :(得分:1)

如果您将自己的模块与具有自己的控制器的新页面一起使用,则应在钩子moduleRoutes中的模块主类中定义友好的URL规则。因此,首先在install方法中的此挂钩中注册您的模块

public function install()
{
    return parent::install() && $this->registerHook('moduleRoutes');
}

然后确定如何构建您的URL

public function hookModuleRoutes()
{
    return array(
        'module-your_module-your_controller'  => array(
            'controller' => 'your_controller',
            'rule'       => 'some_short_url_you_want_to_have', // for example category/{id_category}/{rewrite}
            'keywords'   => array(
                'id_category' => array('regexp' => '[0-9]+', 'param' => 'id_category'),
                'rewrite'            => array('regexp' => '[_a-zA-Z0-9\pL\pS-]*')
            ), // here should be described everything what is used for rule
            'params'     => array(
                'fc'     => 'module',
                'module' => 'your_module',
            )
        )
    );
}

在进行了这些操作之后,您应该可以使用自己的网址了。