J’hésite entre deux formats, équivalents, pour décrire un formulaire (spécifique aux options du plugin socialMeta).
La première version utilise les constructions dynamiques ((new formXXX())
) des composants du formulaire :
Dynamique
echo (new formForm('frmreport'))
->action(dcCore::app()->admin->getPageURL())
->method('post')
->fields([
// Activation
(new formPara())
->separator(' ')
->items([
(new formCheckbox('sm_active', $sm_active))
->value(1),
(new formLabel(__('Active socialMeta')))
->for('sm_active')
->class('classic'),
]),
// Generic
(new formFieldset('sm_opt'))
->legend(new formLegend(__('Options')))
->class('fieldset')
->fields([
(new formPara())
->separator(' ')
->items([
(new formCheckbox('sm_on_post', $sm_on_post))
->value(1),
(new formLabel(__('Add social meta on posts')))
->for('sm_on_post')
->class('classic'),
]),
(new formPara())
->separator(' ')
->items([
(new formCheckbox('sm_on_page', $sm_on_page))
->value(1),
(new formLabel(__('Add social meta on pages')))
->for('sm_on_page')
->class('classic'),
]),
(new formText('hr')),
// Specific Facebook
(new formPara())
->separator(' ')
->items([
(new formCheckbox('sm_facebook', $sm_facebook))
->value(1),
(new formLabel(__('Use Facebook social meta:')))
->for('sm_facebook')
->class('classic'),
]),
(new formText(
'pre',
html::escapeHTML(
'<!-- 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"
)
)),
// Specific Google
(new formPara())
->separator(' ')
->items([
(new formCheckbox('sm_google', $sm_google))
->value(1),
(new formLabel(__('Use Google social meta:')))
->for('sm_google')
->class('classic'),
]),
(new formText(
'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 formPara())
->separator(' ')
->items([
(new formCheckbox('sm_twitter', $sm_twitter))
->value(1),
(new formLabel(__('Use Twitter social meta:')))
->for('sm_twitter')
->class('classic'),
]),
(new formText(
'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 formFieldset('sm_conf'))
->legend(new formLegend(__('Settings')))
->class('fieldset')
->fields([
// Twitter account
(new formPara())
->separator(' ')
->items([
(new formLabel(__('Twitter account:')))
->for('sm_twitter_account'),
(new formInput('sm_twitter_account'))
->value(html::escapeHTML($sm_twitter_account))
->size(30)
->maxlength(128)
->extra('aria-describedby="prefix-twitter_account"'),
]),
(new formPara('prefix-twitter_account'))
->class('form-note')
->items([
(new formText('', __('With or without @ prefix.'))),
]),
// Photoblog
(new formPara())
->separator(' ')
->items([
(new formCheckbox('sm_photo', $sm_photo))
->value(1),
(new formLabel(__('This blog is a photoblog')))
->for('sm_photo')
->class('classic')
->extra('aria-describedby="summary_large_image"'),
]),
(new formPara('summary_large_image'))
->class('form-note')
->items([
(new formText('', __('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 formPara())
->separator(' ')
->items([
(new formLabel(__('Default description:')))
->for('sm_description'),
(new formInput('sm_description'))
->value(html::escapeHTML($sm_description))
->size(80)
->maxlength(255)
->extra('aria-describedby="default_description"'),
]),
(new formPara('default_description'))
->class('form-note')
->items([
(new formText('', __('Will be used if post (or page) have no text.'))),
]),
// Default image
(new formPara())
->separator(' ')
->items([
(new formLabel(__('Default image (URL):')))
->for('sm_image'),
(new formInput('sm_image'))
->value(html::escapeHTML($sm_image))
->size(80)
->maxlength(255)
->extra('aria-describedby="default_image"'),
]),
(new formPara('default_image'))
->class('form-note')
->items([
(new formText('', __('Will be used if post (or page) have no image.'))),
]),
]),
// Button
(new formPara())->items([
(new formSubmit('frmsave'))
->accesskey('s')
->value(__('Save')),
dcCore::app()->formNonce(false),
]),
])
->render();
La deuxième version utilise les constructions statiques (formXXX::init()
) des composants du formulaire :
Statique
echo formForm::init('frmreport')
->action(dcCore::app()->admin->getPageURL())
->method('post')
->fields([
// Activation
formPara::init()
->separator(' ')
->items([
formCheckbox::init('sm_active', $sm_active)
->value(1),
formLabel::init(__('Active socialMeta'))
->for('sm_active')
->class('classic'),
]),
// Generic
formFieldset::init('sm_opt')
->legend(formLegend::init(__('Options')))
->class('fieldset')
->fields([
(formPara::init())
->separator(' ')
->items([
formCheckbox::init('sm_on_post', $sm_on_post)
->value(1),
formLabel::init(__('Add social meta on posts'))
->for('sm_on_post')
->class('classic'),
]),
formPara::init()
->separator(' ')
->items([
formCheckbox::init('sm_on_page', $sm_on_page)
->value(1),
formLabel::init(__('Add social meta on pages'))
->for('sm_on_page')
->class('classic'),
]),
formText::init('hr'),
// Specific Facebook
formPara::init()
->separator(' ')
->items([
formCheckbox::init('sm_facebook', $sm_facebook)
->value(1),
formLabel::init(__('Use Facebook social meta:'))
->for('sm_facebook')
->class('classic'),
]),
formText::init(
'pre',
html::escapeHTML(
'<!-- 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"
)
),
// Specific Google
formPara::init()
->separator(' ')
->items([
formCheckbox::init('sm_google', $sm_google)
->value(1),
formLabel::init(__('Use Google social meta:'))
->for('sm_google')
->class('classic'),
]),
formText::init(
'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
formPara::init()
->separator(' ')
->items([
formCheckbox::init('sm_twitter', $sm_twitter)
->value(1),
formLabel::init(__('Use Twitter social meta:'))
->for('sm_twitter')
->class('classic'),
]),
formText::init(
'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
formFieldset::init('sm_conf')
->legend(formLegend::init(__('Settings')))
->class('fieldset')
->fields([
// Twitter account
formPara::init()
->separator(' ')
->items([
formLabel::init(__('Twitter account:'))
->for('sm_twitter_account'),
formInput::init('sm_twitter_account')
->value(html::escapeHTML($sm_twitter_account))
->size(30)
->maxlength(128)
->extra('aria-describedby="prefix-twitter_account"'),
]),
formPara::init('prefix-twitter_account')
->class('form-note')
->items([
formText::init('', __('With or without @ prefix.')),
]),
// Photoblog
formPara::init()
->separator(' ')
->items([
formCheckbox::init('sm_photo', $sm_photo)
->value(1),
formLabel::init(__('This blog is a photoblog'))
->for('sm_photo')
->class('classic')
->extra('aria-describedby="summary_large_image"'),
]),
formPara::init('summary_large_image')
->class('form-note')
->items([
formText::init('', __('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
formPara::init()
->separator(' ')
->items([
formLabel::init(__('Default description:'))
->for('sm_description'),
formInput::init('sm_description')
->value(html::escapeHTML($sm_description))
->size(80)
->maxlength(255)
->extra('aria-describedby="default_description"'),
]),
formPara::init('default_description')
->class('form-note')
->items([
formText::init('', __('Will be used if post (or page) have no text.')),
]),
// Default image
formPara::init()
->separator(' ')
->items([
formLabel::init(__('Default image (URL):'))
->for('sm_image'),
formInput::init('sm_image')
->value(html::escapeHTML($sm_image))
->size(80)
->maxlength(255)
->extra('aria-describedby="default_image"'),
]),
formPara::init('default_image')
->class('form-note')
->items([
formText::init('', __('Will be used if post (or page) have no image.')),
]),
]),
// Button
formPara::init()
->items([
formSubmit::init('frmsave')
->accesskey('s')
->value(__('Save')),
dcCore::app()->formNonce(false),
]),
])
->render();
Lequel vous parait le plus compréhensible ?
PS : J’ai une petite préférence mais je l’indiquerai plus tard, pour ne pas vous influencer…
1 De saymonz -
Je trouve la statique plus lisible, mais ça me paraît plus correct de créer directement l’objet plutôt que d’ajouter un appel statique à une fonction qui va juste créer l’objet. Même si je suppose que ça ne doit pas vraiment se ressentir sur les performances, surtout sur des versions récentes de PHP.
2 De Franck -
Je suis assez d’accord avec toi, plus lisible pour le statique, plus orthodoxe pour le dynamique :-)
3 De Jean-Christian Paul Denis -
Je me range à l’avis général. J’ajouterais qu’un petit tour dans le code de Dotclear nous montre une utilisation plus que majoritaire de la méthode statique.