Проблема с дружественным URL в фронтальном модуле - Prestashop - PullRequest
0 голосов
/ 18 июня 2020

Я создаю внешний модуль для веб-сайта, который использует опцию 301 Moved Permanently в конфигурации SEO и URL-адресов. Wesbite использует Prestashop 1.6.1.9.

В модуле я определяю маршрут следующим образом:

public static $ModuleRoutes = array(
    'module-aacategories-viewmapping-mapping' => array(
        'controller' => 'viewmapping',
        'rule' => 'mappings{/:tree}',
        'keywords' => array(
            'tree' =>        array('regexp' => '[/_a-zA-Z0-9-\pL]*', 'param' => 'tree'),
        ),
        'params' => array(
            'fc' => 'module',
            'module' => 'aacategories',
        )
    )
);

В адресной строке браузера, когда я ввожу:

site.local / en / mappings / test-map / first-test

Я получаю:

Используйте вместо этого следующий URL:

site.local / en / index. php? controller = viewmapping & tree = test-map% 2Ffirst-test & module = aacategories

Эта последняя ссылка дает 404. Однако, когда я добавляю &fc=module к url, он переходит на желаемую страницу.

Проблемы:

1- Как заставить маршрутизацию Prestashop добавлять &fc=module в конце?

2- Как сохранить удобный URL-адрес в адресной строке и не будет перенаправлен?

Примечание: когда я меняю конфигурацию в SEO и URL-адресах на no redirection, он работает. Но это не та конфигурация, которая требуется в продукте.

Ваша помощь очень ценится. Заранее спасибо.

1 Ответ

1 голос
/ 19 июня 2020

Проблема в том, что вы устанавливаете свойство publi c $php_self в контроллере вашего модуля.

Необходимо удалить свойство, чтобы основной фронт-контроллер не выполнял каноническое перенаправление.

Код, который делает это, находится в FrontController.php строке 378.

if (!empty($this->page_name)) {
    $page_name = $this->page_name;
} elseif (!empty($this->php_self)) {
    $page_name = $this->php_self;
} elseif (Tools::getValue('fc') == 'module' && $module_name != '' && (Module::getInstanceByName($module_name) instanceof PaymentModule)) {
    $page_name = 'module-payment-submit';
}
// @retrocompatibility Are we in a module ?
elseif (preg_match('#^'.preg_quote($this->context->shop->physical_uri, '#').'modules/([a-zA-Z0-9_-]+?)/(.*)$#', $_SERVER['REQUEST_URI'], $m)) {
    $page_name = 'module-'.$m[1].'-'.str_replace(array('.php', '/'), array('', '-'), $m[2]);
} else {
    $page_name = Dispatcher::getInstance()->getController();
    $page_name = (preg_match('/^[0-9]/', $page_name) ? 'page_'.$page_name : $page_name);
}

А затем выполняет каноническое перенаправление, если вы устанавливаете это свойство в строке 401.

if (!empty($this->php_self) && !Tools::getValue('ajax')) {
    $this->canonicalRedirection($this->context->link->getPageLink($this->php_self, $this->ssl, $this->context->language->id));
}
...