public function chooseVariation(EventInterface $event) {
        $request = $event->getRequest();
        $response = $event->getResponse();

        $user = $request->getUser();
        $imageIdentifier = $request->getImageIdentifier();

        // Fetch the transformations from the request and find the max width used in the set
        $transformations = $request->getTransformations();

        if (!$transformations) {
            // No transformations in the request
            return;
        }

        $transformationManager = $event->getTransformationManager();
        $maxSize = $transformationManager->getMinimumImageInputSize($event);

        if (!$maxSize) {
            // No need to use a variation based on the set of transformations
            return;
        }

        // Fetch the original width / height of the image to use for ratio calculations
        $image = $response->getModel();
        $imageWidth = $image->getWidth();
        $imageHeight = $image->getHeight();

        // Fetch the index of the transformation that decided the max width, and the width itself
        $transformationIndex = $maxSize['index'];
        $maxWidth = $maxSize['width'];

        if ($maxWidth >= $imageWidth) {
            // The width is the same or above the original, use the original
            return;
        }

        // WE HAVE A WINNER! Find the best variation. The width of the variation is the first
        // available one above the $maxWidth value
        $variation = $this->database->getBestMatch($user, $imageIdentifier, $maxWidth);

        if (!$variation) {
            // Could not find any :(
            return;
        }

        // Now that we have a variation we can use we need to adjust some of the transformation
        // parameters.
        $event->getManager()->trigger('image.transformations.adjust', [
            'transformationIndex' => $transformationIndex,
            'ratio' => $imageWidth / $variation['width'],
        ]);

        // Fetch the image variation blob from the storage adapter
        $imageBlob = $this->storage->getImageVariation($user, $imageIdentifier, $variation['width']);

        if (!$imageBlob) {
            // The image blob does not exist in the storage, which it should. Trigger an error and
            // return
            trigger_error('Image variation storage is not in sync with the image variation database', E_USER_WARNING);
            return;
        }

        // Set some data that the storage operations listener usually sets, since that will be
        // skipped since we have an image variation
        $lastModified = $event->getStorage()->getLastModified($user, $imageIdentifier);
        $response->setLastModified($lastModified);

        // Update the model
        $model = $response->getModel();
        $model->setBlob($imageBlob)
              ->setWidth($variation['width'])
              ->setHeight($variation['height']);

        // Set a HTTP header that informs the user agent on which image variation that was used in
        // the transformations
        $response->headers->set('X-Imbo-ImageVariation', $variation['width'] . 'x' . $variation['height']);

        // Stop the propagation of this event
        $event->stopPropagation();
        $event->getManager()->trigger('image.loaded');
    }
public function chooseVariation(EventInterface $event) {
        $request = $event->getRequest();
        $response = $event->getResponse();

        $user = $request->getUser();
        $imageIdentifier = $request->getImageIdentifier();

        // Fetch the transformations from the request and find the max width used in the set
        $transformations = $request->getTransformations();

        if (!$transformations) {
            // No transformations in the request
            return;
        }

        $transformationManager = $event->getTransformationManager();
        $maxSize = $transformationManager->getMinimumImageInputSize($event);

        if (!$maxSize) {
            // No need to use a variation based on the set of transformations
            return;
        }

        // Fetch the original width / height of the image to use for ratio calculations
        $image = $response->getModel();
        $imageWidth = $image->getWidth();
        $imageHeight = $image->getHeight();

        // Fetch the index of the transformation that decided the max width, and the width itself
        $transformationIndex = $maxSize['index'];
        $maxWidth = $maxSize['width'];

        if ($maxWidth >= $imageWidth) {
            // The width is the same or above the original, use the original
            return;
        }

        // WE HAVE A WINNER! Find the best variation. The width of the variation is the first
        // available one above the $maxWidth value
        $variation = $this->database->getBestMatch($user, $imageIdentifier, $maxWidth);

        if (!$variation) {
            // Could not find any :(
            return;
        }

        // Now that we have a variation we can use we need to adjust some of the transformation
        // parameters.
        $event->getManager()->trigger('image.transformations.adjust', [
            'transformationIndex' => $transformationIndex,
            'ratio' => $imageWidth / $variation['width'],
        ]);

        // Fetch the image variation blob from the storage adapter
        $imageBlob = $this->storage->getImageVariation($user, $imageIdentifier, $variation['width']);

        if (!$imageBlob) {
            // The image blob does not exist in the storage, which it should. Trigger an error and
            // return
            trigger_error('Image variation storage is not in sync with the image variation database', E_USER_WARNING);
            return;
        }

        // Set some data that the storage operations listener usually sets, since that will be
        // skipped since we have an image variation
        $lastModified = $event->getStorage()->getLastModified($user, $imageIdentifier);
        $response->setLastModified($lastModified);

        // Update the model
        $model = $response->getModel();
        $model->setBlob($imageBlob)
              ->setWidth($variation['width'])
              ->setHeight($variation['height']);

        // Set a HTTP header that informs the user agent on which image variation that was used in
        // the transformations
        $response->headers->set('X-Imbo-ImageVariation', $variation['width'] . 'x' . $variation['height']);

        // Stop the propagation of this event
        $event->stopPropagation();
        $event->getManager()->trigger('image.loaded');
    }
