0

我正在将我们的公司网站迁移到 Magento,但遇到了产品图片的障碍。我们有 15k 种产品,其中 80% 是具有可配置父级的简单产品。我们支付了购物车转移费用,但新创建的产品在简单产品上没有显示图像。我必须在每个简单产品中设置它们,因为每个可配置的简单产品有 5 到 7 个与尺寸相关的简单产品,这将花费太长时间。

我希望使用 catalog_product_save_after 事件将与可配置相关联的图像写入其每个子级。

我的代码无法正常工作(我对 Magento 很陌生),如果有人能提供任何帮助,我将不胜感激。

Cden_Share.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Cden_Share>
            <active>true</active>
            <codePool>local</codePool>
        </Cden_Share>
    </modules>
</config>

配置文件

<config>
    <modules>
        <Cden_Share>
            <version>0.0.1</version>
        </Cden_Share>
            </modules>
    <adminhtml>
        <models>
                <cden_share>
                        <class>Cden_Share_Model</class>
                </cden_share>
        </models>
        <events>
            <catalog_product_save_after>
                <observers>
                    <cden_share>
                        <class>cden_share/observer</class>
                        <method>shareMainImages</method>
                        <type>singleton</type>
                    </cden_share>
                </observers>
            </catalog_product_save_after>     
        </events>
    </adminhtml>
</config>

最后是我的 Observer.php。我从 stackoverflow 上的一个答案中得到了这个代码,它是关于产品包的一个类似问题(Magento - 如何为产品包显示相同的图像?)。

<?php

class Cden_Share_Model_Observer
{
    public function shareMainImages(Varien_Event_Observer $observer)
    {

    $product = $observer->getEvent()->getProduct();         
if ($product->getTypeId() == "configurable")
      {
        $main_image = $product->getImage();
          if($main_image != "no_selection")

          {
                        $productTypeIns = $product->getTypeInstance(true);
                        $childIds = $productTypeIns->getChildrenIds($product->getId());
              $importDir = Mage::getBaseDir('media') . DS . 'catalog/product';
                            foreach ($childIds as $childId) 
                {
                foreach($childId as $_childId) 
                  {
                    $childProduct = Mage::getModel('catalog/product')->load($_childId); 
                      if ($childProduct->getImage()=="no_selection")
                      {
                        $childProduct->addImageToMediaGallery($importDir.$main_image,array ('image','small_image','thumbnail'),false,false);
                        $childProduct->save();
                    }           
                }
            }
        }
            }
        }
 }
?>

感谢您提供的任何帮助。

4

1 回答 1

2

看看你的错误信息

Warning: include(Mage/Cden/Share/Model/Observer.php): failed to open stream

Magento 的自动加载器正在尝试从Mage包中加载您的类文件。这通常表明它找不到模型的基类名称cden_share/observer。也就是说,Magento 尝试实例化观察者类

$observer = Mage::getMode('cden_share/observer');

并且在您的配置中找不到cden_share模型组节点。看看你的配置,看起来你有这个节点,但它在错误的地方。

<config>
    <global>
        <models>
            <cden_share>
                <class>Cden_Share_Model</class>
            </cden_share>
        </models>        
    </global>
    <adminhtml>
        <!-- ... -->
    </adminhtml>        
</config>

<models/>节点属于<global/>.

如果您仍然遇到问题,在更改配置后,在以下位置进行一些临时调试应该会告诉您为什么 Magento 找不到它正在寻找的配置节点。

于 2013-08-23T17:10:49.367 回答