Le code de Dotclear commence à devenir bien joli et c’est über-cool mais comme un petit village gaulois il reste encore un truc qui me chiffonne depuis des années !
Exemple :
/**
* tpl:Attachments [attributes] : Post Attachments loop (tpl block).
*
* @param ArrayObject<string, mixed> $attr The attributes
* @param string $content The content
*
* @return string
*/
public static function Attachments(ArrayObject $attr, string $content): string
{
return
'<?php' . "\n" .
'if (App::frontend()->context()->posts !== null) {' . "\n" .
' App::frontend()->context()->attachments = new ArrayObject(App::media()->getPostMedia(App::frontend()->context()->posts->post_id,null,"attachment"));' . "\n" .
' foreach (App::frontend()->context()->attachments as $attach_i => $attach_f) : ' .
' App::frontend()->context()->file_url = $attach_f->file_url;' . "\n" .
'?>' . "\n" .
$content .
'<?php' . "\n" .
' endforeach;' . "\n" .
' App::frontend()->context()->attachments = null;' . "\n" .
' unset($attach_i,$attach_f,App::frontend()->context()->file_url);' . "\n" .
'}' . "\n" .
'?>' . "\n";
}
C’est la fonction qui génère le code PHP associé à la balise template <tpl:Attachements>…</tpl:Attachements>
.
Vous voyez tout ce code entre quotes et double-quotes, eh bien le fait qu’il y soit, sous forme de chaînes de caractères fait qu’on ne dispose pas, pendant l’édition, du support de l’IDE et saynul je trouve.
Alors que ça serait tellement plus simple d’écrire le code directement dans une fonction et d’avoir un mécanisme qui le transforme automagiquement en chaîne de caractères :
if (App::frontend()->context()->posts !== null) {
App::frontend()->context()->attachments = new ArrayObject(App::media()->getPostMedia(App::frontend()->context()->posts->post_id,null,"attachment"));
foreach (App::frontend()->context()->attachments as $attach_i => $attach_f) :
App::frontend()->context()->file_url = $attach_f->file_url;
<quelque chose ici pour gérer le $content …>
endforeach;
App::frontend()->context()->attachments = null;
unset($attach_i,$attach_f,App::frontend()->context()->file_url);
}
Faut juste prévoir l’insertion du contenu fourni en paramètre pour les blocs, via un sprintf()
et un %s
placé au bon endroit.
Maintenant je n’ai pas du tout évalué la portée d’un truc comme ça…