public function chooseVariation ( EventInterface $ event ) { $ request = $ event -> getRequest ( ) ; $ response = $ event -> getResponse ( ) ; $ user = $ request -> getUser ( ) ; $ imageIdentifier = $ request -> getImageIdentifier ( ) ; // Fetch the transformations from the request and find the max width used in the set $ transformations = $ request -> getTransformations ( ) ; if ( ! $ transformations ) { // No transformations in the request return ; } $ transformationManager = $ event -> getTransformationManager ( ) ; $ maxSize = $ transformationManager -> getMinimumImageInputSize ( $ event ) ; if ( ! $ maxSize ) { // No need to use a variation based on the set of transformations return ; } // Fetch the original width / height of the image to use for ratio calculations $ image = $ response -> getModel ( ) ; $ imageWidth = $ image -> getWidth ( ) ; $ imageHeight = $ image -> getHeight ( ) ; // Fetch the index of the transformation that decided the max width, and the width itself $ transformationIndex = $ maxSize [ 'index' ] ; $ maxWidth = $ maxSize [ 'width' ] ; if ( $ maxWidth >= $ imageWidth ) { // The width is the same or above the original, use the original return ; } // WE HAVE A WINNER! Find the best variation. The width of the variation is the first // available one above the $maxWidth value $ variation = $ this -> database -> getBestMatch ( $ user , $ imageIdentifier , $ maxWidth ) ; if ( ! $ variation ) { // Could not find any :( return ; } // Now that we have a variation we can use we need to adjust some of the transformation // parameters. $ event -> getManager ( ) -> trigger ( 'image.transformations.adjust' , [ 'transformationIndex' => $ transformationIndex , 'ratio' => $ imageWidth / $ variation [ 'width' ] , ] ) ; // Fetch the image variation blob from the storage adapter $ imageBlob = $ this -> storage -> getImageVariation ( $ user , $ imageIdentifier , $ variation [ 'width' ] ) ; if ( ! $ imageBlob ) { // The image blob does not exist in the storage, which it should. Trigger an error and // return trigger_error ( 'Image variation storage is not in sync with the image variation database' , E_USER_WARNING ) ; return ; } // Set some data that the storage operations listener usually sets, since that will be // skipped since we have an image variation $ lastModified = $ event -> getStorage ( ) -> getLastModified ( $ user , $ imageIdentifier ) ; $ response -> setLastModified ( $ lastModified ) ; // Update the model $ model = $ response -> getModel ( ) ; $ model -> setBlob ( $ imageBlob ) -> setWidth ( $ variation [ 'width' ] ) -> setHeight ( $ variation [ 'height' ] ) ; // Set a HTTP header that informs the user agent on which image variation that was used in // the transformations $ response -> headers -> set ( 'X-Imbo-ImageVariation' , $ variation [ 'width' ] . 'x' . $ variation [ 'height' ] ) ; // Stop the propagation of this event $ event -> stopPropagation ( ) ; $ event -> getManager ( ) -> trigger ( 'image.loaded' ) ; }
Choose an image variation based on the transformations and the original size of the image

@param EventInterface $event The current event
Choose an image variation based on the transformations and the original size of the image