Et finalement

Après quelques tergiversations et une mise en place d’un espace de nom (valable à partir de la prochaine 2.26 de Dotclear), ça devient comme ça :

Dynamique
echo (new Form('frmreport'))
    ->action(dcCore::app()->admin->getPageURL())
    ->method('post')
    ->fields([
        // Activation
        (new Para())
            ->separator(' ')
            ->items([
                (new Checkbox('sm_active', $sm_active))
                    ->value(1),
                (new Label(__('Active socialMeta')))
                    ->for('sm_active')
                    ->class('classic'),
            ]),
        // Options
        (new Fieldset('sm_opt'))
            ->legend((new Legend(__('Options'))))
            ->class('fieldset')
            ->fields([
                ((new Para()))
                    ->separator(' ')
                    ->items([
                        (new Checkbox('sm_on_post', $sm_on_post))
                            ->value(1),
                        (new Label(__('Add social meta on posts')))
                            ->for('sm_on_post')
                            ->class('classic'),
                    ]),
                (new Para())
                    ->separator(' ')
                    ->items([
                        (new Checkbox('sm_on_page', $sm_on_page))
                            ->value(1),
                        (new Label(__('Add social meta on pages')))
                            ->for('sm_on_page')
                            ->class('classic'),
                    ]),
                (new Text('hr')),
                // Specific Facebook
                (new Para())
                    ->separator(' ')
                    ->items([
                        (new Checkbox('sm_facebook', $sm_facebook))
                            ->value(1),
                        (new Label(__('Use Open Graph (Mastodon/Facebook) social meta:')))
                            ->for('sm_facebook')
                            ->class('classic'),
                    ]),
                (new Text(
                    'pre',
                    html::escapeHTML(
                        '<!-- Open Graph (Mastodon/Facebook) -->' . "\n" .
                        '<meta property="og:title" content="Plugin socialMeta 0.2 pour Dotclear" />' . "\n" .
                        '<meta property="og:url" content="http://open-time.net/post/2014/01/20/Plugin-socialMeta-02-pour-Dotclear" />' . "\n" .
                        '<meta property="og:site_name" content="Open-Time" />' . "\n" .
                        '<meta property="og:description" content="Nouvelle version de ce petit plugin, ..." />' . "\n" .
                        '<meta property="og:image" content="http://open-time.net/public/illustrations/2014/.googleplus-twitter-facebook_m.jpg" />' . "\n" .
                        '<meta property="og:image:alt" content="G+, Twitter et Facebook"/>' . "\n"
                    )
                )),
                // Specific Google
                (new Para())
                    ->separator(' ')
                    ->items([
                        (new Checkbox('sm_google', $sm_google))
                            ->value(1),
                        (new Label(__('Use Google social meta:')))
                            ->for('sm_google')
                            ->class('classic'),
                    ]),
                (new Text(
                    'pre',
                    html::escapeHTML(
                        '<!-- Google -->' . "\n" .
                        '<meta itemprop="name" content="Plugin socialMeta 0.2 pour Dotclear" />' . "\n" .
                        '<meta itemprop="description" content="Nouvelle version de ce petit plugin, ..." />' . "\n" .
                        '<meta itemprop="image" content="http://open-time.net/public/illustrations/2014/.googleplus-twitter-facebook_m.jpg" />' . "\n"
                    )
                )),
                // Specific Twitter
                (new Para())
                    ->separator(' ')
                    ->items([
                        (new Checkbox('sm_twitter', $sm_twitter))
                            ->value(1),
                        (new Label(__('Use Twitter social meta:')))
                            ->for('sm_twitter')
                            ->class('classic'),
                    ]),
                (new Text(
                    'pre',
                    html::escapeHTML(
                        '<!-- Twitter -->' . "\n" .
                        '<meta name="twitter:card" content="summary" />' . "\n" .
                        '<meta name="twitter:title" content="Plugin socialMeta 0.2 pour Dotclear" />' . "\n" .
                        '<meta name="twitter:description" content="Nouvelle version de ce petit plugin, ..." />' . "\n" .
                        '<meta name="twitter:image" content="http://open-time.net/public/illustrations/2014/.googleplus-twitter-facebook_m.jpg"/>' . "\n" .
                        '<meta name="twitter:image:alt" content="G+, Twitter et Facebook"/>' . "\n" .
                        '<meta name="twitter:site" content="@franckpaul" />' . "\n" .
                        '<meta name="twitter:creator" content="@franckpaul" />' . "\n"
                    )
                )),
            ]),
        // Settings
        (new Fieldset('sm_conf'))
            ->legend((new Legend(__('Settings'))))
            ->class('fieldset')
            ->fields([
                // Twitter account
                (new Para())
                    ->separator(' ')
                    ->items([
                        (new Label(__('Twitter account:')))
                            ->for('sm_twitter_account'),
                        (new Input('sm_twitter_account'))
                            ->value(html::escapeHTML($sm_twitter_account))
                            ->size(30)
                            ->maxlength(128)
                            ->extra('aria-describedby="prefix-twitter_account"'),
                    ]),
                (new Note('prefix-twitter_account'))
                    ->class('form-note')
                    ->text(__('With or without @ prefix.')),
                // Photoblog
                (new Para())
                    ->separator(' ')
                    ->items([
                        (new Checkbox('sm_photo', $sm_photo))
                            ->value(1),
                        (new Label(__('This blog is a photoblog')))
                            ->for('sm_photo')
                            ->class('classic')
                            ->extra('aria-describedby="summary_large_image"'),
                    ]),
                (new Note('summary_large_image'))
                    ->class('form-note')
                    ->text(__('Will use "summary_large_image" twitter card type rather than "summary", and will include the first original photo if possible rather than the medium thumbnail.')),
                // Default description
                (new Para())
                    ->separator(' ')
                    ->items([
                        (new Label(__('Default description:')))
                            ->for('sm_description'),
                        (new Input('sm_description'))
                            ->value(html::escapeHTML($sm_description))
                            ->size(80)
                            ->maxlength(255)
                            ->extra('aria-describedby="default_description"'),
                    ]),
                (new Note('default_description'))
                    ->class('form-note')
                    ->text(__('Will be used if post (or page) have no text.')),
                // Default image
                (new Para())
                    ->separator(' ')
                    ->items([
                        (new Label(__('Default image (URL):')))
                            ->for('sm_image'),
                        (new Input('sm_image'))
                            ->value(html::escapeHTML($sm_image))
                            ->size(80)
                            ->maxlength(255)
                            ->extra('aria-describedby="default_image"'),
                    ]),
                (new Note('default_image'))
                    ->class('form-note')
                    ->text(__('Will be used if post (or page) have no image.')),
            ]),
        // Button
        (new Para())
            ->items([
                (new Submit('frmsave'))
                    ->accesskey('s')
                    ->value(__('Save')),
                dcCore::app()->formNonce(false),
            ]),
    ])
    ->render();

Exit le préfixe form pour les classes, pas d’appel statique pour la création. Le mot clé new rappelle qu’on va créer un élément dans le DOM, ce qui reflète bien la réalité.

Plutôt lisible et orthodoxe, j’aime bien !

PS : Cela dit ça n’empêchera pas d’utiliser la forme statique, comme par exemple Submit::init() plutôt que (new Submit()), ça restera équivalent. Par contre l’usage de la forme statique supprime les infos fournies par l’IDE pour la signature de construction des composants, c’est moyen pratique.

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/15638

Haut de page