MediaAdmin::prePersist()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

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