2012-08-24 6 views
0

내가 이벤트에 대한 관찰자를 만들어"파일이 업로드되지 않았습니다"젠토 오류에도 파일은 특정 폴더

enter image description here

다음과 같이 내가 내 사용자 지정 탭에서 파일을 업로드하고있는 응용 프로그램을 만드는 중이라서 업로드됩니다 catalog_product_save_after이라고합니다. 특정 기능에서는 해당 파일을 카탈로그/제품 폴더에 업로드하고 오류없이 해당 폴더에 해당 파일을 업로드합니다.

하지만 특정 제품에 이미지를 할당하려고 할 때 다음 오류가 발생합니다.

내가 system.log을 선택하면 파일 E:\xampp\htdocs\magento\lib\Varien\File\Uploader.php on line 152에서 File was not uploaded는 내가 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(); 
    } 

내가 잘못 가고 어떤 제안을 다음과 같이

내 관찰자의 기능은 무엇입니까? 왜이 오류가 발생합니까? 내가

답변

1

젠토 1.7을 사용하고

나는 당신이 당신이 그것을 저장할 때 카탈로그/제품 개체를 업데이트 할 거라고 참조하십시오.

이벤트 catalog_product_save_after을 사용 중입니다.

은 관찰자의 내부에서, 당신은 전화 :

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

$ productData 카탈로그/제품 객체 인 -> 당신이 그것을 저장.

당신은 무슨 일이 일어날 지 추측 할 수 있습니다. 이벤트 catalog_product_save_after 등등이 계속 울리며 영원히 반복됩니다.

이 경우으로 전화를 걸었습니다. 그 이유는이 값이 저장되었으므로 값을 변경할 수 없기 때문입니다.

따라서 catalog_product_save_after을 사용하는 대신 catalog_product_save_before을 사용할 수 있습니다.

코드와 같지만 $productData->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; 
} 
+0

예 .. 같은 생각입니다. 아주 좋은 설명입니다. 고마워. – KuKu

관련 문제