diff --git a/modules/embed_videos/controllers/embedded_videos.php b/modules/embed_videos/controllers/embedded_videos.php index 4c5a4768..fdb7b5e1 100644 --- a/modules/embed_videos/controllers/embedded_videos.php +++ b/modules/embed_videos/controllers/embedded_videos.php @@ -18,77 +18,6 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Embedded_videos_Controller extends Controller { - public function show($movie) { - if (!is_object($movie)) { - // show() must be public because we route to it in url::parse_url(), so make - // sure that we're actually receiving an object - throw new Kohana_404_Exception(); - } - access::required("view", $movie); - $where = array(array("type", "!=", "album")); - $position = $movie->parent()->get_position($movie, $where); - if ($position > 1) { - list($previous_item, $ignore, $next_item) = $movie->parent()->children(3, $position - 2, $where); - } else { - $previous_item = null; - list($next_item) = $movie->parent()->viewable()->children(1, $position, $where); - } - $embedded_video = ORM::factory("embedded_video")->where("item_id", "=", $movie->id)->find(); - //$db = Database::instance(); - //$result = $db->from('embedded_videos')->select('embed_code')->where('item_id',$movie->id)->get(); - $template = new Theme_View("page.html", "item", "embedded_video"); - $template->set_global("item", $movie); - $template->set_global("embedded_video", $embedded_video->embed_code); - $template->set_global("children", array()); - $template->set_global("children_count", 0); - $template->set_global("parents", $movie->parents()); - $template->set_global("next_item", $next_item); - $template->set_global("previous_item", $previous_item); - $template->set_global("sibling_count", $movie->parent()->viewable()->children_count($where)); - $template->set_global("position", $position); - $template->content = new View("embedded_video.html"); - db::query("UPDATE {items} SET `view_count` = `view_count` + 1 WHERE `id` = $movie->id")->execute(); - //$movie->view_count++; - //$movie->save(); - print $template; - } - public function update($movie_id) { - access::verify_csrf(); - $movie = ORM::factory("item", $movie_id); - access::required("view", $movie); - access::required("edit", $movie); - $form = embed_videos::get_edit_form($movie); - try { - $valid = $form->validate(); - $movie->title = $form->edit_item->title->value; - $movie->description = $form->edit_item->description->value; - $movie->slug = $form->edit_item->slug->value; - //$movie->name = $form->edit_item->inputs["name"]->value; - $movie->validate(); - } - catch(ORM_Validation_Exception $e) { - // Translate ORM validation errors into form error messages - foreach($e->validation->errors() as $key => $error) { - $form->edit_item->inputs[$key]->add_error($error, 1); - } - $valid = false; - } - if ($valid) { - $movie->save(); - module::event("item_edit_form_completed", $movie, $form); - log::success("content", "Updated embed", "url() }\">view"); - message::success(t("Saved embed %movie_title", array("movie_title" => $movie->title))); - if ($form->from_id->value == $movie->id) { - // Use the new url; it might have changed. - print json_encode(array("result" => "success", "location" => $movie->url())); - } else { - // Stay on the same page - print json_encode(array("result" => "success")); - } - } else { - print json_encode(array("result" => "error", "form" => (string)$form)); - } - } public function create($id) { $album = ORM::factory("item", $id); access::required("view", $album); @@ -138,7 +67,7 @@ class Embedded_videos_Controller extends Controller { $item->slug = $form->add_embedded_video->slug->value; $path_info = @pathinfo($temp_filename); $item->save(); - db::query("UPDATE {items} SET `type` = 'embedded_video' WHERE `id` = $item->id")->execute(); + //db::query("UPDATE {items} SET `type` = 'embedded_video' WHERE `id` = $item->id")->execute(); $embedded_video->item_id = $item->id; $embedded_video->validate(); $embedded_video->save(); @@ -187,10 +116,4 @@ class Embedded_videos_Controller extends Controller { access::required("add", $album); print embed_videos::get_add_form($album); } - public function form_edit($id) { - $embed = ORM::factory("item", $id); - access::required("view", $embed); - access::required("edit", $embed); - print embed_videos::get_edit_form($embed); - } } diff --git a/modules/embed_videos/helpers/embed_videos.php b/modules/embed_videos/helpers/embed_videos.php index edf6b875..49182407 100644 --- a/modules/embed_videos/helpers/embed_videos.php +++ b/modules/embed_videos/helpers/embed_videos.php @@ -55,52 +55,4 @@ class embed_videos_Core { return $form; } - - static function get_edit_form($photo) { - $form = new Forge("embedded_videos/update/$photo->id", "", "post", array("id" => "g-edit-embed-form")); - $form->hidden("from_id")->value($photo->id); - $group = $form->group("edit_item")->label(t("Edit Embedded Video")); - $group->input("title")->label(t("Title"))->value($photo->title) - ->error_messages("required", t("You must provide a title")) - ->error_messages("length", t("Your title is too long")); - $group->textarea("description")->label(t("Description"))->value($photo->description); - $group->input("slug")->label(t("Internet Address"))->value($photo->slug) - ->error_messages( - "conflict", t("There is already a movie, photo or album with this internet address")) - ->error_messages( - "not_url_safe", - t("The internet address should contain only letters, numbers, hyphens and underscores")) - ->error_messages("required", t("You must provide an internet address")) - ->error_messages("length", t("Your internet address is too long")); - - module::event("item_edit_form", $photo, $form); - - $group = $form->group("buttons")->label(""); - $group->submit("")->value(t("Modify")); - return $form; - } - - /** - * Return scaled width and height. - * - * @param integer $width - * @param integer $height - * @param integer $max the target size for the largest dimension - * @param string $format the output format using %d placeholders for width and height - */ - static function img_dimensions($width, $height, $max, $format="width=\"%d\" height=\"%d\"") { - if (!$width || !$height) { - return ""; - } - - if ($width > $height) { - $new_width = $max; - $new_height = (int)$max * ($height / $width); - } else { - $new_height = $max; - $new_width = (int)$max * ($width / $height); - } - return sprintf($format, $new_width, $new_height); - } - -} +} \ No newline at end of file diff --git a/modules/embed_videos/helpers/embed_videos_event.php b/modules/embed_videos/helpers/embed_videos_event.php index 30a946f5..8ef00064 100644 --- a/modules/embed_videos/helpers/embed_videos_event.php +++ b/modules/embed_videos/helpers/embed_videos_event.php @@ -19,27 +19,6 @@ */ class embed_videos_event_Core { - - static function item_created($item) { - - if ($item->type == "embedded_video") { - // Build our thumbnail/resizes. - try { - graphics::generate($item); - } catch (Exception $e) { - log::error("graphics", t("Couldn't create a thumbnail or resize for %item_title", - array("item_title" => $item->title)), - html::anchor($item->abs_url(), t("details"))); - Kohana_Log::add("error", $e->getMessage() . "\n" . $e->getTraceAsString()); - } - - // If the parent has no cover item, make this it. - $parent = $item->parent(); - if (access::can("edit", $parent) && $parent->album_cover_item_id == null) { - item::make_album_cover($item); - } - } - } static function item_deleted($item) { ORM::factory("embedded_video") ->where("item_id", "=", $item->id) @@ -48,7 +27,6 @@ class embed_videos_event_Core { } static function site_menu($menu, $theme) { $item = $theme->item(); - if ($can_add = $item && access::can("add", $item)) { $menu->get("add_menu") ->append(Menu::factory("dialog") diff --git a/modules/embed_videos/helpers/embed_videos_theme.php b/modules/embed_videos/helpers/embed_videos_theme.php index cea008ec..5d51204f 100644 --- a/modules/embed_videos/helpers/embed_videos_theme.php +++ b/modules/embed_videos/helpers/embed_videos_theme.php @@ -18,12 +18,17 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class embed_videos_theme_Core { - static function head($theme) { + static function photo_bottom($theme) { $item = $theme->item(); - if ($item) { - $view = new View("embed_video_js.html"); - $view->item = $item; - return $view; + if ($item && $item->is_photo()) { + $embedded_video = ORM::factory("embedded_video") + ->where("item_id", "=", $item->id) + ->find(); + if ($embedded_video->loaded()) { + $view = new View("embed_video_js.html"); + $view->embed_code = addslashes($embedded_video->embed_code); + return $view; + } } } } \ No newline at end of file diff --git a/modules/embed_videos/models/item.php b/modules/embed_videos/models/item.php deleted file mode 100644 index 7b6f6d01..00000000 --- a/modules/embed_videos/models/item.php +++ /dev/null @@ -1,1033 +0,0 @@ -loaded()) { - // Set reasonable defaults - $this->created = time(); - $this->rand_key = ((float)mt_rand()) / (float)mt_getrandmax(); - $this->thumb_dirty = 1; - $this->resize_dirty = 1; - $this->sort_column = "created"; - $this->sort_order = "ASC"; - $this->owner_id = identity::active_user()->id; - } - } - - /** - * Add a set of restrictions to any following queries to restrict access only to items - * viewable by the active user. - * @chainable - */ - public function viewable() { - return item::viewable($this); - } - - /** - * Is this item an album? - * @return true if it's an album - */ - public function is_album() { - return $this->type == 'album'; - } - - /** - * Is this item a photo? - * @return true if it's a photo - */ - public function is_photo() { - return $this->type == 'photo'; - } - - /** - * Is this item a movie? - * @return true if it's a movie - */ - public function is_movie() { - return $this->type == 'movie'; - } - - public function is_embed() { - return $this->type == 'embed'; - } - - public function delete($ignored_id=null) { - if ($this->id == 1) { - $v = new Validation(array("id")); - $v->add_error("id", "cant_delete_root_album"); - ORM_Validation_Exception::handle_validation($this->table_name, $v); - } - - $old = clone $this; - module::event("item_before_delete", $this); - - $parent = $this->parent(); - if ($parent->album_cover_item_id == $this->id) { - item::remove_album_cover($parent); - } - - $path = $this->file_path(); - $resize_path = $this->resize_path(); - $thumb_path = $this->thumb_path(); - - parent::delete(); - if (is_dir($path)) { - // Take some precautions against accidentally deleting way too much - $delete_resize_path = dirname($resize_path); - $delete_thumb_path = dirname($thumb_path); - if ($delete_resize_path == VARPATH . "resizes" || - $delete_thumb_path == VARPATH . "thumbs" || - $path == VARPATH . "albums") { - throw new Exception( - "@todo DELETING_TOO_MUCH ($delete_resize_path, $delete_thumb_path, $path)"); - } - @dir::unlink($path); - @dir::unlink($delete_resize_path); - @dir::unlink($delete_thumb_path); - } else { - @unlink($path); - @unlink($resize_path); - @unlink($thumb_path); - } - - module::event("item_deleted", $old); - } - - /** - * Specify the path to the data file associated with this item. To actually associate it, - * you still have to call save(). - * @chainable - */ - public function set_data_file($data_file) { - $this->data_file = $data_file; - return $this; - } - - /** - * Return the server-relative url to this item, eg: - * /gallery3/index.php/BobsWedding?page=2 - * /gallery3/index.php/BobsWedding/Eating-Cake.jpg - * - * @param string $query the query string (eg "show=3") - */ - public function url($query=null) { - $url = url::site($this->relative_url()); - if ($query) { - $url .= "?$query"; - } - return $url; - } - - /** - * Return the full url to this item, eg: - * http://example.com/gallery3/index.php/BobsWedding?page=2 - * http://example.com/gallery3/index.php/BobsWedding/Eating-Cake.jpg - * - * @param string $query the query string (eg "show=3") - */ - public function abs_url($query=null) { - $url = url::abs_site($this->relative_url()); - if ($query) { - $url .= "?$query"; - } - return $url; - } - - /** - * album: /var/albums/album1/album2 - * photo: /var/albums/album1/album2/photo.jpg - */ - public function file_path() { - return VARPATH . "albums/" . urldecode($this->relative_path()); - } - - /** - * album: http://example.com/gallery3/var/resizes/album1/ - * photo: http://example.com/gallery3/var/albums/album1/photo.jpg - */ - public function file_url($full_uri=false) { - $relative_path = "var/albums/" . $this->relative_path(); - return ($full_uri ? url::abs_file($relative_path) : url::file($relative_path)) - . "?m={$this->updated}"; - } - - /** - * album: /var/resizes/album1/.thumb.jpg - * photo: /var/albums/album1/photo.thumb.jpg - */ - public function thumb_path() { - $base = VARPATH . "thumbs/" . urldecode($this->relative_path()); - if ($this->is_photo() || $this->is_embed()) { - return $base; - } else if ($this->is_album()) { - return $base . "/.album.jpg"; - } else if ($this->is_movie()) { - // Replace the extension with jpg - return preg_replace("/...$/", "jpg", $base); - } - } - - /** - * Return true if there is a thumbnail for this item. - */ - public function has_thumb() { - return $this->thumb_width && $this->thumb_height; - } - - /** - * album: http://example.com/gallery3/var/resizes/album1/.thumb.jpg - * photo: http://example.com/gallery3/var/albums/album1/photo.thumb.jpg - */ - public function thumb_url($full_uri=false) { - $cache_buster = "?m={$this->updated}"; - $relative_path = "var/thumbs/" . $this->relative_path(); - $base = ($full_uri ? url::abs_file($relative_path) : url::file($relative_path)); - if ($this->is_photo() || $this->is_embed()) { - return $base . $cache_buster; - } else if ($this->is_album()) { - return $base . "/.album.jpg" . $cache_buster; - } else if ($this->is_movie()) { - // Replace the extension with jpg - $base = preg_replace("/...$/", "jpg", $base); - return $base . $cache_buster; - } - } - - /** - * album: /var/resizes/album1/.resize.jpg - * photo: /var/albums/album1/photo.resize.jpg - */ - public function resize_path() { - return VARPATH . "resizes/" . urldecode($this->relative_path()) . - ($this->is_album() ? "/.album.jpg" : ""); - } - - /** - * album: http://example.com/gallery3/var/resizes/album1/.resize.jpg - * photo: http://example.com/gallery3/var/albums/album1/photo.resize.jpg - */ - public function resize_url($full_uri=false) { - $relative_path = "var/resizes/" . $this->relative_path(); - return ($full_uri ? url::abs_file($relative_path) : url::file($relative_path)) . - ($this->is_album() ? "/.album.jpg" : "") - . "?m={$this->updated}"; - } - - /** - * Rebuild the relative_path_cache and relative_url_cache. - */ - private function _build_relative_caches() { - $names = array(); - $slugs = array(); - foreach (db::build() - ->select(array("name", "slug")) - ->from("items") - ->where("left_ptr", "<=", $this->left_ptr) - ->where("right_ptr", ">=", $this->right_ptr) - ->where("id", "<>", 1) - ->order_by("left_ptr", "ASC") - ->execute() as $row) { - // Don't encode the names segment - $names[] = rawurlencode($row->name); - $slugs[] = rawurlencode($row->slug); - } - $this->relative_path_cache = implode($names, "/"); - $this->relative_url_cache = implode($slugs, "/"); - return $this; - } - - /** - * Return the relative path to this item's file. Note that the components of the path are - * urlencoded so if you want to use this as a filesystem path, you need to call urldecode - * on it. - * @return string - */ - public function relative_path() { - if (!$this->loaded()) { - return; - } - - if (!isset($this->relative_path_cache)) { - $this->_build_relative_caches()->save(); - } - return $this->relative_path_cache; - } - - /** - * Return the relative url to this item's file. - * @return string - */ - public function relative_url() { - if (!$this->loaded()) { - return; - } - - if (!isset($this->relative_url_cache)) { - $this->_build_relative_caches()->save(); - } - return $this->relative_url_cache; - } - - /** - * @see ORM::__get() - */ - public function __get($column) { - if ($column == "owner") { - // This relationship depends on an outside module, which may not be present so handle - // failures gracefully. - try { - return identity::lookup_user($this->owner_id); - } catch (Exception $e) { - return null; - } - } else { - return parent::__get($column); - } - } - - /** - * Handle any business logic necessary to create or modify an item. - * @see ORM::save() - * - * @return ORM Item_Model - */ - public function save() { - $significant_changes = $this->changed; - unset($significant_changes["view_count"]); - unset($significant_changes["relative_url_cache"]); - unset($significant_changes["relative_path_cache"]); - - if ((!empty($this->changed) && $significant_changes) || isset($this->data_file)) { - $this->updated = time(); - if (!$this->loaded()) { - // Create a new item. - - // Set a weight if it's missing. We don't do this in the constructor because it's not a - // simple assignment. - if (empty($this->weight)) { - $this->weight = item::get_max_weight(); - } - - // Make an url friendly slug from the name, if necessary - if (empty($this->slug)) { - $tmp = pathinfo($this->name, PATHINFO_FILENAME); - $tmp = preg_replace("/[^A-Za-z0-9-_]+/", "-", $tmp); - $this->slug = trim($tmp, "-"); - - // If the filename is all invalid characters, then the slug may be empty here. Pick a - // random value. - if (empty($this->slug)) { - $this->slug = (string)rand(1000, 9999); - } - } - - // Get the width, height and mime type from our data file for photos and movies. - if ($this->is_photo() || $this->is_movie() || $this->is_embed()) { - if ($this->is_photo() || $this->is_embed()) { - list ($this->width, $this->height, $this->mime_type, $extension) = - photo::get_file_metadata($this->data_file); - } else if ($this->is_movie()) { - list ($this->width, $this->height, $this->mime_type, $extension) = - movie::get_file_metadata($this->data_file); - } - - // Force an extension onto the name if necessary - $pi = pathinfo($this->data_file); - if (empty($pi["extension"])) { - $this->name = "{$this->name}.$extension"; - } - } - - // Randomize the name or slug if there's a conflict. Preserve the extension. - // @todo Improve this. Random numbers are not user friendly - $base_name = pathinfo($this->name, PATHINFO_FILENAME); - $base_ext = pathinfo($this->name, PATHINFO_EXTENSION); - $base_slug = $this->slug; - while (ORM::factory("item") - ->where("parent_id", "=", $this->parent_id) - ->and_open() - ->where("name", "=", $this->name) - ->or_where("slug", "=", $this->slug) - ->close() - ->find()->id) { - $rand = rand(); - if ($base_ext) { - $this->name = "$base_name-$rand.$base_ext"; - } else { - $this->name = "$base_name-$rand"; - } - $this->slug = "$base_slug-$rand"; - } - - parent::save(); - - // Build our url caches, then save again. We have to do this after it's already been - // saved once because we use only information from the database to build the paths. If we - // could depend on a save happening later we could defer this 2nd save. - $this->_build_relative_caches(); - parent::save(); - - // Take any actions that we can only do once all our paths are set correctly after saving. - switch ($this->type) { - case "album": - mkdir($this->file_path()); - mkdir(dirname($this->thumb_path())); - mkdir(dirname($this->resize_path())); - break; - - case "photo": - case "movie": - case "embed": - // The thumb or resize may already exist in the case where a movie and a photo generate - // a thumbnail of the same name (eg, foo.flv movie and foo.jpg photo will generate - // foo.jpg thumbnail). If that happens, randomize and save again. - if (file_exists($this->resize_path()) || - file_exists($this->thumb_path())) { - $pi = pathinfo($this->name); - $this->name = $pi["filename"] . "-" . rand() . "." . $pi["extension"]; - parent::save(); - } - - copy($this->data_file, $this->file_path()); - break; - } - - // This will almost definitely trigger another save, so put it at the end so that we're - // tail recursive. - module::event("item_created", $this); - } else { - // Update an existing item - - // If any significant fields have changed, load up a copy of the original item and - // keep it around. - $original = ORM::factory("item", $this->id); - if (array_intersect($this->changed, array("parent_id", "name", "slug"))) { - $original->_build_relative_caches(); - $this->relative_path_cache = null; - $this->relative_url_cache = null; - } - - parent::save(); - - // Now update the filesystem and any database caches if there were significant value - // changes. If anything past this point fails, then we'll have an inconsistent database - // so this code should be as robust as we can make it. - - // Update the MPTT pointers, if necessary. We have to do this before we generate any - // cached paths! - if ($original->parent_id != $this->parent_id) { - parent::move_to($this->parent()); - } - - if ($original->parent_id != $this->parent_id || $original->name != $this->name) { - // Move all of the items associated data files - @rename($original->file_path(), $this->file_path()); - if ($this->is_album()) { - @rename(dirname($original->resize_path()), dirname($this->resize_path())); - @rename(dirname($original->thumb_path()), dirname($this->thumb_path())); - } else { - @rename($original->resize_path(), $this->resize_path()); - @rename($original->thumb_path(), $this->thumb_path()); - } - - if ($original->parent_id != $this->parent_id) { - // This will result in 2 events since we'll still fire the item_updated event below - module::event("item_moved", $this, $original->parent()); - } - } - - // Changing the name, slug or parent ripples downwards - if ($this->is_album() && - ($original->name != $this->name || - $original->slug != $this->slug || - $original->parent_id != $this->parent_id)) { - db::build() - ->update("items") - ->set("relative_url_cache", null) - ->set("relative_path_cache", null) - ->where("left_ptr", ">", $this->left_ptr) - ->where("right_ptr", "<", $this->right_ptr) - ->execute(); - } - - // Replace the data file, if requested. - // @todo: we don't handle the case where you swap in a file of a different mime type - // should we prevent that in validation? or in set_data_file() - if ($this->data_file && ($this->is_photo() || $this->is_movie())) { - copy($this->data_file, $this->file_path()); - - // Get the width, height and mime type from our data file for photos and movies. - if ($this->is_photo() || $this->is_embed()) { - list ($this->width, $this->height) = photo::get_file_metadata($this->file_path()); - } else if ($this->is_movie()) { - list ($this->width, $this->height) = movie::get_file_metadata($this->file_path()); - } - $this->thumb_dirty = 1; - $this->resize_dirty = 1; - } - - module::event("item_updated", $original, $this); - - if ($this->data_file) { - // Null out the data file variable here, otherwise this event will trigger another - // save() which will think that we're doing another file move. - $this->data_file = null; - module::event("item_updated_data_file", $this); - } - } - } else if (!empty($this->changed)) { - // Insignificant changes only. Don't fire events or do any special checking to try to keep - // this lightweight. - parent::save(); - } - - return $this; - } - - /** - * Return the Item_Model representing the cover for this album. - * @return Item_Model or null if there's no cover - */ - public function album_cover() { - if (!$this->is_album()) { - return null; - } - - if (empty($this->album_cover_item_id)) { - return null; - } - - try { - return model_cache::get("item", $this->album_cover_item_id); - } catch (Exception $e) { - // It's possible (unlikely) that the item was deleted, if so keep going. - return null; - } - } - - /** - * Find the position of the given child id in this album. The resulting value is 1-indexed, so - * the first child in the album is at position 1. - */ - public function get_position($child, $where=array()) { - if ($this->sort_order == "DESC") { - $comp = ">"; - } else { - $comp = "<"; - } - $db = db::build(); - - // If the comparison column has NULLs in it, we can't use comparators on it and will have to - // deal with it the hard way. - $count = $db->from("items") - ->where("parent_id", "=", $this->id) - ->where($this->sort_column, "IS", null) - ->merge_where($where) - ->count_records(); - - if (empty($count)) { - // There are no NULLs in the sort column, so we can just use it directly. - $sort_column = $this->sort_column; - - $position = $db->from("items") - ->where("parent_id", "=", $this->id) - ->where($sort_column, $comp, $child->$sort_column) - ->merge_where($where) - ->count_records(); - - // We stopped short of our target value in the sort (notice that we're using a < comparator - // above) because it's possible that we have duplicate values in the sort column. An - // equality check would just arbitrarily pick one of those multiple possible equivalent - // columns, which would mean that if you choose a sort order that has duplicates, it'd pick - // any one of them as the child's "position". - // - // Fix this by doing a 2nd query where we iterate over the equivalent columns and add them to - // our base value. - foreach ($db - ->select("id") - ->from("items") - ->where("parent_id", "=", $this->id) - ->where($sort_column, "=", $child->$sort_column) - ->merge_where($where) - ->order_by(array("id" => "ASC")) - ->execute() as $row) { - $position++; - if ($row->id == $child->id) { - break; - } - } - } else { - // There are NULLs in the sort column, so we can't use MySQL comparators. Fall back to - // iterating over every child row to get to the current one. This can be wildly inefficient - // for really large albums, but it should be a rare case that the user is sorting an album - // with null values in the sort column. - // - // Reproduce the children() functionality here using Database directly to avoid loading the - // whole ORM for each row. - $order_by = array($this->sort_column => $this->sort_order); - // Use id as a tie breaker - if ($this->sort_column != "id") { - $order_by["id"] = "ASC"; - } - - $position = 0; - foreach ($db->select("id") - ->from("items") - ->where("parent_id", "=", $this->id) - ->merge_where($where) - ->order_by($order_by) - ->execute() as $row) { - $position++; - if ($row->id == $child->id) { - break; - } - } - } - - return $position; - } - - /** - * Return an tag for the thumbnail. - * @param array $extra_attrs Extra attributes to add to the img tag - * @param int (optional) $max Maximum size of the thumbnail (default: null) - * @param boolean (optional) $center_vertically Center vertically (default: false) - * @return string - */ - public function thumb_img($extra_attrs=array(), $max=null, $center_vertically=false) { - list ($height, $width) = $this->scale_dimensions($max); - if ($center_vertically && $max) { - // The constant is divide by 2 to calculate the file and 10 to convert to em - $margin_top = ($max - $height) / 20; - $extra_attrs["style"] = "margin-top: {$margin_top}em"; - $extra_attrs["title"] = $this->title; - } - $attrs = array_merge($extra_attrs, - array( - "src" => $this->thumb_url(), - "alt" => $this->title, - "width" => $width, - "height" => $height) - ); - // html::image forces an absolute url which we don't want - return ""; - } - - /** - * Calculate the largest width/height that fits inside the given maximum, while preserving the - * aspect ratio. - * @param int $max Maximum size of the largest dimension - * @return array - */ - public function scale_dimensions($max) { - $width = $this->thumb_width; - $height = $this->thumb_height; - - if ($height) { - if (isset($max)) { - if ($width > $height) { - $height = (int)($max * ($height / $width)); - $width = $max; - } else { - $width = (int)($max * ($width / $height)); - $height = $max; - } - } - } else { - // Missing thumbnail, can happen on albums with no photos yet. - // @todo we should enforce a placeholder for those albums. - $width = 0; - $height = 0; - } - return array($height, $width); - } - - /** - * Return an tag for the resize. - * @param array $extra_attrs Extra attributes to add to the img tag - * @return string - */ - public function resize_img($extra_attrs) { - $attrs = array_merge($extra_attrs, - array("src" => $this->resize_url(), - "alt" => $this->title, - "width" => $this->resize_width, - "height" => $this->resize_height) - ); - // html::image forces an absolute url which we don't want - return ""; - } - - /** - * Return a flowplayer + \ No newline at end of file