2014-06-19 3 views
0

Joomla 3.x 용 달력 구성 요소를 개발 중입니다. 나는 MySQL을 사용한다 5.5.32데이터베이스 트랜잭션이 JModelAdmin에서 롤백되지 않습니다 - Joomla 3.x

백엔드에는 데이터베이스에 이벤트 데이터를 저장하고 이미지를 업로드하는 양식이있다.

이미지를 처리하려면 JModelAdmin을 확장하고 저장 함수를 재정의하십시오.

public function save($data) 
{ 
    [...] 

    $db = $this->getDbo(); 

    try 
    { 
    $db->transactionStart(); 

    // Move uploaded image in correct folder 
    if($image = FileUtility::preprocessJFormFile('image', '/images/aftevents/')) 
    { 
     $fileExtension = JFile::getExt($image); 
     // register the image extension to be saved in the database 
     $data['image_ext'] = $fileExtension; 
    } 


    if (parent::save($data)) 
    { 

     // Rename image with event id 
     if($image) 
     { 

     $id = $data['id'] ? $data['id'] : $this->getState($this->getName().'.id', 0); 

     if(!$id) 
     { 
      throw new Exception('COM_AFTEVENTS_EXCEPTION_NO_ID', 1502); 
     } 

     $finalImage = JPATH_ROOT.'/images/aftevents/'. $id .'.'. $fileExtension; 

     JFile::move($image, $finalImage); 

     // Create thumbnails 
     $params = JComponentHelper::getParams('com_aftevents'); 
     $params->toArray(); 
     $IEWidth = $params['image_event_width']; 
     $IEHeight = $params['image_event_height']; 
     $ICWidth = $params['calendar_image_event_width']; 
     $ICHeight = $params['calendar_image_event_height']; 

     $jimage = new JImage($finalImage); 
     $thumbs = $jimage->createThumbs(array($IEWidth.'x'.$IEHeight, $ICWidth.'x'.$ICHeight), 5); 
     } 

     $db->transactionCommit(); 
     return true; 
    } 

    } 
    catch (Exception $e) 
    { 
     // catch any database errors. 
     $db->transactionRollback(); 

     $this->setError($e->getMessage()); 
     return false; 
    } 

    return false; 
} 

이제 트랜잭션이 작동하지 않습니다. 예외가 발견되면 데이터베이스의 삽입이 롤백되지 않습니다.

트랜잭션 지시 사항과 데이터베이스 삽입이 동일한 JDatabaseDriver 객체 또는 부모 클래스의 어딘가에서 호출되지 않기 때문에 레코드가 데이터베이스에 저장 될 때 다른 트랜잭션이 사용되어이 트랜잭션이 망가지기 때문이라고 생각합니다.

아무도 내 거래가 작동하는 방법을 알고 있습니까?

+0

당신의 아이디어는 트랜잭션과 try catch에서도 호출 된 부모 save()를 래핑하는 것입니다. $ db를 부모에게 건네지는 것은 아니고 부모 자체가 JTable 클래스에서 발생하는 업데이트 쿼리를 수행하지 않는다는 것을 명심하십시오. 당신이 할 수있는 일은 테이블 클래스에서 트랜잭션 지원을 포함하는 store() 메소드를 제공한다는 것입니다. – Elin

+0

당신의 요지를 봅니다. 나는 그것을 시도하고 알릴 것이다. 문제는 Jtable 클래스의 이미지를 다루는 것은별로 의미가 없다는 것입니다. – Florian

+0

업로드가 작동하지 않으면 레코드를 저장하지 않겠습니까? 이 경우 save() 전에 업로드를 수행합니다. – Elin

답변

0

트랜잭션은 InnoDB과 같은 트랜잭션 인식 스토리지 엔진에서만 사용할 수 있습니다. 모든 핵심 Joomla 테이블은 InnoDB를 사용하지만 타사 확장은 그렇지 않을 수도 있습니다. 트랜잭션을 사용하기 전에 이것을 점검하십시오.

테이블 스토리지 엔진을 InnoDb로 변경하십시오.

관련 문제