301 Перенаправление простых продуктов в сгруппированные родительские элементы в Magento

Я объединяю некоторые простые продукты в нашем каталоге в сгруппированные продукты. Мне нужно создать переадресацию 301 с текущих простых страниц продукта на новую сгруппированную страницу продукта.

Вот пример того, что у меня есть:

  1. Товары a, b и c – это похожие простые товары, у каждого из которых есть собственный URL.
  2. Сгруппированный продукт z имеет связанные с ним a, b и c.
  3. Видимость для a, b и c изменена на «невидима по отдельности».
  4. Посещение старой ссылки для продукта c приводит к ошибке «404 Not Found».

Я хочу, чтобы на шаге 4 отображалось сообщение «301 перемещено навсегда» с URL-адресом сгруппированного продукта. Я знаю, что могу изменить записи в списке перезаписи URL-адресов вручную, но я ищу более автоматизированный подход.

Может ли кто-нибудь помочь указать мне правильное направление?

ОБНОВЛЕНИЕ:

Я обновил файл app/code/local/Mage/Catalog/controllers/ProductController.php следующим образом:

protected function _initProduct()
    {
        $categoryId = (int) $this->getRequest()->getParam('category', false);
        $productId  = (int) $this->getRequest()->getParam('id');

        $params = new Varien_Object();
        $params->setCategoryId($categoryId);

        $parentIds = Mage::getModel('catalog/product_type_grouped')->getParentIdsByChild($productId);
        if(isset($parentIds[0])){
          $parent = Mage::getModel('catalog/product')->load($parentIds[0]);
          die($parent->getProductUrl());
        }

        return Mage::helper('catalog/product')->initProduct($productId, $this, $params);
    }

Я бы ожидал, что это убьет любой простой просмотр страницы продукта, но это не так. Похоже, что контроллер продукта не вызывается для продуктов, установленных как невидимые. Это правильно?

ОБНОВЛЕНИЕ 2:

Если я изменю «основной» файл вместо «локальной» версии, это сработает. Любые идеи о том, почему это так?


person iJeep    schedule 11.07.2012    source источник


Ответы (3)


Попробуйте переписать контроллер в соответствии с этим сайтом, но я этого не делаю. не думаю, что вам нужно переписать контроллер. Я предлагаю вам переписать helper.

person Yuri    schedule 07.12.2012
comment
Ваш ответ состоит в основном из ссылки. Хотя теоретически это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. - person Fred; 07.12.2012
comment
Я думаю, что это может быть хорошим направлением, но я не уверен, что это позволит мне перенаправлять простые запросы продукта на сгруппированный родительский элемент, если он существует. - person iJeep; 10.12.2012

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

person Moldovan Daniel    schedule 23.09.2012

У вас есть 2 варианта: 1.) если ваши продукты, которые являются частью сгруппированных, не имеют настройки видимости «Не видны по отдельности» (простые или загружаемые), вы можете следовать этому руководству, в котором используется шаблон наблюдателя, и он работает.magento-grouped-product-redirect-tutorial Суть такова:

используйте это событие:

<events>
            <catalog_controller_product_init_after>
                <observers>
                    <company_catalog>
                        <class>company_catalog/observer</class>
                        <method>redirectGrouped</method>
                    </company_catalog>
                </observers>
            </catalog_controller_product_init_after>
        </events>

и этот код внутри вашего наблюдателя:

public function redirectGrouped(Varien_Event_Observer $observer)
    {
        $product = $observer->getEvent()->getProduct();
        $groupedTypeInstance = Mage::getModel('catalog/product_type_grouped');
        $parentIds = $groupedTypeInstance->getParentIdsByChild($product->getId());

        foreach ($parentIds as $parentId) {
            $parent = Mage::getModel('catalog/product')->load($parentId);
            if ($parent
                && $parent instanceof Mage_Catalog_Model_Product
                && $parent->getTypeId() == 'grouped'
            ) {
                $redirect = Mage::getStoreConfig(
                    'catalog/grouped_options/redirect_enabled',
                    Mage::app()->getStore()->getId()
                );
                if ($redirect) {
                    Mage::app()->getResponse()->setRedirect($parent->getProductUrl());
                }
                break;
            }
        }
    }

2.) если у вас есть продукты с видимостью «Не видны по отдельности», как у меня, вы заметите, что вышеуказанное решение не работает. К сожалению, Magento проверяет видимость прямо перед событием, которое мы используем, и возвращает false.

Итак, что мы можем сделать, так это: переписать /app/code/core/Mage/Catalog/Helper/Product.php и функцию public function initProduct($productId, $controller, $params = null)

сразу после проверки : if (!$this->canShow($product))

add используйте тот же код, что и выше, так как он работает правильно.

$groupedTypeInstance = Mage::getModel('catalog/product_type_grouped');
            $parentIds = $groupedTypeInstance->getParentIdsByChild($product->getId());

            foreach ($parentIds as $parentId) {
                $parent = Mage::getModel('catalog/product')->load($parentId);
                if ($parent
                    && $parent instanceof Mage_Catalog_Model_Product
                    && $parent->getTypeId() == 'grouped'
                ) {
                    $redirect = Mage::getStoreConfig(
                        'catalog/grouped_options/redirect_enabled',
                        Mage::app()->getStore()->getId()
                    );
                    if ($redirect) {
                        Mage::app()->getResponse()->setRedirect($parent->getProductUrl());
                    }
                    break;
                }
            }
person vbak    schedule 13.02.2015