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 객체 또는 부모 클래스의 어딘가에서 호출되지 않기 때문에 레코드가 데이터베이스에 저장 될 때 다른 트랜잭션이 사용되어이 트랜잭션이 망가지기 때문이라고 생각합니다.
아무도 내 거래가 작동하는 방법을 알고 있습니까?
당신의 아이디어는 트랜잭션과 try catch에서도 호출 된 부모 save()를 래핑하는 것입니다. $ db를 부모에게 건네지는 것은 아니고 부모 자체가 JTable 클래스에서 발생하는 업데이트 쿼리를 수행하지 않는다는 것을 명심하십시오. 당신이 할 수있는 일은 테이블 클래스에서 트랜잭션 지원을 포함하는 store() 메소드를 제공한다는 것입니다. – Elin
당신의 요지를 봅니다. 나는 그것을 시도하고 알릴 것이다. 문제는 Jtable 클래스의 이미지를 다루는 것은별로 의미가 없다는 것입니다. – Florian
업로드가 작동하지 않으면 레코드를 저장하지 않겠습니까? 이 경우 save() 전에 업로드를 수행합니다. – Elin