<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://dotclear.watch/feed/rss2/xslt" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>DotclearWatch / Blog - Mot-clé - status</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="https://dotclear.watch/feed/tag/status/rss2" rel="self" type="application/rss+xml" />
    <description>Suivez l'évolution du moteur de blogs Dotclear.</description>
    <language>fr</language>
    <pubDate>Tue, 26 May 2026 06:34:15 +0200</pubDate>
    <copyright>Tous droits réservés © Jean-Christian Denis</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>Dotclear</generator>
          <item>
        <title>Requête sur les billets</title>
        <link>https://dotclear.watch/Billet/Requ%C3%AAte-sur-les-billets-en-2.33</link>
        <guid isPermaLink="false">urn:md5:cb50189c3afe2f13d6d6cc33271f0d88</guid>
        <pubDate>Thu, 13 Feb 2025 10:02:00 +0000</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.33</category>
                          <category>2.33</category>
                  <category>billet</category>
                  <category>paramètre</category>
                  <category>post</category>
                  <category>requête</category>
                  <category>status</category>
                  <category>type</category>
                <description>&lt;p&gt;La &lt;a href=&quot;https://dotclear.watch/Billet/2.33&quot;&gt;version 2.33&lt;/a&gt; de Dotclear modifie la gestion des status et ouvre les session coté publique apportant des modification dans les requêtes.&lt;/p&gt; &lt;p&gt;L'ouverture des statuts de billets de la version 2.33 de Dotclear oblige a modifier les requêtes liées aux billets, en effet il faut désormais tenir compte qu'il est possible d'avoir de nouveaux statuts encore inconnues jusqu'ici. Par exemple là ou il suffisait de tester si un billet avec un statut &lt;strong&gt;POST_PUBLISHED&lt;/strong&gt; pour l'afficher, maintenant un nouveau statut &lt;strong&gt;POST_SUBSCRIBER&lt;/strong&gt; amené par un plugin pourrait tout à fait avoir le droit d'être également affiché. Pour faciliter cette limite entre billet autorisé et billet restreint, les groupes de status ont une limite de niveau définie à partir de laquelle un billet est considéré comme restreint, c'est la propriété threshold. Elle peut être testé avec :&lt;br&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if (App::status()-&amp;gt;post()-&amp;gt;isRestricted($rs-&amp;gt;post_status)) { }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mais cela est loin d'être suffisant, la version 2.33 de Dotclear ouvre également les sessions coté publique. On peut alors imaginer qu'un billet sera restreint aux lecteurs lambda du blog mais autorisé aux lecteurs enregistrés coté publique. Le billet peut alors être restreint ou non suivant sont niveau mais également suivant le niveau de l'utilisateur.&lt;br&gt;
