{"data":{"markdownRemark":{"html":"<p>Suite à la création d'un site internet via le CMS <a href=\"https://croogo.org/\">Croogo</a> basé sur CakePHP 3, nous avons été amené à devoir surcharger des plugins. En effet ce CMS est intégralement composé de plugins (au sens CakePHP du terme).</p>\n<p>La documentation officielle (de CakePHP), bien que très complète, ne couvrant absolument pas cette partie, nous avons dû faire un petit tour dans le cœur de la bête afin de comprendre ce mécanisme et arriver à combler notre besoin.</p>\n<p><img src=\"https://media.giphy.com/media/yeUxljCJjH1rW/giphy.gif\" alt=\"coeur\"></p>\n<h2>Template</h2>\n<p>Les premiers éléments que l'on souhaite surcharger, sur un CMS, sont bien entendu, les templates de vue. Pour cela nous avons donc dû comprendre sur quoi CakePHP se basait pour trouver le bon fichier dans notre arborescence.</p>\n<p>Après une petite aventure de quelques minutes, le résultat tombe.</p>\n<p><img src=\"https://media.giphy.com/media/N97O8wvYMDreE/giphy.gif\" alt=\"Aventure\"></p>\n<p>Pour surcharger le template d'un plugin il suffit de créer un fichier du même nom dans <code class=\"language-text\">src/Template/Plugin/{PluginName}/{ControllerName}/{ActionName}.ctp</code>.</p>\n<p>Avec un exemple concret :</p>\n<p>Si je veux surcharger la méthode \"view\" du controleur \"Users\" mon plugin \"SuperPlugin\" je vais créer le fichier <code class=\"language-text\">src/Template/Plugin/SuperPlugin/Users/view.ctp</code>.</p>\n<h2>Controllers</h2>\n<p>Surcharger un template c'est bien, mais parfois il sera nécessaire de modifier un comportement. On devra donc surcharger un controleur. Malheurement, pas de solution miracle à base de fichier dans un dossier \"Plugin\", non, nous allons devoir surcharger ses routes (rien de bien compliqué cependant mais il va falloir modifier notre fichier <code class=\"language-text\">routes.php</code>).</p>\n<h3>Modifier le chargement des routes</h3>\n<p>Par défaut, le fichier <code class=\"language-text\">routes.php</code> charge en premier les routes des plugins avant les nôtres, cela pose donc un problème : dans cet état il est impossible de les surcharger car une fois une route trouvée, les autres sont ignorées. Il faut donc modifier notre fichier <code class=\"language-text\">routes.php</code> comme ceci.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>\nRouter<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">scope</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'/'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span>RouteBuilder <span class=\"token variable\">$routes</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n <span class=\"token comment\">// vos routes</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Chargement des routes de vos plugins</span>\nPlugin<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">routes</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span></code></pre></div>\n<h3>Surcharger la route d'un plugin</h3>\n<p>Maintenant que nos plugins sont chargés, après il va être très facile de surcharger leurs routes. En effet il suffira de la reécrire en passant l'option <code class=\"language-text\">plugin</code> à <code class=\"language-text\">false</code>.</p>\n<p>Par exemple pour la route de plugin :</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\">// si notre plugin d'appelle \"myplugin\" son url sera \"/myplugin/user/:username\"</span>\n<span class=\"token variable\">$routes</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>\n\t<span class=\"token single-quoted-string string\">'/user/:username'</span><span class=\"token punctuation\">,</span> \n\t <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'controller'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'Users'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'action'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'view'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\t <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'pass'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'username'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Nous devrons déclarer la route suivante dans le scope <code class=\"language-text\">/</code></p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">Router<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">scope</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'/'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span>RouteBuilder <span class=\"token variable\">$routes</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token variable\">$routes</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>\n\t\t<span class=\"token single-quoted-string string\">'myplugin/user/:username'</span><span class=\"token punctuation\">,</span> \n\t\t<span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'controller'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'Users'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'action'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'view'</span><span class=\"token punctuation\">,</span> <span class=\"token single-quoted-string string\">'plugin'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token boolean constant\">false</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\t\t<span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'pass'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'username'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n\t<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2>Modèles</h2>\n<p>Afin de surcharger les modèles d'un plugin vous devrez surcharger la méthode <code class=\"language-text\">initialize</code> de votre <code class=\"language-text\">AppController</code>.</p>\n<p>Dans les exemples ci-dessous le but sera de surcharger la table <code class=\"language-text\">users</code> du plugin <code class=\"language-text\">MyPlugin</code></p>\n<ul>\n<li>Si vous ne souhaitez surcharger que l'entité :</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\">// src/AppController.php</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">initialize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  \n<span class=\"token punctuation\">{</span>\n\tTableRegistry<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'MyPlugin.Users'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'entityClass'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'App\\Model\\Entity\\User'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>Si vous souhaitez surcharger l'entité et l'objet Table</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\">// src/AppController.php</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">initialize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  \n<span class=\"token punctuation\">{</span>\n\tTableRegistry<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'MyPlugin.Users'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>\n\t <span class=\"token single-quoted-string string\">'className'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'App\\Model\\Table\\UsersTable'</span><span class=\"token punctuation\">,</span> \n\t <span class=\"token single-quoted-string string\">'entityClass'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'App\\Model\\Entity\\User'</span>\n\t <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>Attention, si vous ne souhaitez que surcharger l'objet Table, il est obligatoire de redéclarer l'entité</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\">// src/AppController.php</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">initialize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  \n<span class=\"token punctuation\">{</span>\n\tTableRegistry<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">config</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'MyPlugin.Users'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>\n\t <span class=\"token single-quoted-string string\">'className'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'App\\Model\\Table\\UsersTable'</span><span class=\"token punctuation\">,</span> \n\t <span class=\"token single-quoted-string string\">'entityClass'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'MyPlugin\\Model\\Entity\\User'</span>\n\t <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Helpers</h2>\n<p>Pour terminer il ne nous reste plus que les helpers. Au contraire des modèles, vous devrez cette fois-ci modifier  la méthode <code class=\"language-text\">beforeRender</code> de votre <code class=\"language-text\">AppController</code>.</p>\n<p>Par exemple pour surcharger le helper <code class=\"language-text\">UserHelper</code> du plugin <code class=\"language-text\">MyPlugin</code> vous devez ajouter dans votre <code class=\"language-text\">AppController</code></p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">beforeRender</span><span class=\"token punctuation\">(</span>Event <span class=\"token variable\">$event</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n\t<span class=\"token variable\">$this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">viewBuilder</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">setHelpers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'Users'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Bonus</h2>\n<p>Comme chez commit42 on est des gens formidables, nous avons développé pour vous (et aussi pour nous), un petit plugin pour vous faciliter la vie : <a href=\"https://github.com/ozee31/cakephp-override\">cakephp-override</a></p>\n<p>En reprenant les exemples précédents, on pourrait écrire grâce au plugin le fichier de configuration suivant :</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">// config/overrides.php\n\n<span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span> <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'Overrides'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span>\n\t<span class=\"token single-quoted-string string\">'routes'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span>\n\t\t<span class=\"token single-quoted-string string\">'myplugin/user/:username'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span>\n\t\t\t<span class=\"token single-quoted-string string\">'route'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'controller'</span>  <span class=\"token operator\">=</span><span class=\"token operator\">></span>  <span class=\"token single-quoted-string string\">'Users'</span><span class=\"token punctuation\">,</span>  <span class=\"token single-quoted-string string\">'action'</span>  <span class=\"token operator\">=</span><span class=\"token operator\">></span>  <span class=\"token single-quoted-string string\">'view'</span><span class=\"token punctuation\">,</span>  <span class=\"token single-quoted-string string\">'plugin'</span>  <span class=\"token operator\">=</span><span class=\"token operator\">></span>  <span class=\"token boolean constant\">false</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token single-quoted-string string\">'options'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'pass'</span>  <span class=\"token operator\">=</span><span class=\"token operator\">></span>  <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'username'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\t\t<span class=\"token punctuation\">]</span>\n\t <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\t <span class=\"token single-quoted-string string\">'models'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span>\n\t\t <span class=\"token single-quoted-string string\">'MyPlugin.Users'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span>\n\t\t\t <span class=\"token single-quoted-string string\">'className'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'App\\Model\\Table\\UsersTable'</span><span class=\"token punctuation\">,</span> \n\t\t\t <span class=\"token single-quoted-string string\">'entityClass'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'App\\Model\\Entity\\User'</span>\n\t\t <span class=\"token punctuation\">]</span>\n\t <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\t <span class=\"token single-quoted-string string\">'helpers'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span>\n\t\t <span class=\"token single-quoted-string string\">'MyPlugin.Users'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span>\n\t\t\t <span class=\"token single-quoted-string string\">'className'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'Users'</span><span class=\"token punctuation\">,</span>\n\t\t\t <span class=\"token single-quoted-string string\">'controllers'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token boolean constant\">true</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// true if you want override for all Controllers, an array or a string otherwise</span>\n\t\t <span class=\"token punctuation\">]</span>\n\t <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></span></code></pre></div>","excerpt":"Suite à la création d'un site internet via le CMS Croogo basé sur CakePHP 3, nous avons été amené à devoir surcharger des plugins. En effet…","timeToRead":3,"fields":{"slug":"/blog/surcharger-un-plugin-avec-cakephp-3/"},"frontmatter":{"date":"2019-01-09T15:40:00.000Z","tags":["cakephp","plugin"],"title":"Surcharger un plugin avec CakePHP 3","author":null,"thumbnail":null}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/blog/surcharger-un-plugin-avec-cakephp-3/"}}