2

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

这是我所拥有的一个例子:

  1. 产品 a、b 和 c 是相似的简单产品,每个产品都有自己的 url。
  2. 分组产品 z 具有与之关联的 a、b 和 c。
  3. a、b 和 c 的可见性更改为“单独不可见”。
  4. 访问产品 c 的旧链接会导致“404 Not Found”错误。

我希望第 4 步产生带有分组产品网址的“301 永久移动”。我知道我可以手动更改 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:

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

4

3 回答 3

1

尝试根据此站点重写控制器,但我认为您不必重写控制器。我建议你重写助手。

于 2012-12-07T15:17:35.490 回答
0

如果您的代码从核心工作,可能您没有使用成功的产品控制器进行扩展,请检查您的模块是否已加载,还要检查其他模块/扩展是否以某种方式未扩展与您要扩展的控制器相同的控制器。

于 2012-09-23T15:19:53.380 回答
0

您有 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。

所以我们能做的就是:rewrite /app/code/core/Mage/Catalog/Helper/Product.php and on function 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;
                }
            }
于 2015-02-13T13:48:11.997 回答