&lt;br&gt;
Pour faciliter la gestion de ces requêtes complexes et pourvoir d'un coup accorder à nos besoins toutes les requêtes d'une page (il y en a pour les catégories de billets, les tags de billets, etc...) un nouveau behavior fait son apparition : &lt;code&gt;coreBlogBeforeGetPostsAddingParameters&lt;/code&gt;. Il va permettre aux plugins d'interagir avec les requêtes de billets de manière globale. A travers ce behavior un plugin peut modifier les paramètres de requête : &lt;strong&gt;post_type&lt;/strong&gt;, &lt;strong&gt;post_status&lt;/strong&gt;, et &lt;strong&gt;comment_status&lt;/strong&gt;. Le plugin va pouvoir ainsi ajouter son post_status à la requête si l'utilisateur est enregistré.&lt;br&gt;
&lt;br&gt;
Le plugin d'exemple concret et simple &lt;strong&gt;RestrictedReading&lt;/strong&gt; permet de comprendre la mise en œuvre de ces changements.&lt;br&gt;
Voici le contenu de son fichier Prepend.php :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Prepend extends Process
{
    public static function init(): bool
    {
        return self::status(My::checkContext(My::PREPEND));
    }

    public static function process(): bool
    {
        if (!self::status()) {
            return false;
        }

        // Ajout d&amp;#039;une nouvelle permission pour les uilisateurs
        App::auth()-&amp;gt;setPermissionType(My::USER_PERMISSION, __(&amp;#039;Restricted reading&amp;#039;));

        // Ajout d&amp;#039;un nouveau status pour les billets
        if (App::status()-&amp;gt;post()-&amp;gt;set(
            (new Status(My::POST_STATUS , My::id(), &amp;#039;Restricted reading&amp;#039;, &amp;#039;Restricted reading (&amp;gt;1)&amp;#039;, My::fileURL(&amp;#039;icon.svg&amp;#039;))),
        )) {
            // Ajout du behavior de modification des requêtes de billets
            App::behavior()-&amp;gt;addBehaviors([
                &amp;#039;coreBlogBeforeGetPostsAddingParameters&amp;#039; =&amp;gt; self::coreBlogBeforeGetPostsAddingParameters(...),
            ]);

            return true;
        }

        return false;
    }

    /**
     * Utilisation du behavior pour l&amp;#039;ajout de l&amp;#039;autorisation d&amp;#039;afficher le billet si :
     * * Le billet a le status My::POST_STATUS 
     * * L&amp;#039;utilisateur est enregistré avec la permissions My::USER_PERMISSION
     */
    public static function coreBlogBeforeGetPostsAddingParameters(ArrayObject $params, string|null $arg = null): void
    {
        if (App::task()-&amp;gt;checkContext(&amp;#039;FRONTEND&amp;#039;) &amp;amp;&amp;amp; App::auth()-&amp;gt;check(My::USER_PERMISSION, App::blog()-&amp;gt;id()) === true) {
            if (!isset($params[&amp;#039;post_status&amp;#039;])) {
                $params[&amp;#039;post_status&amp;#039;] = [];
            }
            if (!is_array($params[&amp;#039;post_status&amp;#039;])) {
                $params[&amp;#039;post_status&amp;#039;] = [$params[&amp;#039;post_status&amp;#039;]];
            }

            $params[&amp;#039;post_status&amp;#039;][] = My::POST_STATUS;
        }
    }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Grace à ce behavior tout le contenu de la page courante tiendra compte du statut du billet et des permissions de l'utilisateur.%%&lt;/p&gt;</description>
        
                  <comments>https://dotclear.watch/Billet/Requ%C3%AAte-sur-les-billets-en-2.33#comment-form</comments>
          <wfw:comment>https://dotclear.watch/Billet/Requ%C3%AAte-sur-les-billets-en-2.33#comment-form</wfw:comment>
          <wfw:commentRss>https://dotclear.watch/feed/atom/comments/65</wfw:commentRss>
              </item>
          <item>
        <title>Les status</title>
        <link>https://dotclear.watch/Billet/Les-status-en-2.33</link>
        <guid isPermaLink="false">urn:md5:6e19713bdd7549979250058e98d57b37</guid>
        <pubDate>Thu, 13 Feb 2025 10:01:00 +0000</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.33</category>
                          <category>2.33</category>
                  <category>status</category>
                <description>&lt;p&gt;La &lt;a href=&quot;https://dotclear.watch/Billet/2.33&quot;&gt;version 2.33&lt;/a&gt; de Dotclear modifie la gestion des status des utilisateurs, blogs, billets, commentaires.&lt;/p&gt; &lt;h5&gt;Résumé&lt;/h5&gt;

&lt;p&gt;Dans les versions précédentes chaque entité utilisait des méthodes et valeurs dédiées et bloquées de status, tout ça éparpillé un peu partout. Depuis la version 2.33, tous ces status utilisent une structure commune et sont ouvert à l'ajout de nouveaux status. Cela a entrainé pas mal de modifications de requêtes et de scripts de vérification pour prendre en compte cette ouverture.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h5&gt;Nouvelles classes&lt;/h5&gt;

&lt;p&gt;De nouvelles classes regroupant les status d'un groupe sont donc accessibles depuis l'application :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilisateurs : &lt;code&gt;App::status()-&amp;gt;user()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Blogs : &lt;code&gt;App::status()-&amp;gt;blog()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Billets : &lt;code&gt;App::status()-&amp;gt;post()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Commentaires : &lt;code&gt;App::status()-&amp;gt;comment()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces classes contiennent une pile de status, qui sont maintenant des objets.&lt;br&gt;
La classe d'un status contient les propriétés suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un niveau &lt;code&gt;level&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Un identifiant &lt;code&gt;id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Un nom &lt;code&gt;name&lt;/code&gt; (et son pluriel &lt;code&gt;plural_name&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Une icone &lt;code&gt;icon&lt;/code&gt; (et sa version foncée &lt;code&gt;icon_dark&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Une option &lt;code&gt;hidden&lt;/code&gt; pour le cacher des sélections de formulaire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour connaitre toutes les méthodes disponibles pour les groupes de status, les classes sont dans :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;src\Helper\Stack\Status&lt;/code&gt; (générique)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src\Helper\Stack\Statuses&lt;/code&gt; (générique)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src\Schema\Status\Blog.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src\Schema\Status\Comment.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src\Schema\Status\Post.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src\Schema\Status\User.php&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;
Les classes regroupant ces status vont faciliter leur gestion en intégrant tous les outils nécessaires comme les combo, les filtres, les colonnes de tableau, les actions... Le code de Dotclear s'en retrouve simplifié et plus harmonieux à sa lecture.&lt;br&gt;&lt;/p&gt;

&lt;h5&gt;Utilisation&lt;/h5&gt;

&lt;p&gt;Récupérer le nom et l'image d'un status de blog :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$name  = App::status()-&amp;gt;blog()-&amp;gt;name((int) $rs-&amp;gt;blog_status);
$image = App::status()-&amp;gt;blog()-&amp;gt;image((int) $rs-&amp;gt;blog_status);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tester si un billet a un status restreint :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;if (App::status()-&amp;gt;post()-&amp;gt;isRestricted((int) $rs-&amp;gt;post_status)) { }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Récupérer le combo d'action sur des commentaires :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;echo (new Select(&amp;#039;comment_status&amp;#039;))
    -&amp;gt;items(App::status()-&amp;gt;comment()-&amp;gt;combo())
    -&amp;gt;default((string) $rs-&amp;gt;comment_status)
    -&amp;gt;label(new Label(__(&amp;#039;Comment status:&amp;#039;), Label::IL_TF))
    -&amp;gt;render();&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Exemple d'ajout d'un status aux utilisateurs depuis le plugin FrontendSession :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;App::status()-&amp;gt;user()-&amp;gt;set((new Status(
    My::USER_PENDING , 
    My::id(), 
    &amp;#039;Pending registration&amp;#039;, 
    &amp;#039;pending registration (&amp;gt;1)&amp;#039;, 
    My::fileURL(&amp;#039;icon.svg&amp;#039;))
));&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La recherche de status se fait par identifiant ou par niveau sur la plupart des méthodes, ces 3 exemples retourneront le même objet :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$status_online = App::status()-&amp;gt;blog()-&amp;gt;get(1);
$status_online = App::status()-&amp;gt;blog()-&amp;gt;get(App::status()-&amp;gt;blog()::ONLINE);
$status_online = App::status()-&amp;gt;blog()-&amp;gt;get(&amp;#039;online&amp;#039;);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ces quelques exemples montrent l'harmonisation entre les différents status rencontrés dans Dotclear.&lt;br&gt;
Parmis les changements qui risquent de poser problème à certains plugins, il y a la gestion des status dans les requêtes avec un nouveau behavior &lt;code&gt;coreBlogBeforeGetPostsAddingParameters&lt;/code&gt; qui est détaillé dans &lt;a href=&quot;https://dotclear.watch/Billet/Requ%C3%AAte-sur-les-billets-en-2.33&quot;&gt;un article de ce blog&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h5&gt;Dépréciés&lt;/h5&gt;

&lt;p&gt;Comme souvent, ces changements apportent leur lot de dépréciés.&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core\Backend\Combos::getPostStatusesCombo()&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;post()-&amp;gt;combo()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core\Backend\Combos::getBlogStatusesCombo()&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;blog()-&amp;gt;combo()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core\Backend\Combos::getCommentStatusesCombo()&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;comment()-&amp;gt;combo()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core\Backend\Filter\FilterBlogs::getBlogStatusFilter()&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;blog()-&amp;gt;filter()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core\Backend\Filter\FilterComments::getCommentStatusFilter()&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;comment()-&amp;gt;filter()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core\Backend\Filter\FilterPosts::getPostStatusFilter()&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;post()-&amp;gt;filter()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::BLOG_ONLINE&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;blog()::ONLINE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::BLOG_OFFLINE&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;blog()::OFFLINE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::BLOG_REMOVED&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;blog()::REMOVED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::BLOG_UNDEFINED&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;blog()::UNDEFINED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::POST_PENDING&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;post()::PENDING&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::POST_SCHEDULED&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;post()::SCHEDULED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::POST_UNPUBLISHED&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;post()::UNPUBLISHED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::POST_PUBLISHED&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;post()::PUBLISHED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::COMMENT_JUNK&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;comment()::JUNK&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::COMMENT_PENDING&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;comment()::PENDING&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::COMMENT_UNPUBLISHED&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;comment()::UNPUBLISHED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::COMMENT_PUBLISHED&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;comment()::PUBLISHED&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::getPostStatus($s)&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;post()-&amp;gt;name($s)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::getAllPostStatus()&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;post()-&amp;gt;statuses()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blog()::getAllCommentStatus()&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;comment()-&amp;gt;statuses()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blogs()::getAllBlogStatus()&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;blog()-&amp;gt;statuses()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App::blogs()::getBlogStatus($s)&lt;/strong&gt; : &lt;code&gt;App::status()-&amp;gt;blog()-&amp;gt;name($s)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;&lt;/p&gt;</description>
        
                  <comments>https://dotclear.watch/Billet/Les-status-en-2.33#comment-form</comments>
          <wfw:comment>https://dotclear.watch/Billet/Les-status-en-2.33#comment-form</wfw:comment>
          <wfw:commentRss>https://dotclear.watch/feed/atom/comments/64</wfw:commentRss>
              </item>
      </channel>
</rss>
