0

次のように、カスタムタブからファイルをアップロードするアプリケーションを作成しています。

ここに画像の説明を入力してください

と呼ばれるイベントのオブザーバーを作成しましたcatalog_product_save_after。特定の機能では、これらのファイルをカタログ/製品フォルダーにアップロードしており、エラーなしでそれらのフォルダーにアップロードされます。

しかし、それらの画像をその特定の製品に割り当てようとすると、次のエラーが発生しました。 File was not uploadedファイルでE:\xampp\htdocs\magento\lib\Varien\File\Uploader.php on line 152

チェックするsystem.logと、2012-08-24T11:33:15+00:00 ERR (3): User Error: Some transactions have not been committed or rolled back in E:\xampp\htdocs\magento\lib\Varien\Db\Adapter\Pdo\Mysql.php on line 3645このエラーが表示されます。

私のオブザーバー機能は次のとおりです

public function Savedata($observer)
    {
        $params     =   Mage::app()->getRequest()->getParams();

        $product    =   $observer->getEvent()->getProduct();

        $product_id =   $product->getId();


        $filesData  =   array();


        $keysData   =   array_keys($_FILES);


        foreach($keysData as $keys)
        {
            $uploader = new Varien_File_Uploader("$keys");
            $uploader->setAllowedExtensions(array('jpeg', 'jpg', 'png', 'tiff'));
            $uploader->setAllowRenameFiles(true);
            $uploader->setFilesDispersion(false);

            $path = Mage::getBaseDir('media') . DS  . "catalog" . DS . "product";

            if(!is_dir($path))
            {
                mkdir($path);
            }

            $extension  =   pathinfo($_FILES["$keys"]['name'], PATHINFO_EXTENSION);

            $date = new DateTime();

            $file_name                  =   $keys . "_" . $product_id . "." . $extension;

            $_FILES["$keys"]['name']    =   $file_name;

            $uploader->save($path, $_FILES["$keys"]['name']);
            $filesData[]    =   $path .DS. $_FILES["$keys"]['name'];
        }

        print_r($filesData);
        ///till this works file.. when i add following code, program dies. 

        try 
        {
            $productData = Mage::getModel('catalog/product')->load($product_id);

            print_r($productData->getData());


            foreach($filesData as $file)
            {
                $productData->addImageToMediaGallery($file, "image" ,false, false);
            }
            $productData->save();

            $productData = Mage::getModel('catalog/product')->load($product_id);

            print_r($productData->getData());
        }
        catch (Exception $e)
        {
            echo $e->getMessage() . "||" . $e->getCode() . "||" . $e->getFile() . "||" . $e->getLine();
        }


        exit();
    }

私が間違っているところに何か提案はありますか?なぜこのエラーが発生するのですか?

私はmagento1.7を使用しています

4

1 に答える 1

1

保存時にカタログ/製品オブジェクトを更新しようとしていることがわかりました。

イベントを使用していますcatalog_product_save_after

オブザーバー内で、次を呼び出します。

$productData = Mage::getModel('catalog/product')->load($product_id);
...
$productData->save();

$productData はカタログ/製品オブジェクトです -> 保存しました。

何が起こるかを推測することができ、それはイベントcatalog_product_save_afterなどをトリガーし、永久にループします。

$productData->save();このイベントでは値が保存されており、変更できないため、お電話いただいているようです。

したがって、 を使用する代わりに、 を使用catalog_product_save_afterできますcatalog_product_save_before

コードと同じですが、$productData->save();save が自動的に呼び出されるため削除します。

Mage_Core_Model_Abstract

public function save()
{
    /**
     * Direct deleted items to delete method
     */
    if ($this->isDeleted()) {
        return $this->delete();
    }
    if (!$this->_hasModelChanged()) {
        return $this;
    }
    $this->_getResource()->beginTransaction();
    $dataCommited = false;
    try {
        $this->_beforeSave();
        if ($this->_dataSaveAllowed) {
            //see this line below, it will call save, so you don't need to call save in your `catalog_product_save_before` (no looping forever)
            $this->_getResource()->save($this);
            $this->_afterSave();
        }
        $this->_getResource()->addCommitCallback(array($this, 'afterCommitCallback'))
            ->commit();
        $this->_hasDataChanges = false;
        $dataCommited = true;
    } catch (Exception $e) {
        $this->_getResource()->rollBack();
        $this->_hasDataChanges = true;
        throw $e;
    }
    if ($dataCommited) {
        $this->_afterSaveCommit();
    }
    return $this;
}
于 2012-08-24T18:06:58.710 に答える