loaded || $parent->type != "album") { throw new Exception("@todo INVALID_PARENT"); } if (!is_file($filename)) { throw new Exception("@todo MISSING_IMAGE_FILE"); } if (!($image_info = getimagesize($filename))) { throw new Exception("@todo INVALID_IMAGE_FILE"); } // Force an extension onto the name $pi = pathinfo($name); if (empty($pi["extension"])) { $pi["extension"] = image_type_to_extension($image_info[2], false); $name .= "." . $pi["extension"]; } $photo = ORM::factory("item"); $photo->type = "photo"; $photo->title = $title; $photo->description = $description; $photo->name = $name; $photo->owner_id = $owner_id; $photo->width = $image_info[0]; $photo->height = $image_info[1]; $photo->mime_type = empty($image_info['mime']) ? "application/unknown" : $image_info['mime']; $photo->thumb_dirty = 1; $photo->resize_dirty = 1; // Randomize the name if there's a conflict while (ORM::Factory("item") ->where("parent_id", $parent->id) ->where("name", $photo->name) ->find()->id) { // @todo Improve this. Random numbers are not user friendly $photo->name = rand() . "." . $pi["extension"]; } // This saves the photo $photo->add_to_parent($parent); copy($filename, $photo->file_path()); module::event("item_created", $photo); // Build our thumbnail/resizes graphics::generate($photo); // If the parent has no cover item, make this it. $parent = $photo->parent(); if ($parent->album_cover_item_id == null) { $parent->album_cover_item_id = $photo->id; $parent->save(); graphics::generate($parent); } return $photo; } static function get_add_form($parent) { $form = new Forge("albums/{$parent->id}", "", "post", array("id" => "gAddPhotoForm")); $group = $form->group("add_photo")->label(t("Add Photo to %album_title", array("album_title" =>$parent->title))); $group->input("name")->label(t("Name")); $group->input("title")->label(t("Title")); $group->textarea("description")->label(t("Description")); $group->upload("file")->label(t("File"))->rules("required|allow[jpg,png,gif]"); $group->hidden("type")->value("photo"); $group->submit("")->value(t("Upload")); $form->add_rules_from(ORM::factory("item")); return $form; } static function get_edit_form($photo) { $form = new Forge("photos/$photo->id", "", "post", array("id" => "gEditPhotoForm")); $form->hidden("_method")->value("put"); $group = $form->group("edit_photo")->label(t("Edit Photo")); $group->input("name")->label(t("Name"))->value($photo->name); $group->input("title")->label(t("Title"))->value($photo->title); $group->textarea("description")->label(t("Description"))->value($photo->description); $group->submit("")->value(t("Modify")); $form->add_rules_from(ORM::factory("item")); 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) { $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); } }