<?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é - déprécié</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="https://dotclear.watch/feed/tag/d%C3%A9pr%C3%A9ci%C3%A9/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>Les dépréciés</title>
        <link>https://dotclear.watch/Billet/Les-d%C3%A9pr%C3%A9ci%C3%A9s-en-2.28</link>
        <guid isPermaLink="false">urn:md5:8c3535a2f207a5b8343b876193e3974b</guid>
        <pubDate>Fri, 13 Oct 2023 08:00:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.28</category>
                          <category>2.28</category>
                  <category>déprécié</category>
                <description>&lt;p&gt;La &lt;a href=&quot;https://dotclear.watch/Billet/Release-2.28&quot;&gt;version 2.28&lt;/a&gt; de Dotclear apporte son lot de dépréciés.&lt;/p&gt; &lt;h5&gt;Core&lt;/h5&gt;

&lt;p&gt;Toutes les méthodes de la classe principale du cœur de Dotclear (dcCore) passent en dépréciées, une &lt;a href=&quot;https://dotclear.watch/Billet/Les-d%C3%A9pr%C3%A9ci%C3%A9s-du-core-en-2.28&quot;&gt;page spéciale est dédiée à ces dépréciés&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;Constantes&lt;/h5&gt;

&lt;p&gt;Les constantes suivantes sont dépréciées, il faut utiliser &lt;a href=&quot;https://dotclear.watch/Billet/Remplacer-une-classe-de-premier-niveau-en-2.28&quot;&gt;le système de service du Core&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DC_AUTH_CLASS =&amp;gt; doit remplacer le service AuthInterface::class&lt;/li&gt;
&lt;li&gt;DC_DBHANDLER_CLASS =&amp;gt; doit remplacer le service ConnectionInterface::class&lt;/li&gt;
&lt;li&gt;DC_DBSCHEMA_CLASS =&amp;gt; doit faire partie de la classe de Connection, et être fourni par App::con()-&amp;gt;schema()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour les autres constantes, il faut utiliser la nouvelle &lt;a href=&quot;https://dotclear.watch/Billet/Configuration-de-l-application-en-2.28&quot;&gt;classe de configuration&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;Blog&lt;/h5&gt;

