Completed
Push — master ( fd8346...c1962d )
by
unknown
08:45 queued 06:48
created

MediaAdmin::prePersist()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
3
namespace MediaMonks\SonataMediaBundle\Admin;
4
5
use MediaMonks\SonataMediaBundle\Model\AbstractMedia;
6
use MediaMonks\SonataMediaBundle\Model\MediaInterface;
7
use MediaMonks\SonataMediaBundle\Provider\ProviderPool;
8
use MediaMonks\SonataMediaBundle\Provider\ProviderInterface;
9
use Sonata\AdminBundle\Admin\AbstractAdmin;
10
use Sonata\AdminBundle\Datagrid\DatagridMapper;
11
use Sonata\AdminBundle\Datagrid\ListMapper;
12
use Sonata\AdminBundle\Form\FormMapper;
13
use Sonata\AdminBundle\Route\RouteCollection;
14
use Sonata\CoreBundle\Validator\ErrorElement;
15
16
class MediaAdmin extends AbstractAdmin
17
{
18
    /**
19
     * @var ProviderPool
20
     */
21
    private $providerPool;
22
23
    /**
24
     * @var string
25
     */
26
    private $originalProviderReference;
27
28
    /**
29
     * @var string
30
     */
31
    protected $baseRouteName = 'admin_mediamonks_sonatamedia_media';
32
33
    /**
34
     * @var string
35
     */
36
    protected $baseRoutePattern = 'mediamonks/sonatamedia/media';
37
38
    /**
39
     * @param string $code
40
     * @param string $class
41
     * @param string $baseControllerName
42
     * @param ProviderPool $providerPool
43
     */
44 13
    public function __construct($code, $class, $baseControllerName, ProviderPool $providerPool)
45
    {
46 13
        parent::__construct($code, $class, $baseControllerName);
47
48 13
        $this->providerPool = $providerPool;
49 13
    }
50
51
    /**
52
     * @param ListMapper $listMapper
53
     */
54 6
    protected function configureListFields(ListMapper $listMapper)
55
    {
56
        $listMapper
57 6
            ->addIdentifier('title')
58 6
            ->add(
59 6
                'type'
60
            )
61 6
            ->add(
62 6
                'updatedAt',
63 6
                'datetime'
64
            )
65 6
            ->add(
66 6
                '_action',
67 6
                'actions',
68
                [
69 6
                    'actions' => [
70
                        'edit'   => [],
71
                        'delete' => [],
72
                    ],
73
                ]
74
            );
75 6
    }
76
77
    /**
78
     * @param FormMapper $formMapper
79
     */
80 12
    protected function configureFormFields(FormMapper $formMapper)
81
    {
82
        /**
83
         * @var AbstractMedia $media
84
         */
85 12
        $media = $this->getSubject();
86 12
        if (!$media) {
87
            $media = $this->getNewInstance();
88
        }
89
90 12
        $this->originalProviderReference = $media->getProviderReference();
91
92 12
        $provider = $this->getProvider($media);
93 11
        $provider->setMedia($media);
94
95 11
        if ($media->getId()) {
96 7
            $provider->buildEditForm($formMapper);
97
        } else {
98 11
            $provider->buildCreateForm($formMapper);
99
        }
100 11
    }
101
102
    /**
103
     * @param AbstractMedia $media
104
     */
105 7
    public function prePersist($media)
106
    {
107 7
        $this->getProvider($media)->update($media, true);
108 7
    }
109
110
    /**
111
     * @param AbstractMedia $media
112
     */
113 3
    public function preUpdate($media)
114
    {
115 3
        $this->getProvider($media)->update($media, $this->isProviderReferenceUpdated($media));
116 3
    }
117
118
    /**
119
     * @param AbstractMedia $media
120
     * @return bool
121
     */
122 3
    protected function isProviderReferenceUpdated(AbstractMedia $media)
123
    {
124 3
        return $this->originalProviderReference !== $media->getProviderReference();
125
    }
126
127
    /**
128
     * @param AbstractMedia $media
129
     * @return ProviderInterface
130
     */
131 12
    protected function getProvider(AbstractMedia $media)
132
    {
133 12
        if (empty($media->getProvider())) {
134
            throw new \InvalidArgumentException('No provider was set');
135
        }
136
137 12
        $provider = $this->providerPool->getProvider($media->getProvider());
138 11
        $media->setType($provider->getType());
139
140 11
        return $this->providerPool->getProvider($media->getProvider());
141
    }
142
143
    /**
144
     * @return AbstractMedia
145
     */
146 12
    public function getNewInstance()
147
    {
148 12
        $media = parent::getNewInstance();
149 12
        $providerName = null;
150 12
        if ($this->hasRequest()) {
151 12
            if ($this->getRequest()->isMethod('POST')) {
152 11
                $providerName = $this->getRequest()->get($this->getUniqid())['provider'];
153 12
            } elseif ($this->getRequest()->query->has('provider')) {
154 12
                $providerName = $this->getRequest()->query->get('provider');
155
            }
156
        }
157
158 12
        if (!empty($providerName)) {
159 12
            $media->setProvider($providerName);
160
        }
161
162 12
        return $media;
163
    }
164
165
    /**
166
     * @param mixed $object
167
     * @return string
168
     */
169 11
    public function toString($object)
170
    {
171 11
        return $object instanceof MediaInterface ? $object->getTitle() : 'Media';
172
    }
173
174
    /**
175
     * @param RouteCollection $collection
176
     */
177 1
    public function configureRoutes(RouteCollection $collection)
178
    {
179 1
        $collection->add('image', $this->getRouterIdParameter().'/image/{width}/{height}');
180 1
        $collection->add('download', $this->getRouterIdParameter().'/download');
181 1
    }
182
183
    /**
184
     * @param DatagridMapper $datagridMapper
185
     */
186 6
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
187
    {
188
        $datagridMapper
189 6
            ->add('title')
190 6
            ->add('type')
191 6
            ->add('provider')
192
        ;
193 6
    }
194
195
    /**
196
     * {@inheritdoc}
197
     */
198 11
    public function validate(ErrorElement $errorElement, $object)
199
    {
200 11
        $this->getProvider($object)->validate($errorElement, $object);
201 11
    }
202
}
203