1 октября 2009 г.

ЧПУ для тэгов в Magento

Задача - сделать ЧПУ адреса для тэгов, т.е. из /tag/product/list/tagId/253/ сделать /tag/weight-loss. Думаю другого способа, кроме реврайтов, нет, поэтому будем создавать по реврайту на тэг. А т.к. модуль, создающий реврайты, у нас уже есть (Blogrewrite, он делает реврайты для блоговых адресов), то вместо создания нового модуля воспользуемся существующим. В будущем надо бы сделать отдельный модуль, если можно - даже перехватывать создание нового тэга и автоматически делать реврайт. Но сейчас лениво :)

Контроллер

Итак, добавляем новую кнопку на страницу модуля Blogrewrite, которая будет создавать/обновлять реврайты для тэгов. Соответственно, добавляем новое действие в контроллер Blogrewrite:
<?php

class Mage_Blogrewrite_Adminhtml_BlogrewriteController extends Mage_Adminhtml_Controller_Action {
    ...
    public function maketagrewritesAction() {
    ...
    }
}
?>
Действие очень простое - нужно перебрать все тэги и на каждый создать реврайт. Для этого будем использовать модель tag/tag:
// Load all approved tags
$model = Mage::getModel('tag/tag');
$collection = $model->getResourceCollection()
    ->addStatusFilter($model->getApprovedStatus())
    ->addStoreFilter(Mage::app()->getStore()->getId())
    ->load();
Получили коллекцию тэгов, утверждённых, и относящихся к текущему магазину. Дальше перебираем эту коллекцию и обновляем реврайты:
foreach ($collection as $_tag) {
    $tagId = $_tag->getId();

    $idPath = "tag/$tagId";
    $requestPath = 'tag/' . Slugify($_tag->getName());
    $targetPath = "tag/product/list/tagId/$tagId";

    $this->_makeRewrite($idPath, $requestPath, $targetPath);
}
Наверное я плохо искал, но я не увидел как сделать slug адреса с помощью Magento. Поэтому я написал свою функцию, которую вынес в index.php. Она нам ещё пригодится для шаблонов.
function Slugify($url) {
    // remove all non-alphanumeric characters except for spaces and hyphens
    $res = preg_replace('/[^a-z0-9- ]/', '', strtolower($url));

    // remove double spaces and substitute the spaces with hyphens
    $res = str_replace(' ', '-', str_replace('  ', ' ', $res));

    return $res;
}
Готово. Теперь что бы создать реврайты для тэгов нужно зайти в админку, на странцу модуля Blogrewrite, и нажать кнопку Make Tag Rewrites.

Шаблоны

Теперь адреса вида /tag/weight-loss обработаются нормально, только вот они пока нигде не используются. Нужно поправить шаблоны, которые выводят тэги. Это файлы cloud.phtml, list.phtml и popular.phtml в папке app\design\frontend\default\sunnyD\template\tag\. Вывод адреса тэга имеет такой вид:
<a href="<?php echo $_tag->getTaggedProductsUrl() ?>"><?php echo $this->htmlEscape($_tag->getName()) ?></a>
Нам нужно заменить вызов функции getTaggedProductsUrl на свой код:
<a href="<?php print trim(Mage::getBaseUrl(), '/') . '/tag/' . Slugify($_tag->getName()) ?>"><?php echo $this->htmlEscape($_tag->getName()) ?></a>
Готово! :) Реврайты созданы и работают, шаблоны выводят ЧПУ.

Комментариев нет:

Отправить комментарий