2

カタログ内のいくつかの単純な製品をグループ化された製品に組み合わせています。現在の単純な製品ページから新しいグループ化された製品ページへの 301 リダイレクトを作成する必要があります。

これが私が持っているものの例です:

  1. 製品 a、b、および c は、それぞれ独自の URL を持つ同様の単純な製品です。
  2. グループ化された製品 z には、a、b、および c が関連付けられています。
  3. a、b、および c の可視性は、「個別に可視でない」に変更されます。
  4. 製品 c の古いリンクにアクセスすると、「404 Not Found」エラーが発生します。

ステップ 4 で、グループ化された製品の URL を含む「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:

「ローカル」バージョンではなく「コア」ファイルを変更すると、これは機能します。それがなぜなのかについてのアイデアはありますか?

4

3 に答える 3

1

このサイトに従ってコントローラを書き換えてみてください。ただし、コントローラを書き換える必要はないと思います。ヘルパーを書き直すことをお勧めします。

于 2012-12-07T15:17:35.490 に答える
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 を返します。

したがって、私たちができることは次/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;
                }
            }
于 2015-02-13T13:48:11.997 に答える
0

コードがコアから機能する場合は、成功した製品コントローラーで拡張しなかった可能性があります。モジュールがロードされているかどうかを確認し、他のモジュール/拡張機能が拡張したいコントローラーと同じコントローラーを拡張していないかどうかも確認してください。

于 2012-09-23T15:19:53.380 に答える