Completed
Push — master ( c5041c...dff1db )
by
unknown
27:23
created

MediaAdmin::prePersist()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
ccs 0
cts 3
cp 0
rs 10
cc 1
eloc 2
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 3
    public function __construct($code, $class, $baseControllerName, ProviderPool $providerPool)
45
    {
46 3
        parent::__construct($code, $class, $baseControllerName);
47
48 3
        $this->providerPool = $providerPool;
49 3
    }
50
51
    /**
52
     * @param ListMapper $listMapper
53
     */
54 1
    protected function configureListFields(ListMapper $listMapper)
55
    {
56
        $listMapper
57 1
            ->addIdentifier('title')
58 1
            ->add(
59
                'type'
60 1
            )
61 1
            ->add(
62 1
                'updatedAt',
63
                'datetime'
64 1
            )
65 1
            ->add(
66 1
                '_action',
67 1
                'actions',
68
                [
69
                    'actions' => [
70 1
                        'edit'   => [],
71 1
                        'delete' => [],
72 1
                    ],
73
                ]
74 1
            );
75 1
    }
76
77
    /**
78
     * @param FormMapper $formMapper
79
     */
80 2
    protected function configureFormFields(FormMapper $formMapper)
81
    {
82
        /**
83
         * @var AbstractMedia $media
84
         */
85 2
        $media = $this->getSubject();
86 2
        if (!$media) {
87
            $media = $this->getNewInstance();
88
        }
89
90 2
        $this->originalProviderReference = $media->getProviderReference();
91
92 2
        $provider = $this->getProvider($media);
93 1
        $provider->setMedia($media);
94
95 1
        if ($media->getId()) {
96
            $provider->buildEditForm($formMapper);
97
        } else {
98 1
            $provider->buildCreateForm($formMapper);
99
        }
100 1
    }
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 2
    protected function getProvider(AbstractMedia $media)
132
    {
133 2
        if (empty($media->getProvider())) {
134
            throw new \InvalidArgumentException('No provider was set');
135
        }
136
137 2
        $provider = $this->providerPool->getProvider($media->getProvider());
138 1
        $media->setType($provider->getType());
139
140 1
        return $this->providerPool->getProvider($media->getProvider());
141
    }
142
143
    /**
144
     * @return AbstractMedia
145
     */
146 2
    public function getNewInstance()
147
    {
148 2
        $media = parent::getNewInstance();
149 2
        $providerName = null;
150 2
        if ($this->hasRequest()) {
151 2
            if ($this->getRequest()->isMethod('POST')) {
152
                $providerName = $this->getRequest()->get($this->getUniqid())['provider'];
153 2
            } elseif ($this->getRequest()->query->has('provider')) {
154 2
                $providerName = $this->getRequest()->query->get('provider');
155 2
            }
156 2
        }
157
158 2
        if (!empty($providerName)) {
159 2
            $media->setProvider($providerName);
160 2
        }
161
162 2
        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 2
    public function configureRoutes(RouteCollection $collection)
178
    {
179 2
        $collection->add('image', $this->getRouterIdParameter().'/image/{width}/{height}');
180 2
        $collection->add('download', $this->getRouterIdParameter().'/download');
181 2
    }
182
183
    /**
184
     * @param DatagridMapper $datagridMapper
185
     */
186 1
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
187
    {
188
        $datagridMapper
189 1
            ->add('title')
190 1
            ->add('type')
191 1
            ->add('provider')
192
        ;
193 1
    }
194
195
    /**
196
     * {@inheritdoc}
197
     */
198
    public function validate(ErrorElement $errorElement, $object)
199
    {
200
        $this->getProvider($object)->validate($errorElement, $object);
201
    }
202
}
203