301将简单产品重定向到Magento中的分组父级

时间:2012-07-11 18:59:39

标签: magento magento-1.6

我将目录中的一些简单产品与分组产品相结合。我需要从当前的简单产品页面创建301重定向到新的分组产品页面。

以下是我的例子:

  1. 产品a,b和c是类似的简单产品,每个产品都有 他们自己的网址。
  2. 分组产品z有a,b和c关联。
  3. a,b和c的可见性更改为“不可单独显示。”
  4. 访问产品c的旧链接会导致“404 Not Found”错误。
  5. 我希望第4步使用分组的产品网址生成“301 Moved Permanently”。我知道我可以手动更改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:

    如果我修改“核心”文件而不是“本地”版本,则可行。关于为什么会这样的想法?

3 个答案:

答案 0 :(得分:1)

尝试根据this site重写控制器,但我认为你不必重写控制器。我建议你改写帮手。

答案 1 :(得分:0)

如果您的代码在核心工作,也许您没有使用成功的产品控制器进行扩展,请检查您的模块是否已加载,同时检查其他模块/扩展是否与您想要扩展的控制器不同。

答案 2 :(得分:0)

您有两种选择: 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>

和Observer中的代码:

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))

添加使用与上面相同的代码,因为它正常工作。

$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;
                }
            }