Completed
Push — master ( 769352...7db90d )
by
unknown
02:36
created

MediaAdmin::configureListFields()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 22
ccs 0
cts 15
cp 0
rs 9.2
c 0
b 0
f 0
cc 1
eloc 14
nc 1
nop 1
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);
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 AbstractMedia $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 AbstractMedia
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