Completed
Push — master ( 67cd1a...ff46ce )
by Dev
02:55
created

PageAdmin::getObjectMetadata()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

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