mImageId = (int)$pImageId;
$this->mContentId = (int)$pContentId;
$this->registerContentType(
FISHEYEIMAGE_CONTENT_TYPE_GUID, array( 'content_type_guid' => FISHEYEIMAGE_CONTENT_TYPE_GUID,
'content_description' => 'Image',
'handler_class' => 'FisheyeImage',
'handler_package' => 'fisheye',
'handler_file' => 'FisheyeImage.php',
'maintainer_url' => 'http://www.bitweaver.org'
));
// Permission setup
$this->mViewContentPerm = 'p_fisheye_view';
$this->mEditContentPerm = 'p_fisheye_edit';
$this->mAdminContentPerm = 'p_fisheye_admin';
}
function lookup( $pLookupHash ) {
global $gBitDb;
$ret = NULL;
$lookupContentId = NULL;
if (!empty($pLookupHash['image_id']) && is_numeric($pLookupHash['image_id'])) {
if( $lookup = $gBitDb->getRow( "SELECT lc.`content_id`, lc.`content_type_guid` FROM `".BIT_DB_PREFIX."fisheye_image` fi INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON(lc.`content_id`=fi.`content_id`) WHERE `image_id`=?", array( $pLookupHash['image_id'] ) ) ) {
$lookupContentId = $lookup['content_id'];
$lookupContentGuid = $lookup['content_type_guid'];
}
} elseif (!empty($pLookupHash['content_id']) && is_numeric($pLookupHash['content_id'])) {
$lookupContentId = $pLookupHash['content_id'];
$lookupContentGuid = NULL;
}
if( BitBase::verifyId( $lookupContentId ) ) {
$ret = LibertyBase::getLibertyObject( $lookupContentId, $lookupContentGuid );
}
return $ret;
}
function load( $pPluginParams = NULL ) {
if( $this->isValid() ) {
global $gBitSystem;
$gateSql = NULL;
$selectSql = $joinSql = $whereSql = '';
$bindVars = array();
if ( @$this->verifyId( $this->mImageId ) ) {
$whereSql = " WHERE fi.`image_id` = ?";
$bindVars[] = $this->mImageId;
} elseif ( @$this->verifyId( $this->mContentId ) ) {
$whereSql = " WHERE fi.`content_id` = ?";
$bindVars[] = $this->mContentId;
}
$this->getServicesSql( 'content_load_sql_function', $selectSql, $joinSql, $whereSql, $bindVars );
$sql = "SELECT fi.*, lc.* $gateSql $selectSql
, uue.`login` AS `modifier_user`, uue.`real_name` AS `modifier_real_name`
, uuc.`login` AS `creator_user`, uuc.`real_name` AS `creator_real_name`, ufm.`favorite_content_id` AS `is_favorite`
, lch.`hits`
FROM `".BIT_DB_PREFIX."fisheye_image` fi
INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON (lc.`content_id` = fi.`content_id`)
LEFT JOIN `".BIT_DB_PREFIX."users_users` uue ON (uue.`user_id` = lc.`modifier_user_id`)
LEFT JOIN `".BIT_DB_PREFIX."users_users` uuc ON (uuc.`user_id` = lc.`user_id`)
LEFT JOIN `".BIT_DB_PREFIX."users_favorites_map` ufm ON (ufm.`favorite_content_id`=lc.`content_id` AND ufm.`user_id`=uuc.`user_id`)
LEFT OUTER JOIN `".BIT_DB_PREFIX."liberty_content_hits` lch ON ( lch.`content_id` = lc.`content_id` ) $joinSql
$whereSql";
if( $this->mInfo = $this->mDb->getRow( $sql, array( $bindVars ) ) ) {
$this->mImageId = $this->mInfo['image_id'];
$this->mContentId = $this->mInfo['content_id'];
$this->mInfo['creator'] = (isset( $this->mInfo['creator_real_name'] ) ? $this->mInfo['creator_real_name'] : $this->mInfo['creator_user'] );
$this->mInfo['editor'] = (isset( $this->mInfo['modifier_real_name'] ) ? $this->mInfo['modifier_real_name'] : $this->mInfo['modifier_user'] );
if( $gBitSystem->isPackageActive( 'gatekeeper' ) && !@$this->verifyId( $this->mInfo['security_id'] ) ) {
// check to see if this image is in a protected gallery
// this burns an extra select but avoids an big and gnarly LEFT JOIN sequence that may be hard to optimize on all DB's
$query = "SELECT ls.* FROM `".BIT_DB_PREFIX."fisheye_gallery_image_map` fgim
INNER JOIN `".BIT_DB_PREFIX."gatekeeper_security_map` tsm ON(fgim.`gallery_content_id`=tsm.`content_id` )
INNER JOIN `".BIT_DB_PREFIX."gatekeeper_security` ls ON(tsm.`security_id`=ls.`security_id` )
WHERE fgim.`item_content_id`=?";
$grs = $this->mDb->query($query, array( $this->mContentId ) );
if( $grs && $grs->RecordCount() ) {
// order matters here
$this->mInfo = array_merge( $grs->fields, $this->mInfo );
}
}
$this->mInfo['title'] = $this->getTitle();
$this->mInfo['display_url'] = $this->getDisplayUrl();
// LibertyMime will load the attachment details
LibertyMime::load( NULL, $pPluginParams );
// parse the data after parent load so we have our html prefs
$this->mInfo['parsed_data'] = $this->parseData();
// copy mStorage to mInfo for easy access
// Duplicate copy to mInfo['image_file'] for legacy tpl's
if( !empty( $this->mStorage ) && count( $this->mStorage ) > 0 ) {
reset( $this->mStorage );
$this->mInfo = array_merge( current( $this->mStorage ), $this->mInfo );
$this->mInfo['image_file'] = current($this->mStorage);
} else {
$this->mInfo['image_file'] = NULL;
}
}
} else {
// We don't have an image_id or a content_id so there is no way to know what to load
return NULL;
}
return count($this->mInfo);
}
function exportHtml( $pData = NULL ) {
// if( empty( $pData ) ) {
// $pData = $this->mInfo['data'];
// }
// $ret = FisheyeBase::parseData( $pData );
// $ret .= '
';
$ret = NULL;
// make sure we have a valid image file.
if( $this->isValid() && ($details = $this->getImageDetails() ) ) {
if( $this->mInfo['width'] != $details['width'] || $this->mInfo['height'] != $details['height'] ) {
// if our data got out of sync with the database, force an update
$query = "UPDATE `".BIT_DB_PREFIX."fisheye_image` SET `width`=?, `height`=? WHERE `content_id`=?";
$this->mDb->query( $query, array( $details['width'], $details['height'], $this->mContentId ) );
$this->mInfo['width'] = $details['width'];
$this->mInfo['height'] = $details['height'];
}
$ret = array( 'type' => $this->getContentType(),
'landscape' => $this->isLandscape(),
'url' => $this->getDisplayUrl(),
'content_id' => $this->mContentId,
'title' => $this->getTitle(),
'has_description' => !empty( $this->mInfo['data'] ),
'is_favorite' => $this->getField('is_favorite'),
);
}
return $ret;
}
function isLandscape() {
return( !empty( $this->mInfo['width'] ) && !empty( $this->mInfo['height'] ) && ($this->mInfo['width'] > $this->mInfo['height']) );
}
function verifyImageData(&$pStorageHash) {
$pStorageHash['content_type_guid'] = $this->getContentType();
if ( empty($pStorageHash['purge_from_galleries']) ) {
$pStorageHash['purge_from_galleries'] = FALSE;
}
if( !empty( $pStorageHash['resize'] ) ) {
$pStorageHash['_files_override'][0]['max_height'] = $pStorageHash['_files_override'][0]['max_width'] = $pStorageHash['resize'];
}
// let's add a default title
if( empty( $pStorageHash['title'] ) && !empty( $pStorageHash['_files_override'][0]['name'] ) ) {
$pStorageHash['title'] = file_name_to_title( $pStorageHash['_files_override'][0]['name'] );
}
// Make sure we know what to update
if( $this->isValid() ) {
// these 2 entries will inform LibertyContent and LibertyMime that this is an update
$pStorageHash['content_id'] = $this->mContentId;
$pStorageHash['_files_override'][0]['attachment_id'] = $this->mInfo['attachment_id'];
}
return (count($this->mErrors) == 0);
}
function store(&$pStorageHash) {
global $gBitSystem, $gLibertySystem;
if ($this->verifyImageData($pStorageHash)) {
// Save the current attachment ID for the image attached to this FisheyeImage so we can
// delete it after saving the new one
if (!empty($this->mInfo['attachment_id']) && !empty($pStorageHash['_files_override'][0])) {
$currentImageAttachmentId = $this->mInfo['attachment_id'];
$pStorageHash['attachment_id'] = $currentImageAttachmentId;
} else {
$currentImageAttachmentId = NULL;
}
// LibertyMime will take care of thumbnail generation of the offline thumbnailer is not active
if( !empty( $pStorageHash['_files_override'][0] ) ) {
$pStorageHash['_files_override'][0]['thumbnail'] = !$gBitSystem->isFeatureActive( 'liberty_offline_thumbnailer' );
}
// we have already done all the permission checking needed for this user to upload an image
$pStorageHash['no_perm_check'] = TRUE;
if( LibertyMime::store( $pStorageHash ) ) {
if( $currentImageAttachmentId && $currentImageAttachmentId != $this->mInfo['attachment_id'] ) {
$this->expungeAttachment($currentImageAttachmentId);
}
// get storage format back from LibertyMime
$this->mContentId = $pStorageHash['content_id'];
$this->mInfo['content_id'] = $this->mContentId;
if ( isset($pStorageHash['storage_guid']) && !empty($pStorageHash['STORAGE'][$pStorageHash['storage_guid']]['_files_override'][0]['source_file'])) {
$imageDetails = $this->getImageDetails($pStorageHash['STORAGE'][$pStorageHash['storage_guid']]['_files_override'][0]['source_file']);
} else {
$imageDetails = NULL;
}
if (!$imageDetails) {
$imageDetails['width'] = (!empty($this->mInfo['width']) ? $this->mInfo['width'] : NULL);
$imageDetails['height'] = (!empty($this->mInfo['height']) ? $this->mInfo['height'] : NULL);
}
if ($this->imageExistsInDatabase()) {
$sql = "UPDATE `".BIT_DB_PREFIX."fisheye_image`
SET `content_id` = ?, `width` = ?, `height` = ?
WHERE `image_id` = ?";
$bindVars = array($this->mContentId, $imageDetails['width'], $imageDetails['height'], $this->mImageId);
} else {
$this->mImageId = defined( 'LINKED_ATTACHMENTS' ) ? $this->mContentId : $this->mDb->GenID('fisheye_image_id_seq');
$this->mInfo['image_id'] = $this->mImageId;
$sql = "INSERT INTO `".BIT_DB_PREFIX."fisheye_image` (`image_id`, `content_id`, `width`, `height`) VALUES (?,?,?,?)";
$bindVars = array($this->mImageId, $this->mContentId, $imageDetails['width'], $imageDetails['height']);
}
$rs = $this->mDb->query($sql, $bindVars);
// check to see if we need offline thumbnailing
if( $gBitSystem->isFeatureActive( 'liberty_offline_thumbnailer' ) ) {
$resize = !empty( $pStorageHash['resize'] ) ? (int)$pStorageHash['resize'] : NULL;
$this->generateThumbnails( $resize );
} else {
if( !empty( $pStorageHash['resize'] ) && is_numeric( $pStorageHash['resize'] ) ) {
$this->resizeOriginal( $pStorageHash['resize'] );
}
}
}
} else {
$this->mErrors[] = "There were errors while attempting to save this gallery image";
}
return (count($this->mErrors) == 0);
}
function getExifField( $pExifField ) {
$ret = NULL;
if( function_exists( 'exif_read_data' ) ) {
$pExifField = strtolower( $pExifField );
$file = $this->getSourceFile();
// only attempt to get exif data from jpg or tiff files - chokes otherwise
if( empty( $this->mExif ) && preg_match( "!\.(jpe?g|tif{1,2})$!", $file ) ) {
$this->mExif = array_change_key_case( @exif_read_data( $file ), CASE_LOWER );
}
if( !empty( $this->mExif[$pExifField] ) ) {
$ret = $this->mExif[$pExifField];
}
}
return $ret;
}
function rotateImage( $pDegrees ) {
global $gBitSystem;
if( !empty( $this->mInfo['storage_path'] ) || $this->load() ) {
$fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['storage_path'];
$fileHash['dest_base_name'] = preg_replace('/(.+)\..*$/', '$1', basename( $fileHash['source_file'] ) );
$fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
$fileHash['size'] = filesize( $fileHash['source_file'] );
$fileHash['dest_path'] = dirname( $this->mInfo['storage_path'] ).'/';
$fileHash['name'] = $this->mInfo['filename'];
if( $pDegrees == 'auto' ) {
if( $exifOrientation = $this->getExifField( 'orientation' ) ) {
switch( $exifOrientation ) {
case 1: //) transform="";;
break;
case 2: //) transform="-flip horizontal";;
break;
case 3: //) transform="-rotate 180";;
$pDegrees = 180;
break;
case 4: //) transform="-flip vertical";;
break;
case 5: //) transform="-transpose";;
break;
case 6: //) transform="-rotate 90";;
// make sure image has not already been rotated
if( $this->isLandscape() ) {
$pDegrees = 90;
}
break;
case 7: //) transform="-transverse";;
break;
case 8: //) transform="-rotate 270";;
// make sure image has not already been rotated
if( $this->isLandscape() ) {
$pDegrees = 270;
}
break;
// *) transform="";;
}
}
}
if( is_numeric( $pDegrees ) ) {
$fileHash['degrees'] = $pDegrees;
$rotateFunc = liberty_get_function( 'rotate' );
if( $rotateFunc( $fileHash ) ) {
liberty_clear_thumbnails( $fileHash );
$this->mDb->query( "UPDATE `".BIT_DB_PREFIX."fisheye_image` SET `width`=`height`, `height`=`width` WHERE `content_id`=?", array( $this->mContentId ) );
$this->generateThumbnails();
} else {
$this->mErrors['rotate'] = $fileHash['error'];
}
} elseif( $pDegrees == 'auto' ) {
$this->mErrors['rotate'] = "Image was not auto-rotated.";
}
}
return (count($this->mErrors) == 0);
}
/**
* convertColorspace
*
* @param string $pColorSpace - target color space, only 'grayscale' is currently supported, and only when using the MagickWand image processor
* @access public
* @return TRUE on success, FALSE on failure - mErrors will contain reason for failure
*/
function convertColorspace( $pColorSpace ) {
$ret = FALSE;
if( !empty( $this->mInfo['storage_path'] ) || $this->load() ) {
$fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['storage_path'];
$fileHash['dest_base_name'] = preg_replace('/(.+)\..*$/', '$1', basename( $fileHash['source_file'] ) );
$fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
$fileHash['size'] = filesize( $fileHash['source_file'] );
$fileHash['dest_path'] = dirname( $this->mInfo['storage_path'] ).'/';
$fileHash['name'] = $this->mInfo['filename'];
if( $convertFunc = liberty_get_function( 'convert_colorspace' ) ) {
if( $ret = $convertFunc( $fileHash, $pColorSpace ) ) {
liberty_clear_thumbnails( $fileHash );
$sql = "UPDATE `".BIT_DB_PREFIX."liberty_files SET `file_size`=? WHERE `file_id` = ?";
$this->mDb->query( $sql, array( filesize( $fileHash['dest_file'] ), $this->mInfo['file_id'] ) );
$this->generateThumbnails();
}
}
}
return $ret;
}
function resizeOriginal( $pResizeOriginal ) {
global $gBitSystem;
if( !empty( $this->mInfo['storage_path'] ) || $this->load() ) {
$fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['storage_path'];
$fileHash['dest_base_name'] = preg_replace('/(.+)\..*$/', '$1', basename( $fileHash['source_file'] ) );
$fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
$fileHash['size'] = filesize( $fileHash['source_file'] );
$fileHash['dest_path'] = dirname( $this->mInfo['storage_path'] ).'/';
$fileHash['name'] = $this->mInfo['filename'];
$fileHash['max_height'] = $fileHash['max_width'] = $pResizeOriginal;
// make a copy of the fileHash that we can compare output after processing
$preResize = $fileHash;
$resizeFunc = liberty_get_function( 'resize' );
if( !$resizeFunc( $fileHash ) ) {
$this->mErrors['resize'] = $fileHash['error'];
} else {
// Ack this is evil direct bashing of the liberty tables! XOXO spiderr
// should be a cleaner way eventually
// we need to update the souce_file in case it's changed from a non jpg to a jpg
if( $fileHash['name'] != $preResize['name'] ) {
$fileHash['source_file'] = dirname( $fileHash['source_file'] ).'/'.$fileHash['name'];
// make absolutely certain that we have 2 image files and that they are different, then remove the original
if( $fileHash['source_file'] != $preResize['source_file'] && is_file( $fileHash['source_file'] ) && is_file( $preResize['source_file'] ) ) {
@unlink( $preResize['source_file'] );
}
}
$details = $this->getImageDetails( $fileHash['source_file'] );
// store all the values that might have changed due to the resize
$storeHash = array(
'file_size' => $details['size'],
'mime_type' => $details['mime'],
'storage_path' => str_replace( BIT_ROOT_PATH, "", $fileHash['source_file'] ),
);
$this->mDb->associateUpdate( BIT_DB_PREFIX."liberty_files", $storeHash, array( 'file_id' => $this->mInfo['file_id'] ) );
//$query = "UPDATE `".BIT_DB_PREFIX."liberty_files` SET `file_size`=? WHERE `file_id`=?";
//$this->mDb->query( $query, array( $details['size'], $this->mInfo['file_id'] ) );
$query = "UPDATE `".BIT_DB_PREFIX."fisheye_image` SET `width`=?, `height`=? WHERE `content_id`=?";
$this->mDb->query( $query, array( $details['width'], $details['height'], $this->mContentId ) );
// if we've come this far, we can try removing the original if it's different to the resized image
// make absolutely certain that we have 2 image files and that they are different, then remove the original
if( $fileHash['source_file'] != $preResize['source_file'] && is_file( $fileHash['source_file'] ) && is_file( $preResize['source_file'] ) ) {
@unlink( $preResize['source_file'] );
}
}
}
return (count($this->mErrors) == 0);
}
function generateThumbnails( $pResizeOriginal=NULL ) {
global $gBitSystem;
$ret = FALSE;
// LibertyMime will take care of thumbnail generation of the offline thumbnailer is not active
if( $gBitSystem->isFeatureActive( 'liberty_offline_thumbnailer' ) ) {
$query = "DELETE FROM `".BIT_DB_PREFIX."liberty_process_queue`
WHERE `content_id`=?";
$this->mDb->query( $query, array( $this->mContentId ) );
$query = "INSERT INTO `".BIT_DB_PREFIX."liberty_process_queue`
(`content_id`, `queue_date`, `processor_parameters`) VALUES (?,?,?)";
$this->mDb->query( $query, array( $this->mContentId, $gBitSystem->getUTCTime(), serialize( array( 'resize_original' => $pResizeOriginal ) ) ) );
} else {
$ret = $this->renderThumbnails();
}
return $ret;
}
function renderThumbnails( $pThumbSizes=NULL ) {
if( !empty( $this->mInfo['storage_path'] ) || $this->load() ) {
$fileHash['source_file'] = BIT_ROOT_PATH.$this->mInfo['storage_path'];
$fileHash['type'] = 'image/'.strtolower( substr( $fileHash['source_file'], (strrpos( $fileHash['source_file'], '.' )+1) ) );
$fileHash['size'] = filesize( $fileHash['source_file'] );
$fileHash['dest_path'] = dirname( $this->mInfo['storage_path'] ).'/';
$fileHash['name'] = $this->mInfo['filename'];
$fileHash['thumbnail_sizes'] = $pThumbSizes;
// just generate thumbnails
liberty_generate_thumbnails( $fileHash );
if( !empty( $fileHash['error'] ) ) {
$this->mErrors['thumbnail'] = $fileHash['error'];
}
}
return( count($this->mErrors) == 0 );
}
function getSourceUrl() {
$ret = NULL;
if( !empty( $this->mInfo['storage_path'] ) ) {
$ret = BIT_ROOT_URL.dirname( $this->mInfo['storage_path'] ).'/'.rawurlencode( basename( $this->mInfo['storage_path'] ) );
}
return $ret;
}
function getSourceFile() {
$ret = NULL;
if( !empty( $this->mInfo['storage_path'] ) ) {
$ret = BIT_ROOT_PATH.$this->mInfo['storage_path'];
}
return $ret;
}
// Get resolution, etc
function getImageDetails($pFilePath = NULL) {
$info = NULL;
$pFilePath = ($pFilePath ? $pFilePath : $this->getSourceFile());
$checkFiles = array( $pFilePath, dirname( $pFilePath ).'/original.jpg' );
foreach( $checkFiles as $cf ) {
if ($cf && file_exists( $cf ) && filesize( $cf ) ) {
if( $info = getimagesize( rtrim( $cf ) ) ) {
$info['width'] = $info[0];
$info['height'] = $info[1];
$info['size'] = filesize( $cf );
}
}
}
return $info;
}
/**
* Returns include file that will setup vars for display
* @return the fully specified path to file to be included
*/
function getRenderFile() {
return FISHEYE_PKG_PATH."display_fisheye_image_inc.php";
}
/**
* Returns template file used for display
* @return the fully specified path to file to be included
*/
function getRenderTemplate() {
return 'bitpackage:fisheye/view_image.tpl';
}
/**
* Function that returns link to display a piece of content
* @param pImageId id of gallery to link
* @param pMixed if a string, it is assumed to be the size, if an array, it is assumed to be a mInfo hash
* @return the url to display the gallery.
*/
function getDisplayUrl( $pImageId=NULL, $pMixed=NULL ) {
$ret = '';
if( !@BitBase::verifyId( $pImageId ) ) {
$pImageId = $this->mImageId;
}
// if pMixed is an array, we assume it has all the pertinent information
if( is_array( $pMixed )) {
$info = $pMixed;
} else {
$info = &$this->mInfo;
}
$size = ( is_string( $pMixed ) && isset( $info['thumbnail_url'][$pMixed] ) ) ? $pMixed : NULL ;
global $gBitSystem;
if( @BitBase::verifyId( $pImageId ) ) {
if( $gBitSystem->isFeatureActive( 'pretty_urls' ) ) {
$ret = FISHEYE_PKG_URL.'image/'.$pImageId;
if( !empty( $this ) && !empty( $this->mGalleryPath ) ) {
$ret .= $this->mGalleryPath;
}
if( $size ) {
$ret .= '/'.$size;
}
} else {
$ret = FISHEYE_PKG_URL.'view_image.php?image_id='.$pImageId;
if( !empty( $this ) && !empty( $this->mGalleryPath ) ) {
$ret .= '&gallery_path='.$this->mGalleryPath;
}
if( $size ) {
$ret .= '&size='.$size;
}
}
} elseif( @BitBase::verifyId( $info['content_id'] ) ) {
$ret = FISHEYE_PKG_URL.'view_image.php?content_id='.$info['content_id'];
}
return $ret;
}
/**
* Generate a valid display link for the Blog
*
* @param object PostId of the item to use
* @param array Not used
* @return object Fully formatted html link for use by Liberty
*/
function getDisplayLink( $pTitle=NULL, $pMixed=NULL ) {
global $gBitSystem;
if( empty( $pTitle ) && !empty( $this ) ) {
$pTitle = $this->getTitle();
}
if( empty( $pMixed ) && !empty( $this ) ) {
$pMixed = $this->mInfo;
}
$ret = $pTitle;
if( $gBitSystem->isPackageActive( 'fisheye' ) ) {
$ret = ''.$pTitle.'';
}
return $ret;
}
function loadThumbnail( $pSize='small' ) {
$this->mInfo['gallery_thumbnail_url'] = &$this->mInfo['thumbnail_url'][$pSize];
}
function getThumbnailUrl( $pSize='small', $pInfoHash=NULL ) {
$ret = NULL;
if( !empty( $pInfoHash ) ) {
// do some stuff if we are given a hash of stuff
} else {
if( empty( $this->mInfo['gallery_thumbnail_url'] ) ) {
$this->loadThumbnail( $pSize );
}
$ret = $this->mInfo['gallery_thumbnail_url'];
}
return $ret;
}
function expunge($pExpungeAttachment = TRUE) {
if( $this->isValid() ) {
$this->mDb->StartTrans();
$query = "DELETE FROM `".BIT_DB_PREFIX."fisheye_gallery_image_map` WHERE `item_content_id` = ?";
$rs = $this->mDb->query($query, array( $this->mContentId ));
$query = "UPDATE `".BIT_DB_PREFIX."fisheye_gallery` SET `preview_content_id`=NULL WHERE `preview_content_id` = ?";
$rs = $this->mDb->query($query, array( $this->mContentId ));
$query = "DELETE FROM `".BIT_DB_PREFIX."fisheye_image` WHERE `content_id` = ?";
$rs = $this->mDb->query($query, array( $this->mContentId ));
if( LibertyMime::expunge($pExpungeAttachment) ) {
$this->mDb->CompleteTrans();
} else {
$this->mDb->RollbackTrans();
}
}
return( count( $this->mErrors ) == 0 );
}
function expungingAttachment($pAttachmentId, $pContentIdArray) {
foreach ($pContentIdArray as $id) {
$this->mContentId = $id;
// Vital that we call LibertyMime::expunge with false since the attachment is already being deleted.
$this->expunge(FALSE);
}
}
function isValid() {
return( @$this->verifyId( $this->mImageId ) || @$this->verifyId( $this->mContentId ) );
}
function imageExistsInDatabase() {
$ret = FALSE;
if( $this->isValid() && $this->mImageId ) {
$query = "SELECT COUNT(`image_id`)
FROM `".BIT_DB_PREFIX."fisheye_image`
WHERE `image_id` = ?";
$bindVars = array($this->mImageId);
if($this->mDb->getOne($query, $bindVars) > 0){
$ret = TRUE;
}
}
return $ret;
}
function getList( &$pListHash ) {
global $gBitUser,$gBitSystem;
$this->prepGetList( $pListHash );
$ret = $bindVars = array();
$distinct = '';
$select = '';
$whereSql = '';
$joinSql = '';
if( @$this->verifyId( $pListHash['user_id'] ) ) {
$whereSql .= " AND lc.`user_id` = ? ";
$bindVars[] = $pListHash['user_id'];
} elseif( !empty( $pListHash['recent_users'] )) {
$distinct = " DISTINCT ON ( lc.created/86400, uu.`user_id` ) ";
$pListHash['sort_mode'] = 'uu.user_id_desc';
}
if( @$this->verifyId( $pListHash['gallery_id'] ) ) {
$whereSql .= " AND fg.`gallery_id` = ? ";
$bindVars[] = $pListHash['gallery_id'];
}
if( !empty( $pListHash['search'] ) ) {
$whereSql .= " AND UPPER(lc.`title`) LIKE ? ";
$bindVars[] = '%'.strtoupper( $pListHash['search'] ).'%';
}
if( !empty( $pListHash['max_age'] ) && is_numeric( $pListHash['max_age'] ) ) {
$whereSql .= " AND lc.`created` > ? ";
$bindVars[] = $pListHash['max_age'];
}
if( @$this->verifyId( $pListHash['group_id'] ) ) {
$joinSql .= " INNER JOIN `".BIT_DB_PREFIX."users_groups_map` ugm ON (ugm.`user_id`=uu.`user_id`) ";
$whereSql .= " AND ugm.`group_id` = ? ";
$bindVars[] = $pListHash['group_id'];
}
$orderby = '';
if( !empty( $pListHash['recent_images'] )) {
// get images from recent user truncated by day. This is necessary because DISTINCT ON expressions must match initial ORDER BY expressions
$distinct = " DISTINCT ON ( lc.`created`/86400, uu.`user_id` ) ";
$orderby = " ORDER BY lc.`created`/86400 DESC, uu.`user_id`";
} elseif ( !empty( $pListHash['sort_mode'] ) ) {
//converted in prepGetList()
$orderby = " ORDER BY ".$this->mDb->convertSortmode( $pListHash['sort_mode'] )." ";
}
$this->getServicesSql( 'content_list_sql_function', $selectSql, $joinSql, $whereSql, $bindVars );
if( !empty( $whereSql ) ) {
$whereSql = substr_replace( $whereSql, ' WHERE ', 0, 4 );
}
$query = "SELECT $distinct fi.`image_id` AS `hash_key`, fi.*, lf.*, lc.*, fg.`gallery_id`, uu.`login`, uu.`real_name` $select $selectSql
FROM `".BIT_DB_PREFIX."fisheye_image` fi
INNER JOIN `".BIT_DB_PREFIX."liberty_attachments` la ON(la.`content_id`=fi.`content_id`)
INNER JOIN `".BIT_DB_PREFIX."liberty_files` lf ON(la.`foreign_id`=lf.`file_id`)
INNER JOIN `".BIT_DB_PREFIX."liberty_content` lc ON(fi.`content_id` = lc.`content_id`)
INNER JOIN `".BIT_DB_PREFIX."users_users` uu ON(uu.`user_id` = lc.`user_id`) $joinSql
LEFT OUTER JOIN `".BIT_DB_PREFIX."fisheye_gallery_image_map` tfgim2 ON(tfgim2.`item_content_id`=lc.`content_id`)
LEFT OUTER JOIN `".BIT_DB_PREFIX."fisheye_gallery` fg ON(fg.`content_id`=tfgim2.`gallery_content_id`)
$whereSql $orderby";
if( $rs = $this->mDb->query( $query, $bindVars, $pListHash['max_records'], $pListHash['offset'], $pListHash['query_cache_time'] ) ) {
while( $row = $rs->fetchRow() ) {
$ret[$row['hash_key']] = $row;
$imageId = $row['image_id'];
if( empty( $pListHash['no_thumbnails'] ) ) {
$ret[$imageId]['display_url'] = $this->getDisplayUrl( $imageId );
$ret[$imageId]['has_machine_name'] = $this->isMachineName( $ret[$imageId]['title'] );
$ret[$imageId]['thumbnail_url'] = liberty_fetch_thumbnail_url( array(
'storage_path' => $ret[$imageId]['storage_path'],
'default_image' => FISHEYE_PKG_URL.'image/generating_thumbnails.png',
'size' => 'avatar',
));
}
}
}
return $ret;
}
/**
* isCommentable
*
* @access public
* @return TRUE on success, FALSE on failure
*/
function isCommentable() {
global $gGallery;
// if we have a loaded gallery, we just use that to work out if we can add comments to this image
if( is_object( $gGallery ) ) {
return $gGallery->isCommentable();
}
$ret = FALSE;
if( $parents = $this->getParentGalleries() ) {
// @TODO: No idea how to work out if you can add a comment to this image
// for now we'll take the mGalleryPath and use that gallery
$gal = current( $parents );
$query = "SELECT `pref_value` FROM `".BIT_DB_PREFIX."liberty_content_prefs` WHERE `content_id` = ? AND `pref_name` = ?";
$ret = ( $this->mDb->getOne( $query, array( $gal['content_id'], 'allow_comments' )) == 'y' );
}
return $ret;
}
}
?>