Completed
Push — master ( 10991b...345e86 )
by
unknown
05:55
created

MediaAdmin::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 0
cts 5
cp 0
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 4
crap 2
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
    public function __construct($code, $class, $baseControllerName, ProviderPool $providerPool)
45
    {
46
        parent::__construct($code, $class, $baseControllerName);
47
48
        $this->providerPool = $providerPool;
49
    }
50
51
    /**
52
     * @param ListMapper $listMapper
53
     */
54
    protected function configureListFields(ListMapper $listMapper)
55
    {
56
        $listMapper
57
            ->addIdentifier('title')
58
            ->add(
59
                'type'
60
            )
61
            ->add(
62
                'updatedAt',
63
                'datetime'
64
            )
65
            ->add(
66
                '_action',
67
                'actions',
68
                [
69
                    'actions' => [
70
                        'edit'   => [],
71
                        'delete' => [],
72
                    ],
73
                ]
74
            );
75
    }
76
77
    /**
78
     * @param FormMapper $formMapper
79
     */
80
    protected function configureFormFields(FormMapper $formMapper)
81
    {
82
        /**
83
         * @var AbstractMedia $media
84
         */
85
        $media = $this->getSubject();
86
        if (!$media) {
87
            $media = $this->getNewInstance();
88
        }
89
90
        $this->originalProviderReference = $media->getProviderReference();
91
92
        $provider = $this->getProvider($media);
0 ignored issues
show
Compatibility introduced by
$media of type object<MediaMonks\Sonata...e\Model\MediaInterface> is not a sub-type of object<MediaMonks\Sonata...le\Model\AbstractMedia>. It seems like you assume a concrete implementation of the interface MediaMonks\SonataMediaBundle\Model\MediaInterface to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
93
        $provider->setMedia($media);
94
95
        if ($media->getId()) {
96
            $provider->buildEditForm($formMapper);
97
        } else {
98
            $provider->buildCreateForm($formMapper);
99
        }
100
    }
101
102
    /**
103
     * @param AbstractMedia $media
104
     */
105
    public function prePersist($media)
106
    {
107
        $this->getProvider($media)->update($media, true);
108
    }
109
110
    /**
111
     * @param AbstractMedia $media
112
     */
113
    public function preUpdate($media)
114
    {
115
        $this->getProvider($media)->update($media, $this->isProviderReferenceUpdated($media));
116
    }
117
118
    /**
119
     * @param $media
120
     * @return bool
121
     */
122
    protected function isProviderReferenceUpdated(AbstractMedia $media)
123
    {
124
        return $this->originalProviderReference !== $media->getProviderReference();
125
    }
126
127
    /**
128
     * @param AbstractMedia $media
129
     * @return ProviderInterface
130
     */
131
    protected function getProvider(AbstractMedia $media)
132
    {
133
        if (empty($media->getProvider())) {
134
            throw new \InvalidArgumentException('No provider was set');
135
        }
136
137
        $provider = $this->providerPool->getProvider($media->getProvider());
138
        $media->setType($provider->getType());
139
140
        return $this->providerPool->getProvider($media->getProvider());
141
    }
142
143
    /**
144
     * @return MediaInterface
145
     */
146
    public function getNewInstance()
147
    {
148
        $media = parent::getNewInstance();
149
        $providerName = null;
150
        if ($this->hasRequest()) {
151
            if ($this->getRequest()->isMethod('POST')) {
152
                $providerName = $this->getRequest()->get($this->getUniqid())['provider'];
153
            } elseif ($this->getRequest()->query->has('provider')) {
154
                $providerName = $this->getRequest()->query->get('provider');
155
            }
156
        }
157
158
        if (!empty($providerName)) {
159
            $media->setProvider($providerName);
160
        }
161
162
        return $media;
163
    }
164
165
    /**
166
     * @param mixed $object
167
     * @return string
168
     */
169
    public function toString($object)
170
    {
171
        return $object instanceof MediaInterface ? $object->getTitle() : 'Media';
172
    }
173
174
    /**
175
     * @param RouteCollection $collection
176
     */
177
    public function configureRoutes(RouteCollection $collection)
178
    {
179
        $collection->add('image', $this->getRouterIdParameter().'/image/{width}/{height}');
180
        $collection->add('download', $this->getRouterIdParameter().'/download');
181
    }
182
183
    /**
184
     * @param DatagridMapper $datagridMapper
185
     */
186
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
187
    {
188
        $datagridMapper
189
            ->add('title')
190
            ->add('type')
191
            ->add('provider')
192
        ;
193
    }
194
195
    /**
196
     * {@inheritdoc}
197
     */
198
    public function validate(ErrorElement $errorElement, $object)
199
    {
200
        $this->getProvider($object)->validate($errorElement, $object);
201
    }
202
}
203