diff options
Diffstat (limited to 'mod/lightpics/classes/TidypicsAlbum.php')
| -rw-r--r-- | mod/lightpics/classes/TidypicsAlbum.php | 375 | 
1 files changed, 375 insertions, 0 deletions
| diff --git a/mod/lightpics/classes/TidypicsAlbum.php b/mod/lightpics/classes/TidypicsAlbum.php new file mode 100644 index 000000000..0cb8bd84e --- /dev/null +++ b/mod/lightpics/classes/TidypicsAlbum.php @@ -0,0 +1,375 @@ +<?php +/** + * Tidypics Album class + * + * @package TidypicsAlbum + * @author Cash Costello + * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License v2 + */ + + +class TidypicsAlbum extends ElggObject { +	/** +	 * Sets the internal attributes +	 */ +	protected function initializeAttributes() { +		parent::initializeAttributes(); + +		$this->attributes['subtype'] = "album"; +	} + +	/** +	 * Constructor +	 * @param mixed $guid +	 */ +	public function __construct($guid = null) { +		parent::__construct($guid); +	} + +	/** +	 * Save an album +	 * +	 * @return bool +	 */ +	public function save() { + +		if (!isset($this->new_album)) { +			$this->new_album = true; +		} + +		if (!isset($this->last_notified)) { +			$this->last_notified = 0; +		} + +		if (!parent::save()) { +			return false; +		} +		 +		mkdir(tp_get_img_dir() . $this->guid, 0755, true); + +		elgg_trigger_event('create', 'album', $this); + +		return true; +	} + +	/** +	 * Delete album +	 * +	 * @return bool +	 */ +	public function delete() { + +		$this->deleteImages(); +		$this->deleteAlbumDir(); +		 +		return parent::delete(); +	} + +	/** +	 * Get the title of the photo album +	 * +	 * @return string +	 */ +	public function getTitle() { +		return $this->title; +	} + +	/** +	 * Get the URL for this album +	 *  +	 * @return string +	 */ +	public function getURL() { +		$title = elgg_get_friendly_title($this->getTitle()); +		$url = "photos/album/$this->guid/$title"; +		return elgg_normalize_url($url); +	} + +	/** +	 * Get an array of image objects +	 * +	 * @param int $limit +	 * @param int $offset +	 * @return array +	 */ +	public function getImages($limit, $offset = 0) { +		$imageList = $this->getImageList(); +		if ($offset > count($imageList)) { +			return array(); +		} + +		$imageList = array_slice($imageList, $offset, $limit); +		 +		$images = array(); +		foreach ($imageList as $guid) { +			$images[] = get_entity($guid); +		} +		return $images; +	} + +	/** +	 * View a list of images +	 * +	 * @param array $options Options to pass to elgg_view_entity_list() +	 * @return string +	 */ +	public function viewImages(array $options = array()) { +		$count = $this->getSize(); +		 +		if ($count == 0) { +			return ''; +		} + +		$defaults = array( +			'count' => $count, +			'limit' => 16, +			'offset' => max(get_input('offset'), 0), +			'full_view' => false, +			'list_type' => 'gallery', +			'list_type_toggle' => false, +			'pagination' => true, +			'gallery_class' => 'tidypics-gallery elgg-lightbox-gallery', +		); + +		$options = array_merge($defaults, (array) $options); +		$images = $this->getImages($options['limit'], $options['offset']); + +		if (count($images) == 0) { +			return ''; +		} + +		return elgg_view_entity_list($images, $options); +	} + +	/** +	 * Returns the cover image entity +	 * @return TidypicsImage +	 */ +	public function getCoverImage() { +		return get_entity($this->getCoverImageGuid()); +	} + +	/** +	 * Get the GUID of the album cover +	 *  +	 * @return int +	 */ +	public function getCoverImageGuid() { +		if ($this->getSize() == 0) { +			return 0; +		} + +		$guid = $this->cover; +		$imageList = $this->getImageList(); +		if (!in_array($guid, $imageList)) { +			// select random photo to be cover +			$index = array_rand($imageList, 1); +			$guid = $imageList[$index]; +			$this->cover = $guid; +		} +		return $guid; +	} + +	/** +	 * Set the GUID for the album cover +	 * +	 * @param int $guid +	 * @return bool +	 */ +	public function setCoverImageGuid($guid) { +		$imageList = $this->getImageList(); +		if (!in_array($guid, $imageList)) { +			return false; +		} +		$this->cover = $guid; +		return true; +	} + +	/** +	 * Get the number of photos in the album +	 * +	 * @return int +	 */ +	public function getSize() { +		return count($this->getImageList()); +	} + +	/** +	 * Returns an order list of image guids +	 *  +	 * @return array +	 */ +	public function getImageList() { +		$listString = $this->orderedImages; +		if (!$listString) { +			return array(); +		} +		$list = unserialize($listString); + +		// if empty don't need to check the permissions. +		if (!$list) { +			return array(); +		} + +		// check access levels +		$guidsString = implode(',', $list); + +		$options = array( +			'wheres' => array("e.guid IN ($guidsString)"), +			'order_by' => "FIELD(e.guid, $guidsString)", +			'callback' => 'tp_guid_callback', +			'limit' => ELGG_ENTITIES_NO_VALUE +		); +		 +		$list = elgg_get_entities($options); +		return $list; +	} + +	/** +	 * Sets the album image order +	 * +	 * @param array $list An indexed array of image guids +	 * @return bool +	 */ +	public function setImageList($list) { +		// validate data +		foreach ($list as $guid) { +			if (!filter_var($guid, FILTER_VALIDATE_INT)) { +				return false; +			} +		} + +		$listString = serialize($list); +		$this->orderedImages = $listString; +		return true; +	} + +	/** +	 * Add new images to the front of the image list +	 * +	 * @param array $list An indexed array of image guids +	 * @return bool +	 */ +	public function prependImageList($list) { +		$currentList = $this->getImageList(); +		$list = array_merge($list, $currentList); +		return $this->setImageList($list); +	} + +	/** +	 * Get the previous image in the album. Wraps around to the last image if given the first. +	 * +	 * @param int $guid GUID of the current image +	 * @return TidypicsImage +	 */ +	public function getPreviousImage($guid) { +		$imageList = $this->getImageList(); +		$key = array_search($guid, $imageList); +		if ($key === FALSE) { +			return null; +		} +		$key--; +		if ($key < 0) { +			return get_entity(end($imageList)); +		} +		return get_entity($imageList[$key]); +	} + +	/** +	 * Get the next image in the album. Wraps around to the first image if given the last. +	 * +	 * @param int $guid GUID of the current image +	 * @return TidypicsImage +	 */ +	public function getNextImage($guid) { +		$imageList = $this->getImageList(); +		$key = array_search($guid, $imageList); +		if ($key === FALSE) { +			return null; +		} +		$key++; +		if ($key >= count($imageList)) { +			return get_entity($imageList[0]); +		} +		return get_entity($imageList[$key]); +	} + +	/** +	 * Get the index into the album for a particular image +	 * +	 * @param int $guid GUID of the image +	 * @return int +	 */ +	public function getIndex($guid) { +		return array_search($guid, $this->getImageList()) + 1; +	} + +	/** +	 * Remove an image from the album list +	 * +	 * @param int $imageGuid +	 * @return bool +	 */ +	public function removeImage($imageGuid)  { +		$imageList = $this->getImageList(); +		$key = array_search($imageGuid, $imageList); +		if ($key === false) { +			return false; +		} +		 +		unset($imageList[$key]); +		$this->setImageList($imageList); + +		return true; +	} + +	/** +	 * Has enough time elapsed between the last_notified and notify_interval setting? +	 * +	 * @return bool +	 */ +	public function shouldNotify() { +		return time() - $this->last_notified > elgg_get_plugin_setting('notify_interval', 'tidypics'); +	} + +	/** +	 * Delete all the images in this album +	 * +	 * @todo ElggBatch? +	 */ +	protected function deleteImages() { +		$images = elgg_get_entities(array( +			"type=" => "object", +			"subtype" => "image", +			"container_guid" => $this->guid, +			"limit" => ELGG_ENTITIES_NO_VALUE, +		)); +		if ($images) { +			foreach ($images as $image) { +				if ($image) { +					$image->delete(); +				} +			} +		} +	} + +	/** +	 * Delete the album directory on disk +	 */ +	protected function deleteAlbumDir() { +		$tmpfile = new ElggFile(); +		$tmpfile->setFilename('image/' . $this->guid . '/._tmp_del_tidypics_album_'); +		$tmpfile->subtype = 'image'; +		$tmpfile->owner_guid = $this->owner_guid; +		$tmpfile->container_guid = $this->guid; +		$tmpfile->open("write"); +		$tmpfile->write(''); +		$tmpfile->close(); +		$tmpfile->save(); +		$albumdir = eregi_replace('/._tmp_del_tidypics_album_', '', $tmpfile->getFilenameOnFilestore()); +		$tmpfile->delete(); +		if (is_dir($albumdir)) { +			rmdir($albumdir); +		} +	} +} | 
