/** * Check for, and handle, image editing actions. * * @param string $actionID The action identifier. * * @return boolean True if an action was handled, otherwise false. * @throws Ansel_Exception */ public static function editActions($actionID) { global $notification, $page_output, $registry; $ansel_storage = $GLOBALS['injector']->getInstance('Ansel_Storage'); $gallery_id = Horde_Util::getFormData('gallery'); $image_id = Horde_Util::getFormData('image'); $date = Ansel::getDateParameter(); $page = Horde_Util::getFormData('page', 0); $watermark_font = Horde_Util::getFormData('font'); $watermark_halign = Horde_Util::getFormData('whalign'); $watermark_valign = Horde_Util::getFormData('wvalign'); $watermark = Horde_Util::getFormData('watermark', $GLOBALS['prefs']->getValue('watermark_text')); // Get the gallery object and style information. try { $gallery = $ansel_storage->getGallery($gallery_id); } catch (Ansel_Exception $e) { $notification->push(sprintf(_("Gallery %s not found."), $gallery_id), 'horde.error'); Ansel::getUrlFor('view', array('view' => 'List'), true)->redirect(); exit; } switch ($actionID) { case 'modify': try { $image = $ansel_storage->getImage($image_id); $ret = Horde_Util::getFormData('ret', 'gallery'); } catch (Ansel_Exception $e) { $notification->push(_("Photo not found."), 'horde.error'); Ansel::getUrlFor('view', array('view' => 'List'), true)->redirect(); exit; } $title = sprintf(_("Edit properties :: %s"), $image->filename); // Set up the form object. $vars = Horde_Variables::getDefaultVariables(); if ($ret == 'gallery') { $vars->set('actionID', 'saveclose'); } else { $vars->set('actionID', 'savecloseimage'); } $form = new Ansel_Form_Image($vars, $title); $renderer = new Horde_Form_Renderer(); // Set up the gallery attributes. $vars->set('image_default', $image->id == $gallery->get('default')); $vars->set('image_desc', $image->caption); $vars->set('image_tags', implode(', ', $image->getTags())); $vars->set('image_originalDate', $image->originalDate); $vars->set('image_uploaded', $image->uploaded); $page_output->header(array('title' => $title)); $form->renderActive($renderer, $vars, Horde::url('image.php'), 'post', 'multipart/form-data'); $page_output->footer(); exit; case 'savecloseimage': case 'saveclose': case 'save': $title = _("Save Photo"); if (!$gallery->hasPermission($registry->getAuth(), Horde_Perms::EDIT)) { $notification->push(_("Access denied saving photo to this gallery."), 'horde.error'); Ansel::getUrlFor('view', array_merge(array('gallery' => $gallery_id, 'slug' => $gallery->get('slug'), 'view' => 'Gallery', 'page' => $page), $date), true)->redirect(); exit; } // Validate the form object. $vars = Horde_Variables::getDefaultVariables(); $vars->set('actionID', 'save'); $renderer = new Horde_Form_Renderer(); $form = new Ansel_Form_Image($vars, _("Edit a photo")); // Update existing image. if ($form->validate($vars)) { $form->getInfo($vars, $info); // Replacing photo if (!empty($info['file0']['file'])) { try { $GLOBALS['browser']->wasFileUploaded('file0'); if (filesize($info['file0']['file'])) { $data = file_get_contents($info['file0']['file']); if (getimagesize($info['file0']['file']) === false) { $notification->push(_("The file you uploaded does not appear to be a valid photo."), 'horde.error'); unset($data); } } } catch (Horde_Browser_Exception $e) { } } $image = $ansel_storage->getImage($image_id); $image->caption = $vars->get('image_desc'); $image->setTags(explode(',', $vars->get('image_tags'))); $newDate = new Horde_Date($vars->get('image_originalDate')); $image->originalDate = (int) $newDate->timestamp(); if (!empty($data)) { try { $image->replace($data); } catch (Ansel_Exception $e) { $notification->push(_("There was an error replacing the photo."), 'horde.error'); } } $image->save(); if ($vars->get('image_default')) { if ($gallery->get('default') != $image_id) { // Changing default - force refresh of stack // If we have a default-pretty already, make sure we delete it $ids = unserialize($gallery->get('default_prettythumb')); if (is_array($ids)) { foreach ($ids as $imageId) { $gallery->removeImage($imageId, true); } } $gallery->set('default_prettythumb', ''); } $gallery->set('default', $image_id); $gallery->set('default_type', 'manual'); } elseif ($gallery->get('default') == $image_id) { // Currently set as default, but we no longer wish it. $gallery->set('default', 0); $gallery->set('default_type', 'auto'); // If we have a default-pretty already, make sure we delete it $ids = unserialize($gallery->get('default_prettythumb')); if (is_array($ids)) { foreach ($ids as $imageId) { $gallery->removeImage($imageId); } } $gallery->set('default_prettythumb', ''); } $gallery->save(); $imageurl = Ansel::getUrlFor('view', array_merge(array('gallery' => $gallery_id, 'image' => $image_id, 'view' => 'Image', 'page' => $page), $date), true); if ($actionID == 'save') { $imageurl->redirect(); } elseif ($actionID == 'saveclose') { $page_output->addInlineScript(array('window.opener.location.href = window.opener.location.href;', 'window.close();')); $page_output->outputInlineScript(); } else { $page_output->addInlineScript(array('window.opener.location.href = "' . $imageurl . '";', 'window.close();')); $page_output->outputInlineScript(); } exit; } break; case 'editimage': case 'cropedit': case 'resizeedit': $imageGenerator_url = Ansel::getUrlFor('view', array_merge(array('gallery' => $gallery_id, 'image' => $image_id, 'view' => 'Image', 'page' => $page), $date), true); $imageurl = Horde::url('image.php')->add(array_merge(array('gallery' => $gallery_id, 'slug' => $gallery->get('slug'), 'image' => $image_id, 'page' => $page), $date)); $galleryurl = Ansel::getUrlFor('view', array_merge(array('gallery' => $gallery_id, 'page' => $page, 'view' => 'Gallery', 'slug' => $gallery->get('slug')), $date)); if (!$gallery->hasPermission($registry->getAuth(), Horde_Perms::EDIT)) { $notification->push(_("Access denied editing the photo."), 'horde.error'); // Return to the image view. $imageGenerator_url->redirect(); exit; } // Retrieve image details. $image = $ansel_storage->getImage($image_id); $title = sprintf(_("Edit %s :: %s"), $gallery->get('name'), $image->filename); if ($actionID == 'cropedit') { $geometry = $image->getDimensions('full'); $x1 = 0; $y1 = 0; $x2 = $geometry['width']; $y2 = $geometry['height']; // js and css files $page_output->addScriptFile('scriptaculous/builder.js', 'horde'); $page_output->addScriptFile('scriptaculous/effects.js', 'horde'); $page_output->addScriptFile('scriptaculous/controls.js', 'horde'); $page_output->addScriptFile('scriptaculous/dragdrop.js', 'horde'); $page_output->addScriptFile('cropper.js'); $page_output->addInlineScript('imageCropper.init();', true); $page_output->addThemeStylesheet('cropper.css'); } elseif ($actionID == 'resizeedit') { // js and css files $geometry = $image->getDimensions('full'); $page_output->addScriptFile('scriptaculous/builder.js', 'horde'); $page_output->addScriptFile('scriptaculous/effects.js', 'horde'); $page_output->addScriptFile('scriptaculous/controls.js', 'horde'); $page_output->addScriptFile('scriptaculous/dragdrop.js', 'horde'); $page_output->addScriptFile('scriptaculous/slider.js', 'horde'); $page_output->addScriptFile('resizeimage.js'); $js = array('window.Ansel = window.Ansel || {}', 'Ansel.image_geometry = ' . Horde_Serialize::serialize($geometry, Horde_Serialize::JSON), "Ansel.slider = new Control.Slider(\n 'handle1',\n 'slider-track',\n {\n minimum: 1,\n maximum: Ansel.image_geometry['width'],\n sliderValue: Ansel.image_geometry['width'],\n handleImage: 'ansel_slider_img',\n axis: 'horizontal',\n onChange: function(e) { resizeImage(e * Ansel.image_geometry['width']); },\n onSlide: function(e) { resizeImage(e * Ansel.image_geometry['width']); }\n }\n );"); $page_output->addInlineScript($js, true); } $page_output->header(array('title' => $title)); $notification->notify(array('listeners' => 'status')); if ($actionID == 'cropedit') { require ANSEL_TEMPLATES . '/image/crop_image.inc'; } elseif ($actionID == 'resizeedit') { require ANSEL_TEMPLATES . '/image/resize_image.inc'; } else { require ANSEL_TEMPLATES . '/image/edit_image.inc'; } $page_output->footer(); exit; case 'watermark': if ($watermark) { $identity = $injector->getInstance('Horde_Core_Factory_Identity')->create(); $name = $identity->getValue('fullname'); if (empty($name)) { $name = $registry->getAuth(); } // Set up array of possible substitutions. $watermark_array = array('%N' => $name, '%L' => $registry->getAuth()); $watermark = str_replace(array_keys($watermark_array), array_values($watermark_array), $watermark); $watermark = strftime($watermark); } if (!$gallery->hasPermission($registry->getAuth(), Horde_Perms::EDIT)) { $notification->push(_("Access denied saving photo to this gallery."), 'horde.error'); // Return to the image view Ansel::getUrlFor('view', array_merge(array('gallery' => $gallery_id, 'image' => $image_id, 'view' => 'Image', 'page' => $page, 'slug' => $gallery->get('slug')), $date), true)->redirect(); exit; } else { $image = $ansel_storage->getImage($image_id); $image->watermark('screen', $watermark, $watermark_halign, $watermark_valign, $watermark_font); $image->updateData($image->raw('screen'), 'screen'); Horde::url('image.php', true)->add(array_merge(array('gallery' => $gallery_id, 'image' => $image_id, 'actionID' => 'editimage', 'page' => $page), $date))->redirect(); exit; } case 'rotate90': case 'rotate180': case 'rotate270': case 'flip': case 'mirror': case 'grayscale': case 'crop': case 'resize': if (!$gallery->hasPermission($registry->getAuth(), Horde_Perms::EDIT)) { $notification->push(_("Access denied saving photo to this gallery."), 'horde.error'); } else { try { $image = $ansel_storage->getImage($image_id); } catch (Ansel_Exception $e) { $notification->push($e->getMessage(), 'horde.error'); Ansel::getUrlFor('view', array('view' => 'List'), true)->redirect(); exit; } switch ($actionID) { case 'rotate90': case 'rotate180': case 'rotate270': $angle = intval(substr($actionID, 6)); try { $image->rotate('full', $angle); } catch (Ansel_Exception $e) { Horde::log($e->getMessage(), 'ERR'); $notification->push($e->getMessage(), 'horde.error'); $error = true; } break; case 'flip': try { $image->flip('full'); } catch (Ansel_Exception $e) { Horde::log($e->getMessage(), 'ERR'); $notification->push($e->getMessage(), 'horde.error'); $error = true; } break; case 'mirror': try { $image->mirror('full'); } catch (Ansel_Exception $e) { Horde::log($e->getMessage(), 'ERR'); $notification->push($e->getMessage(), 'horde.error'); $error = true; } break; case 'grayscale': try { $image->grayscale('full'); } catch (Ansel_Exception $e) { Horde::log($e->getMessage(), 'ERR'); $notification->push($e->getMessage(), 'horde.error'); $error = true; } break; case 'crop': $image->load('full'); $params = Horde_Util::getFormData('params'); list($x1, $y1, $x2, $y2) = explode('.', $params); try { $image->crop($x1, $y1, $x2, $y2); } catch (Ansel_Exception $e) { Horde::log($e->getMessage(), 'ERR'); $notification->push($e->getMessage(), 'horde.error'); $error = true; } break; case 'resize': $image->load('full'); $width = Horde_Util::getFormData('width'); $height = Horde_Util::getFormData('height'); try { $image->resize($width, $height, true); } catch (Ansel_Exception $e) { Horde::log($e->getMessage(), 'ERR'); $notification->push($e->getMessage(), 'horde.error'); $error = true; } break; } if (empty($error)) { $image->updateData($image->raw()); } } Horde::url('image.php', true)->add(array_merge(array('gallery' => $gallery_id, 'image' => $image_id, 'actionID' => 'editimage', 'page' => $page), $date))->redirect(); exit; case 'setwatermark': $title = _("Watermark"); try { $image = $ansel_storage->getImage($image_id); } catch (Ansel_Exception $e) { $notification->push($image->getMessage(), 'horde.error'); Ansel::getUrlFor('view', array('view' => 'List'), true)->redirect(); exit; } $vars = Horde_Variables::getDefaultVariables(); $vars->set('actionID', 'previewcustomwatermark'); $form = new Ansel_Form_Watermark($vars, _("Watermark")); $renderer = new Horde_Form_Renderer(); $page_output->header(array('title' => $title)); $form->renderActive($renderer, $vars, Horde::url('image.php'), 'post'); $page_output->footer(); exit; case 'previewcustomwatermark': $imageurl = Horde::url('image.php', true)->add(array_merge(array('gallery' => $gallery_id, 'image' => $image_id, 'page' => $page, 'watermark' => $watermark, 'font' => $watermark_font, 'whalign' => $watermark_halign, 'wvalign' => $watermark_valign, 'actionID' => 'previewwatermark'), $date)); $page_output->addInlineScript(array('window.opener.location.href = "' . $imageurl . '";', 'window.close();')); $page_output->outputInlineScript(); exit; case 'previewgrayscale': case 'previewwatermark': case 'previewflip': case 'previewmirror': case 'previewrotate90': case 'previewrotate180': case 'previewrotate270': $title = _("Edit Photo"); $action = substr($actionID, 7); $image = $ansel_storage->getImage($image_id); $title = sprintf(_("Preview changes for %s :: %s"), $gallery->get('name'), $image->filename); $page_output->header(array('title' => $title)); require ANSEL_TEMPLATES . '/image/preview_image.inc'; $page_output->footer(); exit; case 'imagerotate90': case 'imagerotate180': case 'imagerotate270': $view = Horde_Util::getFormData('view'); $angle = intval(substr($actionID, 11)); $image = $ansel_storage->getImage($image_id); $image->rotate($view, $angle); $image->display($view); exit; case 'imageflip': $view = Horde_Util::getFormData('view'); $image = $ansel_storage->getImage($image_id); $image->flip($view); $image->display($view); exit; case 'imagemirror': $view = Horde_Util::getFormData('view'); $image = $ansel_storage->getImage($image_id); $image->mirror($view); $image->display($view); exit; case 'imagegrayscale': $view = Horde_Util::getFormData('view'); $image = $ansel_storage->getImage($image_id); $image->grayscale($view); $image->display($view); exit; case 'imagewatermark': $view = Horde_Util::getFormData('view'); $image = $ansel_storage->getImage($image_id); $image->watermark($view, $watermark, $watermark_halign, $watermark_valign, $watermark_font); $image->display($view); exit; case 'previewcrop': if (!$gallery->hasPermission($registry->getAuth(), Horde_Perms::EDIT)) { $notification->push(_("Access denied editing the photo."), 'horde.error'); Ansel::getUrlFor('view', array('gallery' => $gallery_id, 'image' => $image_id, 'view' => 'Image', 'page' => $page))->redirect(); } else { $x1 = (int) Horde_Util::getFormData('x1'); $y1 = (int) Horde_Util::getFormData('y1'); $x2 = (int) Horde_Util::getFormData('x2'); $y2 = (int) Horde_Util::getFormData('y2'); $title = _("Crop"); $action = substr($actionID, 7); $image = $ansel_storage->getImage($image_id); $title = sprintf(_("Preview changes for %s :: %s"), $gallery->get('name'), $image->filename); $params = $x1 . '.' . $y1 . '.' . $x2 . '.' . $y2; $page_output->header(array('title' => $title)); require ANSEL_TEMPLATES . '/image/preview_cropimage.inc'; $page_output->footer(); } exit; case 'imagecrop': if ($gallery->hasPermission($registry->getAuth(), Horde_Perms::EDIT)) { $params = Horde_Util::getFormData('params'); list($x1, $y1, $x2, $y2) = explode('.', $params); $image = $ansel_storage->getImage($image_id); $image->load('full'); $image->crop($x1, $y1, $x2, $y2); $image->display(); } exit; } return false; }