Completed
Push — master ( a30765...22bb12 )
by Dev
09:18
created

PageAdmin::configureFormFieldsBlockContent()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

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