&lt;p&gt;Toues les propriétés public de la classe dcBlog (devenu Blog et accessible par App:blog() ) sont désormais dépréciées et ont une nouvelle méthode associée. (voir la partie Blog de l'article sur le &lt;a href=&quot;https://dotclear.watch/Billet/Le-conteneur-principal-en-2.28&quot;&gt;conteneur principale&lt;/a&gt;.)&lt;/p&gt;

&lt;h5&gt;Utils&lt;/h5&gt;

&lt;p&gt;Toute la classe dcUtils et ses méthodes passent en dépréciées. La version 2.28 ajoute ces derniers dépréciés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::ADMIN_LOCALE&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::lexical()::ADMIN_LOCALE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::PUBLIC_LOCALE&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::lexical()::PUBLIC_LOCALE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::CUSTOM_LOCALE&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::lexical()::CUSTOM_LOCALE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::path()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;Path::reduce()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::getUserCN()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;App::users()-&amp;gt;getUserCN()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::cleanIds()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;App::blogs()-&amp;gt;cleanIds()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::versionsCompare()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;App::plugins()-&amp;gt;versionsCompare()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::cssLoad()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;App::plugins()-&amp;gt;cssLoad()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::jsLoad()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;App::plugins()-&amp;gt;jsLoad()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::jsJson()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;Html::jsJson()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::lexicalSort()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;App::lexical()-&amp;gt;lexicalSort()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::lexicalArraySort()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;App::lexical()-&amp;gt;lexicalArraySort()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::lexicalKeySort()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;App::lexical()-&amp;gt;lexicalKeySort()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::setLexicalLang()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;App::lexical()-&amp;gt;setLexicalLang()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::removeDiacritics()&lt;/strong&gt;  =&amp;gt; &lt;code&gt;Text::removeDiacritics()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Autres&lt;/h5&gt;

&lt;p&gt;Quelques changements de noms de méthodes et passages de propriétés à méthodes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;App::release(xxx)&lt;/strong&gt; =&amp;gt; &lt;code&gt;App:config()-&amp;gt;release(xxx) ou App:config()-&amp;gt;yyy()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;blog()-&amp;gt;settings-&amp;gt;addNamespace()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::blog()-&amp;gt;settings()-&amp;gt;addWorspace()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;blog()-&amp;gt;settings-&amp;gt;renNamespace()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::blog()-&amp;gt;settings()-&amp;gt;renWorkspace()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;blog()-&amp;gt;settings-&amp;gt;delNamespace()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::blog()-&amp;gt;settings()-&amp;gt;delWorkspace()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;blog()-&amp;gt;settings-&amp;gt;dumpNamespaces()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::blog()-&amp;gt;settings()-&amp;gt;dumpWorkspaces()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;blog()-&amp;gt;settings-&amp;gt;xxx-&amp;gt;dumpNamespace()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::blog()-&amp;gt;settings()-&amp;gt;get('xxx')-&amp;gt;dumpWorkspace()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;error-&amp;gt;toHTML()&lt;/strong&gt; =&amp;gt; utiliser son propre parser&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;notices-&amp;gt;delNotices()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::notice()-&amp;gt;delNotice()&lt;/code&gt; ou &lt;code&gt;App::notice()-&amp;gt;delSessionNotices()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;media-&amp;gt;root&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::media()-&amp;gt;getRoot()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;media-&amp;gt;root_url&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::media()-&amp;gt;getRootUrl()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;media-&amp;gt;dir&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::media()-&amp;gt;getDirs()&lt;/code&gt; ou &lt;code&gt;App::media()-&amp;gt;getFiles()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;media-&amp;gt;thumb_tp&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::media()-&amp;gt;getThumbnailFilePattern()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;media-&amp;gt;thumb_tp_alpha&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::media()-&amp;gt;getThumbnailFilePattern('alpha')&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;media-&amp;gt;thumb_tp_webp&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::media()-&amp;gt;getThumbnailFilePattern('webp')&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;media-&amp;gt;thumb_sizes&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::media()-&amp;gt;getThumbnailCombo()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;log-&amp;gt;getTable()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::log()::LOG_TABLE_NAME&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;widgets&lt;/strong&gt; =&amp;gt; &lt;code&gt;Widgets::$widgets&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;ctx&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::frontend()-&amp;gt;context()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;tpl&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::frontend()-&amp;gt;template()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;adminurl&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()-&amp;gt;url()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;favs&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()-&amp;gt;favorites()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;menu&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()-&amp;gt;menus()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;resources&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()-&amp;gt;resources()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Déplacement&lt;/h5&gt;

&lt;p&gt;Voir les nombreuses &lt;a href=&quot;https://dotclear.watch/Billet/D%C3%A9placement-de-classes-en-2.28&quot;&gt;classes déplacées&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;q&gt;Le contenu de ce document a été écrit suivant le code de la version 2.28 de Dotclear.&lt;/q&gt;&lt;/em&gt;&lt;/p&gt;</description>
        
              </item>
          <item>
        <title>dcCore déprécié</title>
        <link>https://dotclear.watch/Billet/Les-d%C3%A9pr%C3%A9ci%C3%A9s-du-core-en-2.28</link>
        <guid isPermaLink="false">urn:md5:0f195f3f078eb49a5629ae30d771e192</guid>
        <pubDate>Fri, 13 Oct 2023 08:00:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.28</category>
                          <category>2.28</category>
                  <category>déprécié</category>
                <description>&lt;p&gt;Dans la &lt;a href=&quot;https://dotclear.watch/Billet/Release-2.28&quot;&gt;version 2.28&lt;/a&gt; de Dotclear, la classe historique du moteur de blog, alias dcCore, passe en dépréciée.&lt;/p&gt; &lt;p&gt;La classe dcCore, le cœur de Dotclear n'est plus. Cette classe, avec toutes ses propriétés et méthodes, passe en déprécié au profit d'un nouveau système utilisant un simple &lt;a href=&quot;https://dotclear.watch/Billet/Le-conteneur-principal-en-2.28&quot;&gt;conteneur de classe&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;Resources&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;resources&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()-&amp;gt;resources()&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le tableau des ressources d'aide de l'interface d'administration est remplacé par une nouvelle classe &lt;code&gt;\Dotclear\Core\Backend\Resources&lt;/code&gt; et se déplace vers le Backend. Pour ajouter une ressource depuis un thème ou plugin, cela se fait toujours depuis le fichiers &lt;strong&gt;locales/xx/resources.php&lt;/strong&gt; mais on doit désormais utiliser une méthode de la nouvelle classe qui est instanciée dans &lt;code&gt;App::backend()-&amp;gt;resources()&lt;/code&gt;.&lt;br /&gt;
Exemple du plugin aboutConfig de la distribution :&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// Avant :
// if (!isset(dcCore::app()-&amp;gt;resources[&amp;#039;help&amp;#039;][&amp;#039;aboutConfig&amp;#039;])) {
//    dcCore::app()-&amp;gt;resources[&amp;#039;help&amp;#039;][&amp;#039;aboutConfig&amp;#039;] = __DIR__ . &amp;#039;/help/help.html&amp;#039;;
//}
// à remplacer par :
\Dotclear\App::backend()-&amp;gt;resources()-&amp;gt;set(&amp;#039;help&amp;#039;, &amp;#039;aboutConfig&amp;#039;, __DIR__ . &amp;#039;/help/help.html&amp;#039;);&lt;/code&gt;&lt;/pre&gt;

&lt;h5&gt;Lang&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;lang&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::lang()-&amp;gt;getLang()&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;lang = 'en'&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::lang()-&amp;gt;setlang('en')&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Behavior&lt;/h5&gt;

&lt;p&gt;Toutes les méthodes en rapport à la gestion des behaviors sont désormais dans une instance de classe Behavior.&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;addBehavior()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::behavior()-&amp;gt;addBehavior()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;addBehaviors()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::behavior()-&amp;gt;addBehaviors()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;hasBehavior()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::behavior()-&amp;gt;hasBehavior()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getBehaviors()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::behavior()-&amp;gt;getBehaviors()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getBehaviors(xxx)&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::behavior()-&amp;gt;getBehavior(xxx)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;callBehavior()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::behavior()-&amp;gt;callBehavior()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La méthode getBehaviors est scindée en deux pour obtenir un typage de retour de méthode plus propre. Les anciens alias en &lt;q&gt;ou&lt;/q&gt; disparaissent.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Nonce&lt;/h5&gt;

&lt;p&gt;Toutes les méthodes en rapport à la gestion en base de Nonce sont désormais dans une instance de classe Nonce.&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getNonce()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::nonce()-&amp;gt;getNonce()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;checkNonce()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::nonce()-&amp;gt;checkNonce()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;formNonce(true)&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::nonce()-&amp;gt;getFormNonce()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;formNonce(false)&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::nonce()-&amp;gt;formNonce()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette dernière méthode est scindée en deux avec d'un coté le renvoi de l'élément Form\Hidden et de l'autre le renvoi du code HTML.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Version&lt;/h5&gt;

&lt;p&gt;Toutes les méthodes en rapport à la gestion des versions en base sont désormais dans une instance de classe Nonce.&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getVersion()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::version()-&amp;gt;getVersion()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getVersions()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::version()-&amp;gt;getVersions()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;setVersion()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::version()-&amp;gt;setVersion()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;testVersion()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::version()-&amp;gt;compareVersion()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;newVersion()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::version()-&amp;gt;newerVersion()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;delVersion()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::version()-&amp;gt;unsetVersion()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Formater&lt;/h5&gt;

&lt;p&gt;Toutes les méthodes en rapport à la gestion des formateurs sont désormais dans une instance de classe Formater.&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;addEditorFormater()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::formater()-&amp;gt;addEditorFormater()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;addFormater()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::formater()-&amp;gt;addEditorFormater('dcLegacyEditor', ...)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;addFormaterName()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::formater()-&amp;gt;addFormaterName()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getFormaterName()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::formater()-&amp;gt;getFormaterName()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getEditors()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::formater()-&amp;gt;getEditors()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getFormaters()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::formater()-&amp;gt;getFormaters()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getFormaters(xxx)&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::formater()-&amp;gt;getFormater(xxx)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;callEditorFormater()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::formater()-&amp;gt;callEditorFormater()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;callFormater()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::formater()-&amp;gt;callEditorFormater('dcLegacyEditor', ...)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La méthode &lt;strong&gt;getFormaters&lt;/strong&gt; est scindée en deux pour retourner soit un formateur soit tous.&lt;br /&gt;
Les méthodes spécifiques à dcLegacyEditor, qui sont &lt;strong&gt;addFormater&lt;/strong&gt; et &lt;strong&gt;callFormater&lt;/strong&gt;, sont supprimées au profit des génériques &lt;code&gt;addEditorFormater&lt;/code&gt; et &lt;code&gt;callEditorFormater&lt;/code&gt; auxquelles il faudra indiquer le formateur dcLegacyEditor.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Wiki et HTML filter&lt;/h5&gt;

&lt;p&gt;Toutes les méthodes en rapport aux filtres wiki et HTML sont désormais dans un instance de classe Filter. De même pour la propriété wiki.&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;wiki&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::filter()-&amp;gt;wiki()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;wiki2xhtml&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::filter()-&amp;gt;wiki()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;wikiTransform()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::filter()-&amp;gt;wikiTransform()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;initWikiPost()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::filter()-&amp;gt;initWikiPost()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;initWikiSimpleComment()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::filter()-&amp;gt;initWikiSimpleComment()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;initWikiComment()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::filter()-&amp;gt;initWikiComment()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;wikiPostLink()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::filter()-&amp;gt;wikiPostLink()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;HTMLfilter()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::filter()-&amp;gt;HTMLfilter()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une modification bloquante a été introduite en utilisant l'état non initialisé des propriétés de classe, il ne faut plus tester si wiki est une instance de WikiToHtml mais si il existe, cela donne :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;//avant :
//if (dcCore::app()-&amp;gt;wiki instanceof WikiToHtml) { }

// Après :
if (isset(App::filter()-&amp;gt;wiki)) { }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ce cas se retrouve sur plusieurs autres appels, PHP vous indiquera que vous faites appel à une propriété non initialisée, il faudra alors utiliser isset().&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Post types&lt;/h5&gt;

&lt;p&gt;Toutes les méthodes en rapport à la gestion des types de posts sont désormais dans une instance de classe PostTypes. Et un type de post n'est plus un tableau mais une classe de description PostType.&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getPostAdminURL()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;get(type)-&amp;gt;adminUrl()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getPostPublicURL()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;get(type)-&amp;gt;publicUrl()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;setPostType()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;set(new PostType())&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getPostTypes()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;dump()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De plus, une nouvelle méthode est ajoutée pour tester si un type de post existe: &lt;code&gt;App::postTypes()-&amp;gt;exists(type)&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple du plugin pages de la distribution :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;// Dans la méthode process() du fichier src/Prepend.php
App::postTypes()-&amp;gt;set(new PostType(
    &amp;#039;page&amp;#039;,
    &amp;#039;&amp;#039;,
    App::url()-&amp;gt;getURLFor(&amp;#039;pages&amp;#039;, &amp;#039;%s&amp;#039;),
    &amp;#039;Pages&amp;#039;
));
// Dans la méthode process() du fichier src/Backend.php
App::postTypes()-&amp;gt;set(new PostType(
    &amp;#039;page&amp;#039;,
    urldecode(My::manageUrl([&amp;#039;p&amp;#039; =&amp;gt; &amp;#039;pages&amp;#039;, &amp;#039;act&amp;#039; =&amp;gt; &amp;#039;page&amp;#039;, &amp;#039;id&amp;#039; =&amp;gt; &amp;#039;%d&amp;#039;], &amp;#039;&amp;amp;&amp;#039;)),
    App::url()-&amp;gt;getURLFor(&amp;#039;pages&amp;#039;, &amp;#039;%s&amp;#039;),
    &amp;#039;Pages&amp;#039;
));&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On remarque ici qu'on déclare deux fois le type de post, une fois dans le Prepend SANS la définition d'url admin car elle n'est pas encore accessible. Et une fois dans le fichier Backend AVEC la définition de l'url admin.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Blogs&lt;/h5&gt;

&lt;p&gt;Toutes les méthodes en rapport aux blogs sont désormais dans une instance de classe Blogs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getAllBlogStatus()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::blogs()-&amp;gt;getAllBlogStatus()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getBlogStatus()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()s-&amp;gt;getBlogStatus()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getBlogPermissions()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;getBlogPermissions()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getBlog()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;getBlog()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getBlogs()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;getBlogs()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;addBlog()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;addBlog()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;updBlog()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;updBlog()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;delBlog()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;delBlog()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;blogExists()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;blogExists()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;countBlogPosts()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::postTypes()-&amp;gt;countBlogPosts()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Users&lt;/h5&gt;

&lt;p&gt;Toutes les méthodes en rapport aux utilisateurs sont désormais dans une instance de classe Users.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getUser()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;getUser()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getUsers()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;getUsers()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;addUser()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;addUser()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;updUser()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;updUser()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;delUser()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;delUser()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;userExists()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;userExists()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getUserPermissions()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;getUserPermissions()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;setUserPermissions()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;setUserPermissions()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;setUserBlogPermissions()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;setUserBlogPermissions()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;setUserDefaultBlog()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()s-&amp;gt;setUserDefaultBlog()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;removeUsersDefaultBlogs()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;removeUsersDefaultBlogs()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;userDefaults()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::users()-&amp;gt;userDefaults()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Cache&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;emptyTemplatesCache()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::cache()-&amp;gt;emptyTemplatesCache()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;cache&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::cache()-&amp;gt;xxx()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Autres&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()::SESSION_TABLE_NAME&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::session()::SESSION_TABLE_NAME&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()::VERSION_TABLE_NAME&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::version()::VERSION_TABLE_NAME&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;con()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::con()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;prefix&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::con()-&amp;gt;prefix()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;blog&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::blog()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;auth&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::auth()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;session&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::session()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;url&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::url()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;rest&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::rest()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;wiki&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::filter()-&amp;gt;wiki&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;plugins&lt;/strong&gt; =&amp;gt; &lt;code&gt;App:plugins()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;themes&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::themes()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;media&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::media()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;postmedia&lt;/strong&gt; &lt;code&gt;App::postMedia() App::media()-&amp;gt;postMedia()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;meta&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::meta()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;error&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::error()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;notices&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::notice()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;log&lt;/strong&gt; =&amp;gt; &lt;code&gt;App:log()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;admin&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;adminurl&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()-&amp;gt;url()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;favs&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()-&amp;gt;favorites()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;menu&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()-&amp;gt;menus()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;public&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::frontend()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;tpl&lt;/strong&gt; =&amp;gt; &lt;code&gt;App:frontend()-&amp;gt;template()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;ctx&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::frontend()-&amp;gt;context()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;spamfilters&lt;/strong&gt; =&amp;gt; Use AntispamInitFilters behavior&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;killAdminSession()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::backend()-&amp;gt;killAdminSession()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getAllBlogStatus()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::blogs()-&amp;gt;getAllBlogStatus()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;getBlogStatus()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::blogs()-&amp;gt;getBlogStatus()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;blogDefaults()&lt;/strong&gt; =&amp;gt; &lt;code&gt;\Dotclear\Core\Install\Utils::blogDefault()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;enableRestServer()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::rest()-&amp;gt;enableRestServer()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;serveRestRequests()&lt;/strong&gt; =&amp;gt; &lt;code&gt;App::rest()-&amp;gt;serveRestRequests()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
L'ancienne écriture des appels décrits dans cette page reste valable encore pour quelques versions en tant que dépréciée.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;&lt;q&gt;Le contenu de ce document a été écrit suivant le code de la version 2.28 de Dotclear.&lt;/q&gt;&lt;/em&gt;&lt;/p&gt;</description>
        
              </item>
          <item>
        <title>Obsolescence programmée</title>
        <link>https://dotclear.watch/Billet/Obsolescence-programm%C3%A9e</link>
        <guid isPermaLink="false">urn:md5:1764617251109cd84bd16d48468a4f4c</guid>
        <pubDate>Sat, 15 Jul 2023 10:45:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>Actualités</category>
                          <category>déprécié</category>
                  <category>obsolète</category>
                  <category>php</category>
                <description>&lt;p&gt;Terme employé par le grand chef de Dotclear, il résume bien une des interrogations du moment.&lt;/p&gt; &lt;p&gt;Suite à une discussion sur le salon Slack de la team Dotclear, puis transformé en &lt;a href=&quot;https://git.dotclear.org/dev/dotclear/issues/477&quot; hreflang=&quot;fr&quot; title=&quot;Ticket gitea Dotclear&quot;&gt;ticket&lt;/a&gt;, puis en &lt;a href=&quot;https://open-time.net/post/2023/07/15/Obsolescence-programmee&quot; hreflang=&quot;fr&quot; title=&quot;Billet Open Time&quot;&gt;billet&lt;/a&gt;, la question de &lt;strong&gt;la gestion des dépréciés&lt;/strong&gt; présents dans le code de Dotclear est posée. En découle également celle de &lt;strong&gt;la montée en version PHP&lt;/strong&gt;.&lt;br /&gt;
&lt;img src=&quot;https://dotclear.watch/public/Billets/.obsolete_m.webp&quot; alt=&quot;&quot; class=&quot;media-center&quot; /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Pourquoi se poser la question ?&lt;/h5&gt;

&lt;p&gt;La devise &lt;q&gt;Dotclear fait des blogs et il le fait bien&lt;/q&gt; se traduit par &lt;q&gt;ça marche, pourquoi changer&lt;/q&gt;, pourquoi modifier du code qui fonctionne ? La réalité est plus compliquée.&lt;br /&gt;
Historiquement Dotclear ne court pas après les dernières nouveautés techno, et ses utilisateurs encore moins. La &lt;q&gt;hype&lt;/q&gt; ne fait pas partie du langage Dotclear, même si les développeurs de plugins et thèmes aiment utiliser les avancées des langages de programmation.&lt;br /&gt;
Le code arrive à un tournant de sa vie, qui rend compliqué la balance entre rester compatible avec des vieux thèmes, plugins, installations, et aller de l'avant avec de nouvelles fonctionnalités souvent apportées par une nouvelle versions de PHP. Et il y a de plus en plus de dépréciés dans le code et ça commence à faire beaucoup de code mort à charger, à entretenir, et ça peut bloquer l'utilisation de nouvelles fonctions plus puissantes, plus rapides.&lt;br /&gt;
Dotclear pourrait simplement supprimer les dépréciés, passer à PHP 8.3-beta et vous n'auriez qu'à suivre. Mais ça laisserait sur le carreau une multitude de thèmes et plugins pas à jour et qui ne le seront pas avant des lustres, et aussi des installations en PHP 7.4 qui ne peuvent pas être mises à jour, peu importe la raison, hébergeur à la traîne, utilisateur débutant, etc...&lt;br /&gt;
D'après les derniers chiffres (07/2023) données par les &lt;a href=&quot;https://wordpress.org/about/stats/#php_versions&quot; hreflang=&quot;en&quot; title=&quot;Statistique Wordpress&quot;&gt;statistiques Wordpress&lt;/a&gt;, plus de 75% des installations ont une version inférieure à PHP 8.0 dont &lt;strong&gt;50% sont en PHP 7.4&lt;/strong&gt;. Dotclear n'a pas d'outils de suivi d'installation mais ces valeurs devrait être assez proches de la réalité, difficile alors d'imposer une version trop avancée et pourtant chez PHP la version 7.4 est déjà passé en &lt;strong&gt;Unsupported&lt;/strong&gt; ! Alors quoi les internets sont à la traine, PHP va trop vite ? Que faire...&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Une conclusion ?&lt;/h5&gt;

&lt;p&gt;Pas de réponse évidente, pas de direction toute tracée. Comme souvent tout est dans un équilibre entre les avantages et les inconvénients mais où se situe-t-il ?&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez participer à cette discussion, les deux liens en début d'article sont faits pour vous.&lt;br /&gt;&lt;/p&gt;</description>
        
              </item>
          <item>
        <title>Les dépréciés</title>
        <link>https://dotclear.watch/Billet/Les-d%C3%A9pr%C3%A9ci%C3%A9s</link>
        <guid isPermaLink="false">urn:md5:1510c60d4fc8db1f1d9671402038ef88</guid>
        <pubDate>Wed, 12 Jul 2023 19:54:00 +0100</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.27</category>
                          <category>2.27</category>
                  <category>déprécié</category>
                <description>&lt;p&gt;La &lt;a href=&quot;https://dotclear.watch/Billet/Release-2.27&quot;&gt;version 2.27&lt;/a&gt; de Dotclear apporte son lot de dépréciés. Et leur nombre augmente par rapport aux dernières versions.&lt;/p&gt; &lt;h5&gt;Autoloader&lt;/h5&gt;

&lt;p&gt;&lt;strong&gt;dcCore::autoload()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Autoloader::me()&lt;/code&gt;&lt;br /&gt;
Il faut désormais appeler directement &lt;code&gt;Autoloader::me()&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Erreur&lt;/h5&gt;

&lt;p&gt;&lt;strong&gt;_ _error()&lt;/strong&gt; =&amp;gt; &lt;code&gt;new Dotclear\Fault()&lt;/code&gt;&lt;br /&gt;
Il faut utiliser la classe dédiée &lt;strong&gt;Fault&lt;/strong&gt; avec soit le constructeur &lt;code&gt;new Dotclear\Fault()&lt;/code&gt; ou bien la forme statique &lt;code&gt;Dotclear\Fault::throw()&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Déconnection&lt;/h5&gt;

&lt;p&gt;&lt;strong&gt;logout=1&lt;/strong&gt; =&amp;gt; &lt;code&gt;process=Logout&lt;/code&gt;&lt;br /&gt;
La déconnection a maintenant une URL dédiée. Pour l'appeler, il faut utiliser le gestionnaire d'URL &lt;code&gt;dcCore::app()-&amp;gt;admin-&amp;gt;url-&amp;gt;redirect('admin.logout')&lt;/code&gt; qui donnera dans l'URL &lt;code&gt;&amp;amp;process=Logout&lt;/code&gt;&lt;br /&gt;
&lt;ins&gt;&lt;strong&gt;Astuces :&lt;/strong&gt;&lt;/ins&gt; Si un plugin ou un thème bloque l'accès à l'admin, il est possible de simplement ajouter à la fin de l'URL de votre navigateur &lt;code&gt;?process=Logout&lt;/code&gt; et vous pourrez vous reconnecter en &lt;q&gt;mode sans échec&lt;/q&gt;.&lt;/p&gt;

&lt;h5&gt;Variable $init de process&lt;/h5&gt;

&lt;p&gt;&lt;strong&gt;dcNsProcess::$init&lt;/strong&gt; =&amp;gt; &lt;code&gt;Process::status()&lt;/code&gt;&lt;br /&gt;
Introduite en 2.26 cette variable posait des problèmes, elle a été remplacé par la méthode &lt;code&gt;Dotclear\Core\Process::status()&lt;/code&gt; qui sert à la fois en lecture et en écriture.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Ajout de menu&lt;/h5&gt;

&lt;p&gt;&lt;strong&gt;dcAdminHelper::addMenuItem()&lt;/strong&gt; =&amp;gt; &lt;code&gt;dcCore::app()-&amp;gt;admin-&amp;gt;menus-&amp;gt;addItem()&lt;/code&gt;&lt;br /&gt;
Avec l'arrivée des espaces de noms PHP dans la partie administration, les menus font partie d'un objet nommé &lt;code&gt;Menus&lt;/code&gt; et donc il faut passer par lui pour ajouter des menus avec &lt;code&gt;dcCore::app()-&amp;gt;admin-&amp;gt;menus-&amp;gt;addItem()&lt;/code&gt;.&lt;br /&gt;
Pour les plugins il est recommandé d'utiliser la &lt;a href=&quot;https://dotclear.watch/Billet/Les-classes-de-module-My&quot;&gt;classe My&lt;/a&gt; et la méthode  &lt;code&gt;My::addBackendMenuItem()&lt;/code&gt;..&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Constantes de menu&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcAdmin::MENU_FAVORITES&lt;/strong&gt; =&amp;gt; &lt;code&gt;Menus::MENU_FAVORITES&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcAdmin::MENU_BLOG&lt;/strong&gt; =&amp;gt; &lt;code&gt;Menus::MENU_BLOG&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcAdmin::MENU_SYSTEM&lt;/strong&gt; =&amp;gt; &lt;code&gt;Menus::MENU_SYSTEM&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcAdmin::MENU_PLUGINS&lt;/strong&gt; =&amp;gt; &lt;code&gt;Menus::MENU_PLUGINS&lt;/code&gt;,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ici encore suite à l'arrivée du nouvel objet &lt;code&gt;Menus&lt;/code&gt;, les constantes associées sont déplacées dedans. Le nom complet de la classe est &lt;code&gt;Dotclear\Core\Backend\Menus&lt;/code&gt;. Il est possible de les appeler depuis l'instance &lt;code&gt;dcCore::app()-&amp;gt;admin-&amp;gt;menus::MENU_XXX&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Les notices&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcPage::notices()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Notices::getNotices()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcPage::addMessageNotice()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Notices::addMessageNotice()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcPage::addSuccessNotice()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Notices::addSuccessNotice()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcPage::addWarningNotice()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Notices::addWarningNotice()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcPage::addErrorNotice()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Notices::addErrorNotice()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcPage::message()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Notices::message()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcPage::success()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Notices::success()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcPage::warning()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Notices::warning()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcPage::error()&lt;/strong&gt; =&amp;gt; &lt;code&gt;Notices::error()&lt;/code&gt;,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Toutes les méthodes de dcPage (nouvellement Page) en rapport aux notices sont dépréciées, il faut désormais utiliser les méthodes de la classe d'origine &lt;code&gt;Dotclear\Core\Backend\Notices&lt;/code&gt; dont les signatures restent les mêmes.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Fichiers de modules&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcPage::cssModuleLoad()&lt;/strong&gt; =&amp;gt; &lt;code&gt;My::cssLoad()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcPage::jsModuleLoad()&lt;/strong&gt; =&amp;gt; &lt;code&gt;My::jsLoad()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::cssModuleLoad()&lt;/strong&gt; =&amp;gt; &lt;code&gt;My::cssLoad()&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcUtils::jsModuleLoad()&lt;/strong&gt; =&amp;gt; &lt;code&gt;My::jsLoad()&lt;/code&gt;,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encore une fois la &lt;a href=&quot;https://dotclear.watch/Billet/Les-classes-de-module-My&quot;&gt;classe My&lt;/a&gt; dédiée aux modules vient prendre le relai de ces deux méthodes. La différence est que, &lt;a href=&quot;https://dotclear.watch/Billet/Structure-d-un-module&quot;&gt;la structure des modules&lt;/a&gt; devenant plus stricte, ces deux nouvelles méthodes ont uniquement besoin du nom du fichier à charger. Il n'est plus nécessaire de fournir le nom du module ni celui du sous répertoire. Pour les &lt;strong&gt;css&lt;/strong&gt; les fichiers sont rangés dans le dossier &lt;code&gt;css&lt;/code&gt;, pour les &lt;strong&gt;js&lt;/strong&gt;, les fichiers sont rangés dan le dossier &lt;code&gt;js&lt;/code&gt;. Propre.&lt;br /&gt;
Exemple avec un partie de la méthode process de la classe Manage d'un module :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;&amp;lt;?php
//...
Page::openModule(
    My::name,
    // charge le fichier MonPlugin/js/backend.js
    My::jsLoad(&amp;#039;backend&amp;#039;) .
    // charge le fichier MonPlugin/css/style.css
    My::cssLoad(&amp;#039;style&amp;#039;)
);&lt;/code&gt;&lt;/pre&gt;

&lt;h5&gt;De core à admin&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;adminurl&lt;/strong&gt; =&amp;gt; &lt;code&gt;dcCore::app()-&amp;gt;admin-&amp;gt;url&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;favs&lt;/strong&gt; =&amp;gt; &lt;code&gt;dcCore::app()-&amp;gt;admin-&amp;gt;favs&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcCore::app()-&amp;gt;menu&lt;/strong&gt; =&amp;gt; &lt;code&gt;dcCore::app()-&amp;gt;admin-&amp;gt;menus&lt;/code&gt;,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comme annoté dans le code depuis quelques versions certaines instances se trouvant historiquement dans &lt;code&gt;dcCore&lt;/code&gt; auraient dû aller dans &lt;code&gt;dcCore::app()-&amp;gt;admin&lt;/code&gt;, c'est chose faite en 2.27.&lt;br /&gt;&lt;/p&gt;

&lt;h5&gt;Points d'entrées&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dotclear/inc/public/_prepend.php&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dotclear/inc/admin/_prepend.php&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;tous les fichiers &lt;strong&gt;dotclear/admin/xxx.php&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tous les points d'entrée qui étaient représentés par des fichiers sont dépréciés, ils sont remplacés par un seul fichier index.php qui &lt;a href=&quot;https://dotclear.watch/Billet/Lancement-de-l-application&quot;&gt;lance l'application Dotclear&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Coté public, ce sera l'index.php de &lt;a href=&quot;https://dotclear.watch/Billet/Fichier-de-d%C3%A9finition-d-un-blog&quot;&gt;définition du blog&lt;/a&gt; qui lancera l'application.&lt;/li&gt;
&lt;li&gt;Coté admin, ce sera l'index.php de l'URL d'administration qui s'en chargera.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cas particulier, la mise à jour en ligne de commande se déplace de &lt;strong&gt;dotclear/inc/dbschema/upgrade-cli.php&lt;/strong&gt; vers &lt;code&gt;dotclear/admin/upgrade/upgrade-cli.php&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;user@server: /var/www/dotclear$ php admin/upgrade/upgrade-cli.php inc/config.php&lt;/code&gt;&lt;/pre&gt;

&lt;h5&gt;Propriétés du core&lt;/h5&gt;

&lt;p&gt;Nombre de propriétés de dcCore utilisent en 2.27 &lt;a href=&quot;https://php.watch/versions/7.4/typed-properties#uninitialized&quot; hreflang=&quot;en&quot; title=&quot;The uninitialized state&quot;&gt;l'état 'uninitialized'&lt;/a&gt; c'est à dire qu'il ne faut plus tester leur nullité mais leur présence, cela se traduit par exemple par :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;is_null(dcCore::app()-&amp;gt;auth)&lt;/strong&gt; ou &lt;strong&gt;dcCore::app()-&amp;gt;auth === null&lt;/strong&gt; =&amp;gt; &lt;code&gt;isset(dcCore::app()-&amp;gt;auth)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;em&gt;&lt;q&gt;Le contenu de ce document a été écrit suivant le code de la version 2.27 de Dotclear.&lt;/q&gt;&lt;/em&gt;&lt;/p&gt;</description>
        
              </item>
      </channel>
</rss>
