diff options
Diffstat (limited to 'classes/TidypicsImage.php')
| -rw-r--r-- | classes/TidypicsImage.php | 292 | 
1 files changed, 292 insertions, 0 deletions
| diff --git a/classes/TidypicsImage.php b/classes/TidypicsImage.php new file mode 100644 index 000000000..531d54912 --- /dev/null +++ b/classes/TidypicsImage.php @@ -0,0 +1,292 @@ +<?php +/** + * Tidypics Image class + * + * @package TidypicsImage + */ + + +class TidypicsImage extends ElggFile { +	protected function initialise_attributes() { +		parent::initialise_attributes(); + +		$this->attributes['subtype'] = "image"; +	} + +	public function __construct($guid = null) { +		parent::__construct($guid); +	} + +	/** +	 * delete image +	 * +	 * @return bool +	 */ +	public function delete() { + +		// check if batch should be deleted +		$batch = elgg_get_entities_from_relationship(array( +			'relationship' => 'belongs_to_batch', +			'relationship_guid' => $this->guid, +			'inverse_relationship' => false, +		)); +		if ($batch) { +			$batch = $batch[0]; +			$count = elgg_get_entities_from_relationship(array( +				'relationship' => 'belongs_to_batch', +				'relationship_guid' => $batch->guid, +				'inverse_relationship' => true, +				'count' => true, +			)); +			if ($count == 1) { +				// last image so delete batch +				$batch->delete(); +			} +		} + +		$album = get_entity($this->container_guid); +		if ($album) { +			$album->removeImage($this->guid); +		} + +		$this->removeThumbnails(); + +		// update quota +		$owner = $this->getOwnerEntity(); +		$owner->image_repo_size = (int)$owner->image_repo_size - $this->size(); + +		return parent::delete(); +	} + +	/** +	 * Set the internal filenames +	 *  +	 * @warning container needs to be set first +	 */ +	public function setOriginalFilename($originalName) { +		$prefix = "image/" . $this->container_guid . "/"; +		$filestorename = elgg_strtolower(time() . $originalName); +		$this->setFilename($prefix . $filestorename); +		$this->originalfilename = $originalName; +	} + +	/** +	 * Save the uploaded image +	 * +	 * @warning filename needs to be set first +	 *  +	 * @param string $uploadedFilename name of the uploaded file +	 * @param int $size +	 */ +	public function saveImageFile($uploadedFilename, $size) { + +		// we need to make sure the directory for the album exists +		// @note for group albums, the photos are distributed among the users +		$dir = tp_get_img_dir() . $this->getContainer(); +		if (!file_exists($dir)) { +			mkdir($dir, 0755, true); +		} + +		$filename = $this->getFilenameOnFilestore(); + +		$result = move_uploaded_file($uploadedFilename, $filename); +		if (!$result) { +			return false; +		} + +		$owner = $this->getOwnerEntity(); +		$owner->image_repo_size = (int)$owner->image_repo_size + $size; + +		return true; +	} + +	/** +	 * Save the image thumbnails +	 * +	 * @warning container guid and filename must be set +	 *  +	 * @param string $imageLib +	 */ +	public function saveThumbnails($imageLib) { +		include_once dirname(dirname(__FILE__)) . "/lib/resize.php"; +		 +		$prefix = "image/" . $this->container_guid . "/"; +		$filename = $this->getFilename(); +		$filename = substr($filename, strrpos($filename, '/') + 1); +		 +		if ($imageLib == 'ImageMagick') { +			// ImageMagick command line +			if (tp_create_im_cmdline_thumbnails($this, $prefix, $filename) != true) { +				trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick command line', E_USER_WARNING); +			} +		} else if ($imageLib == 'ImageMagickPHP') { +			// imagick php extension +			if (tp_create_imagick_thumbnails($this, $prefix, $filename) != true) { +				trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick PHP', E_USER_WARNING); +			} +		} else { +			if (tp_create_gd_thumbnails($this, $prefix, $filename) != true) { +				trigger_error('Tidypics warning: failed to create thumbnails - GD', E_USER_WARNING); +			} +		} +	} + +	/** +	 * Extract EXIF Data from image +	 * +	 * @warning image file must be saved first +	 */ +	public function extractExifData() { +		include_once dirname(dirname(__FILE__)) . "/lib/exif.php"; +		td_get_exif($this); +	} +	 +	/** +	 * Has the photo been tagged with "in this photo" tags +	 * +	 * @return true/false +	 */ +	public function isPhotoTagged() { +		$num_tags = count_annotations($this->getGUID(), 'object', 'image', 'phototag'); +		if ($num_tags > 0) { +			return true; +		} else { +			return false; +		} +	} + +	/** +	 * Get an array of photo tag information +	 * +	 * @return array of json representations of the tags and the tag link text +	 */ +	public function getPhotoTags() { +		global $CONFIG; + +		// get tags as annotations +		$photo_tags = get_annotations($this->getGUID(), 'object', 'image', 'phototag'); +		if (!$photo_tags) { +			// no tags or user doesn't have permission to tags, so return +			return false; +		} + +		$photo_tags_json = "["; +		foreach ($photo_tags as $p) { +			$photo_tag = unserialize($p->value); + +			// create link to page with other photos tagged with same tag +			$phototag_text = $photo_tag->value; +			$phototag_link = $CONFIG->wwwroot . 'search/?tag=' . $phototag_text . '&subtype=image&object=object'; +			if ($photo_tag->type === 'user') { +				$user = get_entity($photo_tag->value); +				if ($user) { +					$phototag_text = $user->name; +				} else { +					$phototag_text = "unknown user"; +				} + +				$phototag_link = $CONFIG->wwwroot . "pg/photos/tagged/" . $photo_tag->value; +			} + +			if (isset($photo_tag->x1)) { +				// hack to handle format of Pedro Prez's tags - ugh +				$photo_tag->coords = "\"x1\":\"{$photo_tag->x1}\",\"y1\":\"{$photo_tag->y1}\",\"width\":\"{$photo_tag->width}\",\"height\":\"{$photo_tag->height}\""; +				$photo_tags_json .= '{' . $photo_tag->coords . ',"text":"' . $phototag_text . '","id":"' . $p->id . '"},'; +			} else { +				$photo_tags_json .= '{' . $photo_tag->coords . ',"text":"' . $phototag_text . '","id":"' . $p->id . '"},'; +			} + +			// prepare variable arrays for tagging view +			$photo_tag_links[$p->id] = array('text' => $phototag_text, 'url' => $phototag_link); +		} + +		$photo_tags_json = rtrim($photo_tags_json,','); +		$photo_tags_json .= ']'; + +		$ret_data = array('json' => $photo_tags_json, 'links' => $photo_tag_links); +		return $ret_data; +	} + +	/** +	 * Get the view information for this image +	 * +	 * @param $viewer_guid the guid of the viewer (0 if not logged in) +	 * @return array with number of views, number of unique viewers, and number of views for this viewer +	 */ +	public function getViews($viewer_guid) { +		$views = get_annotations($this->getGUID(), "object", "image", "tp_view", "", 0, 99999); +		if ($views) { +			$total_views = count($views); + +			if ($this->owner_guid == $viewer_guid) { +				// get unique number of viewers +				foreach ($views as $view) { +					$diff_viewers[$view->owner_guid] = 1; +				} +				$unique_viewers = count($diff_viewers); +			} +			else if ($viewer_guid) { +				// get the number of times this user has viewed the photo +				$my_views = 0; +				foreach ($views as $view) { +					if ($view->owner_guid == $viewer_guid) { +						$my_views++; +					} +				} +			} + +			$view_info = array("total" => $total_views, "unique" => $unique_viewers, "mine" => $my_views); +		} +		else { +			$view_info = array("total" => 0, "unique" => 0, "mine" => 0); +		} + +		return $view_info; +	} + +	/** +	 * Add a tidypics view annotation to this image +	 * +	 * @param $viewer_guid +	 * @return none +	 */ +	public function addView($viewer_guid) { +		if ($viewer_guid != $this->owner_guid && tp_is_person()) { +			create_annotation($this->getGUID(), "tp_view", "1", "integer", $viewer_guid, ACCESS_PUBLIC); +		} +	} + +	/** +	 * Remove thumbnails - usually in preparation for deletion +	 * +	 * The thumbnails are not actually ElggObjects so we create +	 * temporary objects to delete them. +	 */ +	protected function removeThumbnails() { +		$thumbnail = $this->thumbnail; +		$smallthumb = $this->smallthumb; +		$largethumb = $this->largethumb; + +		//delete standard thumbnail image +		if ($thumbnail) { +			$delfile = new ElggFile(); +			$delfile->owner_guid = $this->getOwner(); +			$delfile->setFilename($thumbnail); +			$delfile->delete(); +		} +		//delete small thumbnail image +		if ($smallthumb) { +			$delfile = new ElggFile(); +			$delfile->owner_guid = $this->getOwner(); +			$delfile->setFilename($smallthumb); +			$delfile->delete(); +		} +		//delete large thumbnail image +		if ($largethumb) { +			$delfile = new ElggFile(); +			$delfile->owner_guid = $this->getOwner(); +			$delfile->setFilename($largethumb); +			$delfile->delete(); +		} +	} +} | 
