Completed
Push — master ( f0b0d9...1c5dc9 )
by Dev
10:47
created

PageAdmin   A

Complexity

Total Complexity 37

Size/Duplication

Total Lines 361
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
eloc 189
dl 0
loc 361
ccs 0
cts 272
cp 0
rs 9.44
c 0
b 0
f 0
wmc 37

15 Methods

Rating   Name   Duplication   Size   Complexity  
A preUpdate() 0 3 1
A configureFormFieldsBlockEdition() 0 42 4
B configureFormFieldsBlockDetails() 0 61 6
A configureDatagridFilters() 0 43 6
A configureListFields() 0 27 1
A configureFormFieldsBlockTitle() 0 35 4
A configureFormFieldsBlockImages() 0 28 2
A configure() 0 4 1
A setLiipImage() 0 3 1
A exists() 0 3 1
A setFeedDumper() 0 3 1
A getObjectMetadata() 0 11 3
A configureFormFields() 0 16 4
A setDefaultLocale() 0 3 1
A configureFormFieldsBlockContent() 0 18 1
1
<?php
2
3
namespace PiedWeb\CMSBundle\Admin;
4
5
use Sonata\AdminBundle\Admin\AbstractAdmin;
6
use Sonata\AdminBundle\Datagrid\ListMapper;
7
use Sonata\AdminBundle\Datagrid\DatagridMapper;
8
use Sonata\AdminBundle\Form\FormMapper;
9
use Symfony\Component\Form\Extension\Core\Type\TextType;
10
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
11
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
12
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
13
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
14
use Sonata\AdminBundle\Form\Type\ModelAutocompleteType;
15
use Sonata\CoreBundle\Form\Type\DateTimePickerType;
16
use Sonata\BlockBundle\Meta\Metadata;
17
use PiedWeb\CMSBundle\Service\FeedDumpService;
18
19
class PageAdmin extends AbstractAdmin
20
{
21
    use AdminTrait;
22
23
    protected $datagridValues = [
24
        '_page' => 1,
25
        '_sort_order' => 'DESC',
26
        '_sort_by' => 'updatedAt',
27
    ];
28
29
    protected $feedDumper;
30
31
    protected $liipImage;
32
33
    protected $defaultLocale;
34
35
    public function setDefaultLocale($defaultLocale)
36
    {
37
        $this->defaultLocale = $defaultLocale;
38
    }
39
40
    public function setLiipImage($liipImage)
41
    {
42
        $this->liipImage = $liipImage;
43
    }
44
45
    public function setFeedDumper(FeedDumpService $feedDumper)
46
    {
47
        $this->feedDumper = $feedDumper;
48
    }
49
50
    public function configure()
51
    {
52
        $this->setTemplate('edit', '@PiedWebCMS/admin/edit.html.twig');
53
        $this->setTemplate('show', '@PiedWebCMS/admin/show_page.html.twig');
54
    }
55
56
    /**
57
    public function getFormTheme()
58
    {
59
60
        return array_merge(
61
            parent::getFormTheme(),
62
            array('@PiedWebCMS/admin/edit-media.html.twig')
63
        );
64
    }**/
65
66
    /**
67
     * Check if page entity's item $name exist.
68
     */
69
    protected function exists(string $name): bool
70
    {
71
        return method_exists($this->getContainer()->getParameter('app.entity_page'), 'get'.$name);
72
    }
73
74
    protected function configureFormFieldsBlockDetails(FormMapper $formMapper)
75
    {
76
        $formMapper->with('admin.details', ['class' => 'col-md-6 order-1']);
77
78
        if ($this->exists('name')) {
79
            $formMapper->add('name', TextType::class, [
80
                'label' => 'admin.page.name.label',
81
                'required' => false,
82
                'help' => 'admin.page.name.help',
83
            ]);
84
        }
85
86
        if ($this->exists('parentPage')) {
87
            $formMapper->add('parentPage', EntityType::class, [
88
                'class' => $this->getContainer()->getParameter('app.entity_page'),
89
                'label' => 'admin.page.parentPage.label',
90
                'required' => false,
91
            ]);
92
        }
93
94
        if ($this->exists('excrept')) {
95
            $formMapper->add('excrept', TextareaType::class, [
96
                'required' => false,
97
                'label' => 'admin.page.excrept.label',
98
                'help' => 'admin.page.excrept.help',
99
            ]);
100
        }
101
102
        if ($this->exists('faq')) {
103
            $formMapper->add('faq', ModelAutocompleteType::class, [
104
                'required' => false,
105
                'multiple' => true,
106
                'class' => $this->getContainer()->getParameter('app.entity_faq'),
107
                'property' => 'question', // or any field in your media entity
108
                'label' => 'admin.page.faq.label',
109
                'btn_add' => true,
110
                'to_string_callback' => function ($entity) {
111
                    return $entity->getQuestion();
112
                },
113
             ]);
114
        }
115
116
        //var_dump($this->getContainer()->getParameter('app.entity_page')); exit;
117
        if ($this->exists('relatedPages')) {
118
            $formMapper->add(
119
                'relatedPages',
120
                ModelAutocompleteType::class,
121
                [
122
                    'required' => false,
123
                    'multiple' => true,
124
                    'class' => $this->getContainer()->getParameter('app.entity_page'),
125
                    'property' => 'title', // or any field in your media entity
126
                    'label' => 'admin.page.relatedPage.label',
127
                    'btn_add' => false,
128
                    'to_string_callback' => function ($entity) {
129
                        return $entity->getTitle();
130
                    },
131
                ]
132
            );
133
        }
134
        $formMapper->end();
135
    }
136
137
    protected function configureFormFieldsBlockContent(FormMapper $formMapper)
138
    {
139
        $formMapper->with('admin.page.mainContent.label');
140
        $formMapper->add('mainContent', TextareaType::class, [
141
            'attr' => [
142
                'style' => 'min-height: 600px;font-size:125%;',
143
                'data-editor' => 'markdown',
144
                'data-gutter' => 0,
145
            ],
146
            'required' => false,
147
            'label' => ' ',
148
            'help' => 'admin.page.mainContent.help',
149
        ]);
150
        $formMapper->add('mainContentIsMarkdown', null, [
151
            'required' => false,
152
            'label' => 'markdown',
153
        ]);
154
        $formMapper->end();
155
    }
156
157
    protected function configureFormFieldsBlockTitle(FormMapper $formMapper)
158
    {
159
        $formMapper->with('admin.page.title.label', ['class' => 'col-md-9']);
160
        $formMapper->add('title', TextType::class, [
161
            'label' => 'admin.page.title.label',
162
            'help' => 'admin.page.title.help',
163
        ]);
164
165
        // Method existance is checked on each element to permit to use admin without all page Trait.
166
        if ($this->exists('H1')) {
167
            $formMapper->add('h1', TextType::class, [
168
                'required' => false,
169
                'attr' => ['class' => 'input-lg'],
170
                'label' => 'admin.page.h1.label',
171
                'help' => 'admin.page.h1.help',
172
            ]);
173
        }
174
175
        $formMapper->add('slug', TextType::class, [
176
            'label' => 'admin.page.slug.label',
177
            'help' => 'admin.page.slug.help',
178
            'attr' => [
179
                ($this->getSubject()->getSlug() ? 'disabled' : 't') => '',
180
            ],
181
        ]);
182
183
        if ($this->exists('MainImage')) {
184
            $formMapper->add('mainImage', \Sonata\AdminBundle\Form\Type\ModelListType::class, [
185
                'required' => false,
186
                'class' => $this->getContainer()->getParameter('app.entity_media'),
187
                'label' => 'admin.page.mainImage.label',
188
                'btn_edit' => false,
189
            ]);
190
        }
191
        $formMapper->end();
192
    }
193
194
    protected function configureFormFieldsBlockImages(FormMapper $formMapper)
195
    {
196
        if ($this->exists('images')) {
197
            $formMapper->with('admin.page.images.label', ['class' => 'col-md-3']);
198
            $formMapper->add(
199
                'pageHasMedias',
200
                \Sonata\CoreBundle\Form\Type\CollectionType::class,
201
                [
202
                    'by_reference' => false,
203
                    'required' => false,
204
                    'label' => ' ',
205
                    'type_options' => [
206
                        'delete' => true,
207
                    ],
208
                ],
209
                [
210
                    'allow_add' => false,
211
                    'allow_delete' => true,
212
                    'btn_add' => false,
213
                    'btn_catalogue' => false,
214
                    'edit' => 'inline',
215
                    'inline' => 'table',
216
                    'sortable' => 'position',
217
                    //'link_parameters' => ['context' => $context],
218
                    'admin_code' => 'piedweb.admin.pagehasmedia',
219
                ]
220
            );
221
            $formMapper->end();
222
        }
223
    }
224
225
    protected function configureFormFieldsBlockEdition(FormMapper $formMapper)
226
    {
227
        $formMapper->with('admin.edition', ['class' => 'col-md-3']);
228
229
        if ($this->exists('metaRobots')) {
230
            $formMapper->add('metaRobots', ChoiceType::class, [
231
                'choices' => [
232
                    'admin.page.metaRobots.choice.noIndex' => 'no-index, no-follow',
233
                ],
234
                 'label' => 'admin.page.metaRobots.label',
235
                'required' => false,
236
            ]);
237
        }
238
        $formMapper->add('createdAt', DateTimePickerType::class, [
239
            //'date_format' => 'd MMMM y H:mm',
240
            'format' => DateTimeType::HTML5_FORMAT,
241
            'dp_side_by_side' => true,
242
            'dp_use_current' => true,
243
            'dp_use_seconds' => false,
244
            'dp_collapse' => true,
245
            'dp_calendar_weeks' => false,
246
            'dp_view_mode' => 'days',
247
            'dp_min_view_mode' => 'days',
248
            'label' => 'admin.page.createdAt.label',
249
        ]);
250
251
        if ($this->exists('author')) {
252
            $formMapper->add('author', EntityType::class, [
253
                 'label' => 'admin.page.author.label',
254
                 'class' => $this->getContainer()->getParameter('app.entity_user'), 'label' => 'Auteur',
255
                 'required' => false,
256
            ]);
257
        }
258
259
        if ($this->exists('template')) {
260
            $formMapper->add('template', null, [
261
                 'label' => 'admin.page.template.label',
262
                 'required' => false,
263
            ]);
264
        }
265
266
        $formMapper->end();
267
    }
268
269
    protected function configureFormFields(FormMapper $formMapper)
270
    {
271
        if ($this->getSubject()
272
            && $this->getSubject()->getSlug()
273
            // Bad Hack for disabled feed and sitemap for i18n website
274
            && $this->getRequest()->get('tl') == $this->defaultLocale
275
        ) {
276
            // Better to be in  event PostUpdate page... but it's quicker
277
            $this->feedDumper->dump();
278
        }
279
280
        $this->configureFormFieldsBlockTitle($formMapper);
281
        $this->configureFormFieldsBlockContent($formMapper);
282
        $this->configureFormFieldsBlockDetails($formMapper);
283
        $this->configureFormFieldsBlockImages($formMapper);
284
        $this->configureFormFieldsBlockEdition($formMapper);
285
    }
286
287
    protected function configureDatagridFilters(DatagridMapper $formMapper)
288
    {
289
        $formMapper->add('title', null, ['label' => 'admin.page.title.label']);
290
291
        if ($this->exists('H1')) {
292
            $formMapper->add('h1', null, ['label' => 'admin.page.h1.label']);
293
        }
294
295
        $formMapper->add('slug', null, ['label' => 'admin.page.slug.label']);
296
297
        $formMapper->add('mainContent', null, ['label' => 'admin.page.mainContent.label']);
298
299
        if ($this->exists('name')) {
300
            $formMapper->add('name', null, ['label' => 'admin.page.mainContent.label']);
301
        }
302
303
        if ($this->exists('parentPage')) {
304
            $formMapper->add('parentPage', null, ['label' => 'admin.page.parentPage.label']);
305
        }
306
307
        if ($this->exists('metaRobots')) {
308
            $formMapper->add('metaRobots', null, [
309
                'choices' => [
310
                    'admin.page.metaRobots.choice.noIndex' => 'no-index, no-follow',
311
                ],
312
                'label' => 'admin.page.metaRobots.label',
313
            ]);
314
        }
315
        /*
316
         * todo: implémente datepicker for orm_date in sonata
317
        $formMapper->add('createdAt', 'doctrine_orm_date', [
318
             'label' => 'admin.page.createdAt.label',
319
        ]);
320
        $formMapper->add('updatedAt', null, [
321
             'label' => 'admin.page.updatedAt.label',
322
        ]);
323
        */
324
325
        if ($this->exists('author')) {
326
            $formMapper->add('author', null, [
327
                 'label' => 'admin.page.author.label',
328
                 'class' => $this->getContainer()->getParameter('app.entity_user'),
329
                 'required' => false,
330
            ]);
331
        }
332
    }
333
334
    public function preUpdate($page)
335
    {
336
        $page->setUpdatedAt(new \Datetime());
337
    }
338
339
    protected function configureListFields(ListMapper $listMapper)
340
    {
341
        //$this->setMosaicDefaultListMode();
342
343
        $listMapper->addIdentifier('title', null, [
344
            'label' => 'admin.page.title.label',
345
        ]);
346
        $listMapper->add('slug', null, [
347
            'label' => 'admin.page.slug.label',
348
        ]);
349
        $listMapper->add('updatedAt', null, [
350
            'format' => 'd M y (H:m)',
351
            'label' => 'admin.page.updatedAt.label',
352
        ]);
353
        $listMapper->add('createdAt', null, [
354
            'format' => 'd M y (H:m)',
355
            'label' => 'admin.page.createdAt.label',
356
        ]);
357
        $listMapper->add('_action', null, [
358
            'actions' => [
359
                'show' => [],
360
                'edit' => [],
361
                'delete' => [],
362
            ],
363
            'row_align' => 'right',
364
            'header_class' => 'text-right',
365
            'label' => 'admin.action',
366
        ]);
367
    }
368
369
    public function getObjectMetadata($page)
370
    {
371
        $media = $page->getMainImage();
372
        if (null !== $media && false !== strpos($media->getMimeType(), 'image/')) {
373
            $fullPath = '/'.$media->getRelativeDir().'/'.$media->getMedia();
374
            $thumb = $this->liipImage->getBrowserPath($fullPath, 'thumb');
375
        } else {
376
            $thumb = null; // feature, une icone en fonction du media (pdf/word...)
377
        }
378
379
        return new Metadata($page->getTitle(), null, $thumb);
380
    }
381
}
382