Создание пользовательских URL-адресов в Magento

В настоящее время я пытаюсь создать собственные URL-адреса/маршрутизацию с помощью magento, в настоящее время я установил маршрут по умолчанию в config.xml в локальном модуле.

<frontend>
 <routers>
         <portfolios>
             <use>standard</use>
             <args>
                 <module>Custom_Portfolios</module>
                 <frontName>portfolios</frontName>
             </args>
         </portfolios>
     </routers>
     <default>
         <router>portfolios</router>
     </default>
 </frontend>

В настоящее время это работает с URL-адресом /portfolios/index/action/custom-string, который является маршрутом magento по умолчанию. Чего я пытаюсь добиться, так это иметь /portfolios/custom-string.html. Я безуспешно пытался использовать правило mod_rewrite, я нашел несколько ссылок в отношении использования пользовательского суффикса .html, который я добавил в тот же файл config.xml.

<default><portfolios><seo><portfolios_url_suffix>.html</portfolios_url_suffix></seo></portfolios></default>

Я просмотрел документы Алана Шторма в отношении маршрутизации и обнаружил, что они относятся только к путям маршрутизации по умолчанию, или информация немного устарела.

Знаете ли вы лучший способ управления маршрутизацией в magento, возможно, с помощью простого и соответствующего руководства? если да, поделитесь :D много


person Ryan    schedule 11.11.2010    source источник


Ответы (3)


Это можно сделать с помощью перезаписи URL. На самом деле найденная вами конфигурация суффикса, вероятно, используется Mage_Catalog для создания своих наборов перезаписей. Я подхожу к этой конкретной функции впервые, поэтому этот фрагмент следует воспринимать с долей скептицизма...

// Creating a rewrite
/* @var $rewrite Mage_Core_Model_Url_Rewrite */
$rewrite = Mage::getModel('core/url_rewrite');
$rewrite->setStoreId($store_id)
        ->setIdPath('portfolios/'.$url_key)
        ->setRequestPath('portfolios/'.$url_key.'.html')
        ->setTargetPath('portfolios/index/action/id/'.$url_key)
        ->setIsSystem(true)
        ->save();

Для каждого возможного пути требуется новая перезапись.

Изменить. Я добавил setIdPath, потому что это может быть необходимо.

person clockworkgeek    schedule 11.11.2010
comment
Я буду исследовать это дальше, знаете ли вы лучший способ сослаться на него из маршрута в xml, иначе я получу сообщение об ошибке 404? - person Ryan; 11.11.2010
comment
Извините, я не понимаю вопроса. - person clockworkgeek; 11.11.2010
comment
когда я нажимаю на ports/blah.html, он в настоящее время перенаправляется на страницу с ошибкой 404, я предполагаю, что это связано с тем, что маршрутизация не существует и, как таковая, вызывает проблему, знаете ли вы, где мне нужно было бы ссылаться на этот код как на метод в файле xml или мне нужно будет запустить этот код только один раз? - person Ryan; 11.11.2010
comment
Вам нужно будет запустить это только один раз для каждого URL-адреса. После этого вы можете подтвердить его существование, заглянув в Каталог › Управление перезаписью URL. Убедитесь, что целевой путь - это именно то, что вы хотите. Я добавил id, потому что я не знаю, как вы обрабатываете параметры, типичным использованием будет id. - person clockworkgeek; 11.11.2010
comment
После того, как мой мозг включился, я понял, как внедрить эту систему, большое спасибо за ваше решение. - person Ryan; 12.11.2010
comment
Я искал этот ответ в любом месте. Наконец, вы дали это отличное решение. Большое спасибо, часы. - person Gowri; 19.12.2011
comment
привет, я также в situation для выполнения этой же задачи сейчас. пожалуйста, не могли бы вы сказать мне, где добавить этот код па? в файле контроллера? @часокворкгик - person DRAJI; 23.10.2013
comment
@DRAJI вам нужно сохранить один из этих объектов перезаписи для каждого URL-адреса, который нужен вашим данным. Обычно это означает создание перезаписи при сохранении объекта. Вот как работают продукты: когда Mage_Catalog_Model_Product сохраняется, он также обновляет свою релевантную перезапись. - person clockworkgeek; 23.10.2013

Код ниже не тестировался, но должен работать

Если вы не хотите определять пользовательскую перезапись для каждого элемента портфолио, просто выполните следующие действия:

  1. Напишите свой собственный класс маршрутизатора, расширенный из Mage_Core_Controller_Varien_Router_Standard, и реализуйте метод match:

    public function match(Zend_Controller_Request_Http $request)
    {
        $path = explode('/', trim($request->getPathInfo(), '/'));
        // If path doesn't match your module requirements
        if (count($path) > 2 && $path[0] != 'portfolios') {
            return false; 
        }
        // Define initial values for controller initialization
        $module = $path[0];
        $realModule = 'Custom_Portfolios';
        $controller = 'index';
        $action = 'action';
        $controllerClassName = $this->_validateControllerClassName(
            $realModule, 
            $controller
        );            
        // If controller was not found
        if (!$controllerClassName) {
            return false; 
        }            
        // Instantiate controller class
        $controllerInstance = Mage::getControllerInstance(
            $controllerClassName, 
            $request, 
            $this->getFront()->getResponse()
        );
        // If action is not found
        if (!$controllerInstance->hasAction($action)) { 
            return false; // 
        }            
        // Set request data
        $request->setModuleName($module);
        $request->setControllerName($controller);
        $request->setActionName($action);
        $request->setControllerModule($realModule);            
        // Set your custom request parameter
        $request->setParam('url_path', $path[1]);
        // dispatch action
        $request->setDispatched(true);
        $controllerInstance->dispatch($action);
        // Indicate that our route was dispatched
        return true;
    }
    
  2. Определите свой собственный маршрутизатор в config.xml:

    <stores>
        <default>
            <web>
                <routers>                               
                    <your_custom>
                        <area>frontend</area>
                        <class>Custom_Portfolios_Controller_Router_Custom</class>
                    </your_custom>
                </routers>
            </web>
        </default>
    </stores>
    
  3. Наслаждайтесь пользовательской маршрутизацией в Magento :)

person Ivan Chepurnyi    schedule 11.11.2010
comment
Я обнаружил, что приведенное выше решение работает для моих нужд, и поэтому не использовал это. Спасибо, что нашли время ответить на этот вопрос. - person Ryan; 12.11.2010
comment
И не забудьте указать имя маршрута для запроса - оно используется для дескриптора макета: $request->setRouteName('someRouteName') - person Roman Snitko; 08.12.2011

Самый простой способ (когда вам не нужно автоматически генерировать много URL-адресов) — использовать встроенный модуль перезаписи URL-адресов. Перейдите в панель администрирования -> Каталог -> Управление перезаписью URL и настройте любую перезаписи URL, которая вам нравится.

person Andrey Tserkus    schedule 11.11.2010
comment
Привет, я считаю, что это будет работать только тогда, когда URL-адрес известен без предварительного создания тысяч правил вручную. спасибо за ваш вклад, хотя. - person Ryan; 11.11.2010