Index: branches/5.2.x/core/units/images/image_event_handler.php =================================================================== diff -u -N -r14244 -r14628 --- branches/5.2.x/core/units/images/image_event_handler.php (.../image_event_handler.php) (revision 14244) +++ branches/5.2.x/core/units/images/image_event_handler.php (.../image_event_handler.php) (revision 14628) @@ -1,6 +1,6 @@ GetObject(); - switch ($type) - { - case 'before' : - if ($object->GetDBField('LocalImage')) - { - $object->SetDBField('Url', ''); - } - else - { - $object->SetDBField('LocalPath', ''); - } + $object =& $event->getObject(); + /* @var $object kDBItem */ - if ($object->GetDBField('LocalThumb')) - { - $object->SetDBField('ThumbUrl', ''); + if ( $event->Name == 'OnMassDelete' && $type == 'before' ) { + $ids = $event->getEventParam('ids'); + + $parent_info = $object->getLinkedInfo($event->Special); + + $sql = 'SELECT ImageId + FROM ' . $object->TableName . ' + WHERE DefaultImg = 1 AND ' . $parent_info['ForeignKey'] . ' = ' . $parent_info['ParentId']; + $primary_file_id = $this->Conn->GetOne($sql); + + if ( $primary_file_id ) { + $file_id_index = array_search($primary_file_id, $ids); + + if ( $file_id_index ) { + // allow deleting of primary product file, when there is another file to make primary + $sql = 'SELECT COUNT(*) + FROM ' . $object->TableName . ' + WHERE DefaultImg = 0 AND ' . $parent_info['ForeignKey'] . ' = ' . $parent_info['ParentId']; + $non_primary_file_count = $this->Conn->GetOne($sql); + + if ( $non_primary_file_count ) { + unset($ids[$file_id_index]); + } } - else - { - $object->SetDBField('ThumbPath', ''); - } + } - if ($object->GetDBField('SameImages')) - { + $event->setEventParam('ids', $ids); + } + + switch ( $type ) { + case 'before' : + // empty unused fields + $object->SetDBField($object->GetDBField('LocalImage') ? 'Url' : 'LocalPath', ''); + $object->SetDBField($object->GetDBField('LocalThumb') ? 'ThumbUrl' : 'ThumbPath', ''); + + if ( $object->GetDBField('SameImages') ) { $object->SetDBField('LocalImage', 1); $object->SetDBField('LocalPath', ''); $object->SetDBField('Url', ''); } break; - case 'after' : - if ($object->GetDBField('DefaultImg') ) - { - $sql = 'UPDATE '.$object->TableName.' SET DefaultImg=0 WHERE ResourceId='. - $object->GetDBField('ResourceId').' AND ImageId<>'. - $object->GetId(); - $res = $this->Conn->Query($sql); + + case 'after': + // make sure, that there is only one primary image for the item + if ( $object->GetDBField('DefaultImg') ) { + $sql = 'UPDATE ' . $object->TableName . ' + SET DefaultImg = 0 + WHERE ResourceId = ' . $object->GetDBField('ResourceId') . ' AND ImageId <> ' . $object->GetID(); + $this->Conn->Query($sql); } break; - default: } } - function ImageAction(&$event) + /** + * Performs temp-table related action on current image record + * + * @param kEvent $event + * @return void + * @access protected + */ + protected function ImageAction(&$event) { $id = $event->getEventParam('id'); @@ -194,114 +224,96 @@ return $new_name; } - /** - * Enter description here... + /** + * Sets primary image of user/category/category item * * @param kEvent $event + * @return void + * @access protected */ - function OnSetPrimary(&$event) + protected function OnSetPrimary(&$event) { $object =& $event->getObject(); + /* @var $object kDBItem */ + $object->SetDBField('DefaultImg', 1); $object->Update(); } /** - * Enter description here... + * Occurs before updating item * * @param kEvent $event + * @return void + * @access protected */ - function OnBeforeItemUpdate(&$event) + protected function OnBeforeItemUpdate(&$event) { - $object =& $event->getObject(); -// $parent_info = $object->getLinkedInfo(); - $id = $object->GetDBField('ResourceId'); -// $id = $parent_info['ParentId'] ? $parent_info['ParentId'] : $this->Application->GetVar('p_id'); - $sql = 'SELECT ImageId FROM '.$object->TableName.' WHERE ResourceId='.$id.' AND DefaultImg=1'; - if(!$this->Conn->GetOne($sql)) - { - $object->SetDBField('DefaultImg', 1); - } - if($object->GetDBField('DefaultImg') && $object->Validate()) - { + parent::OnBeforeItemUpdate($event); - $sql = 'UPDATE '.$object->TableName.' - SET DefaultImg = 0 - WHERE ResourceId = '.$id.' AND ImageId <> '.$object->GetDBField('ImageId'); - $this->Conn->Query($sql); - $object->SetDBField('Enabled', 1); - } + $this->processImageStatus($event); } - function OnAfterItemCreate(&$event) + /** + * Occurs after creating item + * + * @param kEvent $event + * @return void + * @access protected + */ + protected function OnAfterItemCreate(&$event) { - $event->CallSubEvent('OnBeforeItemUpdate'); + parent::OnAfterItemCreate($event); + + $this->processImageStatus($event); + $object =& $event->getObject(); + /* @var $object kDBItem */ + $object->Update(); } /** - * Deletes all selected items. - * Automatically recurse into sub-items using temp handler, and deletes sub-items - * by calling its Delete method if sub-item has AutoDelete set to true in its config file + * Occurs before item changed * * @param kEvent $event */ - function OnMassDelete(&$event) + function processImageStatus(&$event) { - if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { - $event->status = kEvent::erFAIL; - return; - } + $object =& $event->getObject(); + /* @var $object kDBItem */ - $event->status=kEvent::erSUCCESS; + $id = $object->GetDBField('ResourceId'); - $temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); + $sql = 'SELECT ImageId + FROM ' . $object->TableName . ' + WHERE ResourceId = ' . $id . ' AND DefaultImg = 1'; + $primary_image_id = $this->Conn->GetOne($sql); - $event->setEventParam('ids', $this->StoreSelectedIDs($event) ); - $this->customProcessing($event, 'before'); - $ids = $event->getEventParam('ids'); - - $object =& $event->getObject(); - $sql = 'SELECT ImageId FROM '.$object->TableName.' WHERE DefaultImg=1'; - $primary = $this->Conn->GetOne($sql); - if( $primary && ($key = array_search($primary, $ids)) ) - { - $sql = 'SELECT ImageId FROM '.$object->TableName.' WHERE DefaultImg=0'; - $res = $this->Conn->Query($sql); - if($res) - { - unset($ids[$key]); - } + if ( !$primary_image_id ) { + $object->SetDBField('DefaultImg', 1); } - if($ids) - { - $temp->DeleteItems($event->Prefix, $event->Special, $ids); + if ( $object->GetDBField('DefaultImg') && $object->Validate() ) { + $sql = 'UPDATE ' . $object->TableName . ' + SET DefaultImg = 0 + WHERE ResourceId = ' . $id . ' AND ImageId <> ' . $object->GetDBField('ImageId'); + $this->Conn->Query($sql); + + $object->SetDBField('Enabled', 1); } - $this->clearSelectedIDs($event); } - /*function OnAfterItemLoad(&$event) + /** + * Apply any custom changes to list's sql query + * + * @param kEvent $event + * @return void + * @access protected + * @see kDBEventHandler::OnListBuild() + */ + protected function SetCustomQuery(&$event) { - $object =& $event->getObject(); - - if ( $object->GetDBField('ThumbPath') || $object->GetDBField('SameImages') ) - { - // return local image or url - $path = $object->GetDBField('LocalThumb') ? PROTOCOL.SERVER_NAME.BASE_PATH.$object->GetDBField('ThumbPath') : $object->GetDBField('ThumbUrl'); - if ( $object->GetDBField('LocalThumb') && !file_exists(FULL_PATH.$object->GetDBField('ThumbPath')) ) $path = ''; - } - else { // if we need full which is not the same as thumb - $path = $object->GetDBField('LocalImage') ? PROTOCOL.SERVER_NAME.BASE_PATH.$object->GetDBField('LocalPath') : $object->GetDBField('Url'); - if ( $object->GetDBField('LocalImage') && !file_exists(FULL_PATH.$object->GetDBField('LocalPath')) ) $path = ''; - } - - $object->SetDBField('ImageUrl', $path); - }*/ - - function SetCustomQuery(&$event) - { parent::SetCustomQuery($event); $object =& $event->getObject();