{"id":234215,"date":"2023-02-14T14:57:00","date_gmt":"2023-02-14T11:57:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234215"},"modified":"2022-11-12T00:38:49","modified_gmt":"2022-11-11T21:38:49","slug":"creer-un-bloc-gutenberg-personnalise-partie-6-barres-doutils","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/creer-un-bloc-gutenberg-personnalise-partie-6-barres-doutils\/","title":{"rendered":"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 &#8211; Partie 6\u00a0: Barres d&rsquo;outils"},"content":{"rendered":"\n<p>Dans cet article, nous apprendrons comment ajouter les barres d&rsquo;outils de WordPress \u00e0 notre bloc, c&rsquo;est-\u00e0-dire pour l&rsquo;alignement et l&rsquo;alignement des blocs. Nous apprendrons \u00e9galement \u00e0 ajouter nos propres barres d&rsquo;outils avec nos propres boutons pour effectuer des actions personnalis\u00e9es.<\/p>\n<h2>Ajout de barres d&rsquo;outils<\/h2>\n<p>Afin d&rsquo;ajouter quelque chose \u00e0 la barre d&rsquo;outils de notre bloc, nous devrons encapsuler ce que nous voulons dans un composant appel\u00e9 <code>BlockControls<\/code>(from <code>wp.blockEditor<\/code>). \u00c0 l&rsquo;int\u00e9rieur de ce composant, nous pouvons ajouter l&rsquo;un des composants WordPress pour les barres d&rsquo;outils standard que nous connaissons \u00e0 partir d&rsquo;autres blocs (par exemple l&rsquo;alignement) ou nous pouvons ajouter notre propre barre d&rsquo;outils.<\/p>\n<p>Par d\u00e9faut, un bloc aura une barre d&rsquo;outils contenant uniquement l&rsquo;ic\u00f4ne du bloc (pour la fonctionnalit\u00e9 Transformer en) et le menu du bloc pour, par exemple, supprimer le bloc. Nous ne pouvons pas les supprimer, mais nous pouvons ajouter nos propres boutons et barres d&rsquo;outils entre les deux.<\/p>\n<p>Cependant, certains composants WordPress ajouteront eux-m\u00eames leurs propres barres d&rsquo;outils. \u00c0 l&rsquo;heure actuelle, notre bloc affiche une barre d&rsquo;outils pour la mise en forme du texte provenant du <code>RichText<\/code>composant que nous avons ajout\u00e9.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7785e80.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7785e80.png\" alt=\"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 - Partie 6\u00a0: Barres d&#039;outils\" ><\/a><\/p>\n<h2>Ajout d&rsquo;une barre d&rsquo;outils d&rsquo;alignement de blocs<\/h2>\n<p>La barre d&rsquo;outils d&rsquo;alignement des blocs existe sur pratiquement tous les types de blocs WordPress, alors ajoutons-la \u00e9galement \u00e0 notre bloc. Dans les coulisses, il existe un composant <code>BlockAlignmentToolbar<\/code>que nous pourrions ajouter, mais je recommande de ne pas le faire. Son utilisation n\u00e9cessite de g\u00e9rer manuellement les classes pour l&rsquo;alignement des blocs et de s&rsquo;assurer que le bloc \u00e9tend sa largeur dans l&rsquo;\u00e9diteur lorsque vous choisissez &quot;large largeur&quot; \u200b\u200bou &quot;pleine largeur&quot;. Heureusement, WordPress a rendu sa mise en \u0153uvre tr\u00e8s facile, enti\u00e8rement automatique.<\/p>\n<p>PS: Le th\u00e8me actif doit activement avoir ajout\u00e9 un support de th\u00e8me pour ces deux alignements de blocs. Vous pouvez ajouter un support pour ceux-ci en ayant <code>add_theme_support('align-wide')<\/code>dans le <code>after_setup_theme<\/code>crochet.<\/p>\n<p>Nous pouvons ajouter une nouvelle propri\u00e9t\u00e9 \u00e0 notre configuration d&rsquo;objet dans <code>registerBlockType()<\/code>, appel\u00e9e <code>supports<\/code>. Il existe quelques autres fonctionnalit\u00e9s, mais ce qui nous int\u00e9resse ici, c&rsquo;est <code>align<\/code>. Nous pouvons soit configurer <code>align<\/code>pour <code>true<\/code>ajouter tous les alignements possibles, soit fournir un tableau pr\u00e9cis des alignements que nous autorisons pour notre bloc.<\/p>\n<pre><code>...\nregisterBlockType('awp\/firstblock', {\n    ...\n    supports: {\n        align: true\n    },\n    edit: (props) =&gt; {\n        ...\n});<\/code><\/pre>\n<p>Ce qui nous donne ceci dans l&rsquo;\u00e9diteur :<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7967acd.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7967acd.png\" alt=\"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 - Partie 6\u00a0: Barres d&#039;outils\" ><\/a><\/p>\n<p>Si vous vouliez par exemple emp\u00eacher quiconque d&rsquo;utiliser Wide Width ou Full Width, vous pouvez fournir un tableau et exclure ces deux \u00e9l\u00e9ments. Les noms des alignements de blocs sont les suivants: <code>left<\/code>, <code>right<\/code>, <code>center<\/code>, <code>wide<\/code>, et <code>full<\/code>.<\/p>\n<pre><code>supports: {\n    align: ['left', 'right', 'center']\n},<\/code><\/pre>\n<h3>Besoin d&rsquo;un alignement par d\u00e9faut\u00a0?<\/h3>\n<p>Par d\u00e9faut, le bloc n&rsquo;obtient aucun alignement de bloc. Si vous le souhaitez, vous pouvez d\u00e9finir une valeur par d\u00e9faut en cr\u00e9ant un attribut avec la cl\u00e9 <code>align<\/code>, d\u00e9finissez le type sur <code>string<\/code>et d\u00e9finissez la valeur par d\u00e9faut ici. WordPress connectera automatiquement cet attribut \u00e0 l&rsquo;alignement du bloc.<\/p>\n<pre><code>attributes: {\n    align: {\n        type: 'string',\n        default: 'center'\n    }\n},\nsupports: {\n    align: true\n},<\/code><\/pre>\n<p>Avec cela, chaque fois qu&rsquo;un nouveau bloc de notre type est cr\u00e9\u00e9, l&rsquo;alignement de bloc par d\u00e9faut est centr\u00e9.<\/p>\n<h3>D\u00e9sordre de style d&rsquo;alignement de bloc\u00a0? Pas notre faute<\/h3>\n<p><strong>Remarque :<\/strong> Le style de bloc par d\u00e9faut de WordPress perturbera le flux de votre contenu de publication lors de l&rsquo;utilisation de l&rsquo;alignement de bloc gauche et droit. La m\u00eame chose se produit \u00e9galement avec d&rsquo;autres types de blocs de WordPress et n&rsquo;est pas exclusivement le probl\u00e8me de notre bloc. Cela est d\u00fb \u00e0 l&rsquo;ajout de float \u00e0 l&rsquo;\u00e9l\u00e9ment, ce qui r\u00e9duit l&rsquo;\u00e9l\u00e9ment parent. Croyez-moi, j&rsquo;ai essay\u00e9 de construire le bloc pour \u00e9viter ce probl\u00e8me. La seule chose que j&rsquo;ai trouv\u00e9e qui fonctionne correctement sans perturber les autres alignements de blocs est d&rsquo;ajouter un style \u00e0 l&rsquo;\u00e9diteur et d&rsquo;ajuster le style flottant.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7baa1f0.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7baa1f0.png\" alt=\"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 - Partie 6\u00a0: Barres d&#039;outils\" ><\/a><\/p>\n<p>Quoi qu&rsquo;il en soit, WordPress a rendu assez facile la mise en \u0153uvre de l&rsquo;alignement des blocs. Regardons maintenant les autres barres d&rsquo;outils que nous pouvons utiliser.<\/p>\n<h2>Ajout d&rsquo;une barre d&rsquo;outils d&rsquo;alignement de texte<\/h2>\n<p>Si vous pr\u00e9f\u00e9rez la barre d&rsquo;outils pour l&rsquo;alignement du texte, vous pouvez le faire au lieu de l&rsquo;alignement des blocs &#8211; dans cette barre d&rsquo;outils, nous n&rsquo;avons que l&rsquo;alignement \u00e0 gauche, au centre et \u00e0 droite. En fait, vous pouvez utiliser \u00e0 la fois l&rsquo;alignement du texte et l&rsquo;alignement des blocs &#8211; ils fonctionnent s\u00e9par\u00e9ment. Afin de ne pas confondre les utilisateurs, vous pouvez par exemple ajouter uniquement la prise en charge de l&rsquo;alignement de bloc large et pleine largeur, et utiliser la barre d&rsquo;outils d&rsquo;alignement de texte pour contr\u00f4ler l&rsquo;alignement \u00e0 gauche, au centre ou \u00e0 droite. En faisant cela, vous <strong>\u00e9vitez le probl\u00e8me mentionn\u00e9 ci-dessus<\/strong> avec le flux de blocs dans l&rsquo;\u00e9diteur. C&rsquo;est \u00e0 vous de d\u00e9cider comment vous voulez que votre bloc fonctionne.<\/p>\n<p>WordPress a un composant pour sortir la barre d&rsquo;outils d&rsquo;alignement du texte, mais aucune gestion automatique de l&rsquo;ajout des bonnes classes pour aligner le contenu &#8211; \u00e0 la fois dans l&rsquo;\u00e9diteur et dans le frontend (pour autant que j&rsquo;ai trouv\u00e9 au moins !). Nous devons ajouter et mettre \u00e0 jour manuellement un attribut pour l&rsquo;alignement du texte.<\/p>\n<h3>Ajout <code>BlockControls<\/code>et<code>AlignmentToolbar<\/code><\/h3>\n<p>Ajoutons enfin <code>BlockControls<\/code>\u00e0 notre <code>edit<\/code>fonction pour notre sortie dans la barre d&rsquo;outils. Le composant pour l&rsquo;alignement du texte provient <code>AlignmentToolbar<\/code>de <code>wp.blockEditor<\/code>package.<\/p>\n<pre><code>const { registerBlockType } = wp.blocks;\nconst { RichText, InspectorControls, BlockControls, AlignmentToolbar } = wp.blockEditor;\nconst { ToggleControl, PanelBody, PanelRow, CheckboxControl, SelectControl, ColorPicker } = wp.components;\n\u00a0\nregisterBlockType('awp\/firstblock', {\n    title: 'My first block',\n    category: 'common',\n    icon: 'smiley',\n    description: 'Learning in progress',\n    keywords: ['example', 'test'],\n    attributes: {\n        myRichHeading: {\n            type: 'string',\n        },\n        myRichText: {\n            type: 'string',\n            source: 'html',\n            selector: 'p'\n        },\n        textAlignment: {\n            type: 'string',\n        }\n    },\n    supports: {\n        align: ['wide', 'full']\n    },\n    edit: (props) =&gt; {\n        const { attributes, setAttributes } = props;\n        const alignmentClass = (attributes.textAlignment != null)? 'has-text-align-' + attributes.textAlignment: '';\n\u00a0\n        return (&lt;div className={alignmentClass}&gt;\n                &lt;InspectorControls&gt;\n                    ... \n                &lt;\/InspectorControls&gt;\n                &lt;BlockControls&gt;\n                    &lt;AlignmentToolbar\n                        value={attributes.textAlignment}\n                        onChange={(newalign) =&gt; setAttributes({ textAlignment: newalign })}\n                    \/&gt;\n                &lt;\/BlockControls&gt;\n                &lt;RichText \n                    tagName=\"h2\"\n                    placeholder=\"Write your heading here\"\n                    value={attributes.myRichHeading}\n                    onChange={(newtext) =&gt; setAttributes({ myRichHeading: newtext })}\n                \/&gt;\n                &lt;RichText\n                    tagName=\"p\"\n                    placeholder=\"Write your paragraph here\"\n                    value={attributes.myRichText}\n                    onChange={(newtext) =&gt; setAttributes({ myRichText: newtext })}\n                \/&gt;\n            &lt;\/div&gt;\n        );\n\u00a0\n    },\n    save: (props) =&gt; { \n        const { attributes } = props;\n\u00a0\n        const alignmentClass = (attributes.textAlignment != null)? 'has-text-align-' + attributes.textAlignment: '';\n        return (&lt;div className={alignmentClass}&gt;\n                &lt;RichText.Content \n                    tagName=\"h2\"\n                    value={attributes.myRichHeading}\n                \/&gt;\n                &lt;RichText.Content \n                    tagName=\"p\"\n                    value={attributes.myRichText}\n                \/&gt;\n                {attributes.activateLasers &amp;&amp; \n                    &lt;div className=\"lasers\"&gt;Lasers activated&lt;\/div&gt;\n                }\n            &lt;\/div&gt;\n        );\n    }\n});<\/code><\/pre>\n<p>Notez que j&rsquo;ai exclu le contenu de tout ce que nous avons cr\u00e9\u00e9 \u00e0 <code>InspectorControls<\/code>l&rsquo;\u00e9tape pr\u00e9c\u00e9dente pour raccourcir le code.<\/p>\n<p>Entre les lignes <code>#37<\/code>se <code>#42<\/code>trouve l&rsquo;int\u00e9gralit\u00e9 du contenu de notre barre d&rsquo;outils (\u00e0 l&rsquo;exception de l&rsquo;alignement des blocs automatiquement ajout\u00e9 par la <code>supports<\/code>propri\u00e9t\u00e9 et de la mise en forme du texte ajout\u00e9e par nos <code>RichText<\/code>composants). Nous utilisons <code>BlockControls<\/code>pour acc\u00e9der \u00e0 la barre d&rsquo;outils, et \u00e0 l&rsquo;int\u00e9rieur nous ajoutons le <code>AlignmentToolbar<\/code>composant.<\/p>\n<p>Comme nous l&rsquo;avons fait plusieurs fois avec des entr\u00e9es, nous fournissons un <code>value<\/code>accessoire pour afficher la valeur enregistr\u00e9e et un <code>onChange<\/code>accessoire pour mettre \u00e0 jour notre attribut au <code>AlignmentToolbar<\/code>composant. L&rsquo;attribut que nous utiliserons pour stocker l&rsquo;alignement de texte choisi est d\u00e9fini comme <code>textAlignment<\/code>et doit \u00eatre de type <code>string<\/code>. Comme d&rsquo;habitude, vous pouvez fournir un <code>default<\/code>pour vous assurer que les blocs nouvellement cr\u00e9\u00e9s obtiennent un alignement par d\u00e9faut.<\/p>\n<p>Afin de s&rsquo;assurer que le bloc g\u00e9n\u00e8re \u00e0 la fois les informations d&rsquo;alignement et est \u00e9galement styl\u00e9 correctement (nous voyons donc l&rsquo;alignement du changement de texte) \u00e0 la fois dans l&rsquo;\u00e9diteur et dans le frontend, nous devons configurer manuellement la bonne classe sur la div d&#8217;emballage. Dans les deux <code>edit<\/code>et <code>save<\/code>je d\u00e9finis une variable qui v\u00e9rifie si <code>attributes.textAlignment<\/code>est d\u00e9fini. Si c&rsquo;est le cas, je construis le nom de la classe en suivant les normes de WordPress pour les alignements de texte, qui est &quot;has-text-align-(left|center|right)&quot;. Avec cette classe, WordPress appliquera son style \u00e0 notre bloc et s&rsquo;assurera que notre bloc est visuellement correctement align\u00e9, \u00e0 la fois dans l&rsquo;\u00e9diteur et le frontend.<\/p>\n<h3>Ajout de barres d&rsquo;outils personnalis\u00e9es avec nos propres boutons<\/h3>\n<p>Vous pouvez \u00e9galement ajouter vos propres boutons dans la barre d&rsquo;outils pour faire ce que vous voulez en cliquant dessus. Pour ce faire, vous voudrez ajouter le composant <code>Toolbar<\/code>et \u00e0 l&rsquo;int\u00e9rieur de cet \u00e9l\u00e9ment ajouter un <code>IconButton<\/code>(les deux dans le <code>wp.components<\/code>package). Le tout \u00e0 l&rsquo;int\u00e9rieur <code>BlockControls<\/code>bien s\u00fbr.<\/p>\n<p><strong>Remarque<\/strong>: Selon WordPress, le journal des modifications de Gutenberg <code>IconButton<\/code>est obsol\u00e8te au profit de l&rsquo;utilisation de <code>Button<\/code>. Cependant, je n&rsquo;arrive pas \u00e0 faire appara\u00eetre une ic\u00f4ne en utilisant le <code>Button<\/code>composant, peu importe ce que je fais, m\u00eame s&rsquo;il est cens\u00e9 le prendre en charge. Donc \u00e0 partir de maintenant j&rsquo;utiliserai <code>IconButton<\/code>.<\/p>\n<p>Vous pouvez \u00e9videmment combiner plusieurs composants de barre d&rsquo;outils dans <code>BlockControls<\/code>. Avec le code ci-dessous, nous ajoutons la barre d&rsquo;outils d&rsquo;alignement du texte et notre barre d&rsquo;outils personnalis\u00e9e avec un bouton apr\u00e8s.<\/p>\n<pre><code>&lt;BlockControls&gt;\n    &lt;AlignmentToolbar\n        value={attributes.textAlignment}\n        onChange={(newalign) =&gt; setAttributes({ textAlignment: newalign })}\n    \/&gt;\n    &lt;Toolbar&gt;\n        &lt;IconButton\n            label=\"My very own custom button\"\n            icon=\"edit\"\n            className=\"my-custom-button\"\n            onClick={() =&gt; console.log('pressed button')}\n        \/&gt;\n    &lt;\/Toolbar&gt;\n&lt;\/BlockControls&gt;<\/code><\/pre>\n<p>Le composant IconButton accepte une ic\u00f4ne <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dashicon WordPress<\/a> ou un SVG dans le prop <code>icon<\/code>. Nous pouvons fournir d&rsquo;autres accessoires tels que <code>className<\/code>et <code>label<\/code>(appara\u00eetra dans l&rsquo;info-bulle lorsque vous survolerez le bouton). Le prop qui nous int\u00e9resse le plus est \u00e9videmment le <code>onClick<\/code>prop qui se d\u00e9clenche lorsque le bouton est cliqu\u00e9. Ici, nous pouvons fournir une fonction et faire essentiellement ce que nous voulons. Les possibilit\u00e9s sont infinies et d\u00e9pendent de ce que vous voulez faire. Dans le code ci-dessus, je console simplement quelque chose lorsque le bouton est cliqu\u00e9. Au fur et \u00e0 mesure que nous progressons dans cette s\u00e9rie de didacticiels, vous aurez probablement des id\u00e9es sur la fa\u00e7on de faire en sorte que votre bouton personnalis\u00e9 fasse ce que vous voulez qu&rsquo;il fasse.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7e57cd7.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153353-61e50c7e57cd7.png\" alt=\"Cr\u00e9er un bloc Gutenberg personnalis\u00e9 - Partie 6\u00a0: Barres d&#039;outils\" ><\/a><\/p>\n<p>C&rsquo;est ce que nous avons fait jusqu&rsquo;\u00e0 pr\u00e9sent. Dans la prochaine \u00e9tape de la s\u00e9rie, nous commencerons \u00e0 examiner des \u00e9l\u00e9ments plus avanc\u00e9s et nous apprendrons \u00e0 cr\u00e9er nos propres composants pour utiliser l&rsquo;\u00e9tat et d&rsquo;autres avantages.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cet article, nous apprendrons comment ajouter les barres d&rsquo;outils de WordPress Gutenberg \u00e0 notre bloc ; l&rsquo;alignement du texte, l&rsquo;alignement des blocs et nos propres barres d&rsquo;outils personnalis\u00e9es.<\/p>\n","protected":false},"author":1,"featured_media":153354,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,893,832,936,936,915,1110,811,811,832,841,841,862,862],"tags":[1167],"class_list":{"0":"post-234215","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-autre","8":"category-code-2","10":"category-guide-pour-les-debutants","11":"category-gutenberg-3","14":"category-n-a","15":"category-plugins-2","18":"category-tutoriels","20":"category-wordpress-3","22":"tag-affiai-fr"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234215","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234215"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234215\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/153354"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}