Completed
Pull Request — develop (#359)
by Mathias
23:51
created

ImageSetHydrator::extract()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 4
nc 2
nop 1
1
<?php
2
/**
3
 * YAWIK
4
 *
5
 * @filesource
6
 * @license MIT
7
 * @copyright  2013 - 2017 Cross Solution <http://cross-solution.de>
8
 */
9
  
10
/** */
11
namespace Core\Entity\Hydrator;
12
13
use Core\Entity\ImageSet;
14
use Core\Entity\ImageSetInterface;
15
use Core\Options\ImageSetOptions;
16
use Doctrine\MongoDB\GridFSFile;
17
use Imagine\Image\Box;
18
use Imagine\Image\ImageInterface;
19
use Imagine\Image\ImagineInterface;
20
use Zend\Hydrator\HydratorInterface;
21
22
/**
23
 * Hydrator for ImageSets.
24
 *
25
 * @see \Core\Entity\ImageSetInterface
26
 * @author Mathias Gelhausen <[email protected]>
27
 * @since 0.29
28
 */
29
class ImageSetHydrator implements HydratorInterface
30
{
31
32
    /**
33
     * Imagine
34
     *
35
     * @var \Imagine\Image\ImagineInterface
36
     */
37
    protected $imagine;
38
39
    /**
40
     * Options
41
     *
42
     * @var ImageSetOptions
43
     */
44
    protected $options;
45
46
    public function __construct(ImagineInterface $imagine, ImageSetOptions $options)
47
    {
48
        $this->imagine = $imagine;
49
        $this->options = $options;
50
    }
51
52
    /**
53
     * Extract values from an object
54
     *
55
     * @param object $object
56
     *
57
     * @return array
58
     */
59
    public function extract($object)
60
    {
61
        if (!$object instanceOf ImageSet || !($image = $object->get(ImageSetInterface::ORIGINAL))) {
62
            return [];
63
        }
64
65
        return [$this->options->getFormElementName() => $image->getId()];
66
    }
67
68
    /**
69
     * Hydrate $object with the provided $data.
70
     *
71
     * @param  array  $data
72
     * @param  object $object
73
     *
74
     * @return object
75
     */
76
    public function hydrate(array $data, $object)
77
    {
78
        if (!isset($data['original']) || UPLOAD_ERR_OK !== $data['original']['error']) {
79
            return $object;
80
        }
81
82
        $data = $data['original'];
83
        $file  = $data['tmp_name'];
84
85
        $image = $this->imagine->open($file);
86
        $imageSpecs = $this->options->getImages();
87
88
89
        $images = [ ImageSetInterface::ORIGINAL => $this->createEntity($file, $data) ];
90
91
        foreach ($imageSpecs as $key => $size) {
92
            $newImage = ImageSetInterface::THUMBNAIL == $key
93
                ? $image->thumbnail(new Box($size[0], $size[1]), ImageInterface::THUMBNAIL_INSET)
94
                : $this->createImage($image, $size);
95
96
            if ($newImage) {
97
                $entity   = $this->createEntity($newImage, $data, $key);
98
                $images[$key] = $entity;
99
            }
100
        }
101
102
        $object->setImages($images);
103
104
        return $object;
105
    }
106
107
    private function createImage(ImageInterface $image, $size)
108
    {
109
        $imageSize = $image->getSize();
110
111
        if ($imageSize->getWidth() <= $size[0] && $imageSize->getHeight() <= $size[1]) {
112
            return null;
113
        }
114
115
        if ($imageSize->getWidth() > $size[0]) {
116
            $imageSize = $imageSize->widen($size[0]);
117
        }
118
119
        if ($imageSize->getHeight() > $size[1]) {
120
            $imageSize = $imageSize->heighten($size[1]);
121
        }
122
123
        $image = $image->resize($imageSize);
124
125
        return $image;
126
    }
127
128
    private function createEntity($image, &$data, $prefix = '')
129
    {
130
        /* @var \Core\Entity\ImageInterface $entity */
131
        $entity = $this->options->getEntity();
132
133
134
        if (is_string($image)) {
135
            $file = $image;
136
        } else {
137
            $format = str_replace('image/', '', $data['type']);
138
139
            $file = new GridFSFile();
140
            $file->setBytes($image->get($format));
141
        }
142
143
        $entity
144
            ->setFile($file)
145
            ->setName(($prefix ? "$prefix-" : '') . $data['name'])
146
            ->setType($data['type'])
147
        ;
148
149
        return $entity;
150
    }
151
152
}