Brian Scramlin Posted April 20, 2017 Posted April 20, 2017 Hey Everyone, I have a question that seems like it would have an obvious answer, but I cannot wrap my mind around it: If I have <img src="<?= $page->featuredImage->size(800,500)->url ?>"/> in an article template, does my server run a resizing script every time someone requests the page? Or, is it resized only the first time it is requested? Or when the page is saved? The reason I would like to know is because I have created two image processing functions my client requires, but one of them is a paid subscription service to compress the images. I don't want to call the paid API every time a page is loaded or something. Thanks for fielding my ignorance
LostKobrakai Posted April 20, 2017 Posted April 20, 2017 The thumbnail generation does run when this code is executed and the file corresponding to the thumbnail does not exist at that time. 1
Brian Scramlin Posted April 20, 2017 Author Posted April 20, 2017 How is it possible for me to run a PHP Function on an image as it is being uploaded? This would be the ideal situation because then anywhere I need to execute the ->size() functions I don't have to re-call my compression service. Right now all over my website I have something like tinify($page->image->size(200,200)->url) instead I would rather just have the tinify() function called on the initial save. Further, if it was possible to do this for every image including CKEditor body images we would be in business! Thank you for your help.
LostKobrakai Posted April 20, 2017 Posted April 20, 2017 There are various topics around this exact use case on the forums. The short version: there's no obvious solution, but things you can do.
Zeka Posted April 20, 2017 Posted April 20, 2017 https://github.com/dsdsdsdsdsds/InputfieldImageThumbs/blob/4aaa3362ea11468d3f6b4f69748da8464910fb3a/InputfieldImageThumbs.module
horst Posted April 20, 2017 Posted April 20, 2017 1 hour ago, Brian Scramlin said: How is it possible for me to run a PHP Function on an image as it is being uploaded? This would be the ideal situation because then anywhere I need to execute the ->size() functions I don't have to re-call my compression service. Right now all over my website I have something like tinify($page->image->size(200,200)->url) instead I would rather just have the tinify() function called on the initial save. Further, if it was possible to do this for every image including CKEditor body images we would be in business! Thank you for your help. Tinifying images is ONLY useful on the final variations. Tinifying an original source image is completly WRONG. This tinifying is often misunderstood. You can resize an image on upload to variuos varirations and also tinify them, if you exactly know which variations you will need around in your site. Here is an example how to hook into upload and process something with the image: 2
Brian Scramlin Posted April 20, 2017 Author Posted April 20, 2017 Thank you, everyone. I appreciate your input. I understand in most scenarios converting the original file on upload is not the best approach. However, in this situation it seems the best way to save on calling my iMagick function and compression function. First off, I have never created a Processwire module and am intimidated by the prospect, but I am considering the suggested InputfieldImageThumbs module route. Here is the original module: class InputfieldImageThumbs extends WireData implements Module { public function init() { $this->addHookAfter('InputfieldFile::fileAdded', $this, 'createThumbs'); } public function createThumbs($event) { $inputfield = $event->object; $image = $event->arguments("pagefile"); $allowedTypes = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF); // allowed image formats $detectedType = exif_imagetype($image->filename); // check if file is an image if(!in_array($detectedType, $allowedTypes)) return; // if not, exit $widths = explode(",", $this->imageWidths, 10); // convert comma separated list to array, limit to 10 values $widths = array_filter($widths, 'ctype_digit'); // keep only numeric entries in the array foreach($widths as $width) { $image->size($width,0); // generate image for each defined width } } } Here is a stab at my attempted module. I am very new at this, so please prepare yourself class tinifyImages extends WireData implements Module { public function init() { $this->addHookAfter('InputfieldFile::fileAdded', $this, 'tinify'); } public function tinify($event) { $inputfield = $event->object; $image = $event->arguments("pagefile"); $allowedTypes = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF); // allowed image formats $detectedType = exif_imagetype($image->filename); // check if file is an image if(!in_array($detectedType, $allowedTypes)) return; // if not, exit /* Include Tinify API Resources and Initialize */ require_once("inc/tinify-php-master/lib/Tinify/Exception.php"); require_once("inc/tinify-php-master/lib/Tinify/ResultMeta.php"); require_once("inc/tinify-php-master/lib/Tinify/Result.php"); require_once("inc/tinify-php-master/lib/Tinify/Source.php"); require_once("inc/tinify-php-master/lib/Tinify/Client.php"); require_once("inc/tinify-php-master/lib/Tinify.php"); \Tinify\setKey("API_KEY"); //function used to compress with tinify api function tinify($imagePath) { $path_parts = pathinfo($imagePath); $dirname = $path_parts['dirname'] . '/'; $filename = $path_parts['filename']; $savename = $dirname . $filename . '-compressed.jpg'; if (!file_exists($_SERVER['DOCUMENT_ROOT'] . $savename)) { $source = \Tinify\fromFile($_SERVER['DOCUMENT_ROOT'] . $imagePath); $source->toFile($_SERVER['DOCUMENT_ROOT'] . $savename); } return $savename; } $image = tinify($image->url); } } ?> Am I close?
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now