Как использовать SEO дружественные URL-адреса в пользовательском контроллере в Prestashop 1.7 - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть пользовательский модуль, определенный в установке 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 и, следовательно, перенаправляет на URL, не относящийся к seo.

Это функция инициализации контроллера. Но я не могу продолжать или исследовать, что мне делать / искать, чтобы разрешить использование 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 голосов
/ 07 сентября 2018

Если вы используете свой собственный модуль с новой страницей, которая имеет собственный контроллер, вы должны определить дружественные правила URL в главном классе вашего модуля в хуке moduleRoutes. Итак, сначала зарегистрируйте ваш модуль в этом хуке в методе установки

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',
            )
        )
    );
}

и после этих манипуляций ваши URL должны работать.

...