{"id":25601,"date":"2021-06-09T18:27:00","date_gmt":"2021-06-09T15:27:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=25601"},"modified":"2021-10-18T02:07:40","modified_gmt":"2021-10-17T23:07:40","slug":"comment-installer-et-utiliser-trix-editor-dans-laravel","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/fr\/comment-installer-et-utiliser-trix-editor-dans-laravel\/","title":{"rendered":"Comment installer et utiliser Trix Editor dans Laravel"},"content":{"rendered":"<p>Lors de la gestion d&rsquo;un site Web, nous avons toujours besoin d&rsquo;un \u00e9diteur de texte riche (WYSIWYG). Si vous souhaitez ajouter un contenu descriptif contenant du HTML, l&rsquo;\u00e9diteur WYSIWYG est le seul choix. Vous ne pouvez pas ajouter ce type de contenu dans la zone de texte. Il existe plusieurs \u00e9diteurs de texte enrichi comme <a href=\"https:\/\/themewp.inform.click\/fr\/comment-installer-et-utiliser-tinymce-editor-dans-laravel\/\" title=\"TinyMCE\" >TinyMCE<\/a>, <a href=\"https:\/\/themewp.inform.click\/fr\/comment-installer-et-utiliser-ckeditor-dans-laravel\/\" title=\"CKEditor\" >CKEditor<\/a> sont disponibles sur Internet. <a href=\"https:\/\/trix-editor.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Trix Editor<\/a> est l&rsquo;un d&rsquo;entre eux. En tant que d\u00e9veloppeur, vous devez avoir entendu parler de Basecamp. L&rsquo;\u00e9diteur Trix est utilis\u00e9 dans Basecamp pour g\u00e9rer le contenu. C&rsquo;est assez dire de la popularit\u00e9 de l&rsquo;\u00e9diteur Trix.<\/p>\n<p>Dans cet article, nous \u00e9tudions comment installer et utiliser l&rsquo;\u00e9diteur Trix dans Laravel. Nous verrons \u00e9galement comment t\u00e9l\u00e9charger des images dans l&rsquo;\u00e9diteur Trix.<\/p>\n<h3>Installation de l&rsquo;\u00e9diteur Trix<\/h3>\n<p>Pour commencer avec Trix, vous devez d&rsquo;abord inclure leur fichier JS et CSS. Vous pouvez trouver ces fichiers sur leur <a href=\"https:\/\/github.com\/basecamp\/trix\/tree\/master\/dist\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">page GitHub sous le r\u00e9pertoire dist<\/a>. T\u00e9l\u00e9chargez 2 fichiers <code>trix.js<\/code>et <code>trix.css<\/code>qui n\u00e9cessiteront bient\u00f4t.<\/p>\n<p>Comme nous devons inclure des actifs, cr\u00e9ez un dossier &lsquo;js&rsquo; et &lsquo;css&rsquo; dans le r\u00e9pertoire public de votre projet Laravel. Placez les fichiers JS et CSS copi\u00e9s dans les r\u00e9pertoires respectifs.<\/p>\n<p>Le t\u00e9l\u00e9chargement d&rsquo;images sur le serveur \u00e0 l&rsquo;aide de Trix n\u00e9cessite l&rsquo;ajout de code JavaScript. Cr\u00e9ez donc un <code>attachments.js<\/code>fichier et conservez-le dans un <code>public\/js<\/code>dossier. Nous ajouterons du code \u00e0 ce fichier dans la derni\u00e8re partie du didacticiel.<\/p>\n<p>Ajoutez le code HTML suivant dans le fichier blade qui affichera l&rsquo;\u00e9diteur Trix.<\/p>\n<pre><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;meta name=\"csrf-token\" content=\"{{ csrf_token() }}\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;link rel=\"stylesheet\" href=\"{{ asset('\/css\/trix.css') }}\"&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;form method=\"post\" action={{ url('ROUTE_HERE') }}&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{{ csrf_field() }}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"x\" type=\"hidden\" name=\"content\" value=\"\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;trix-editor input=\"x\"&gt;&lt;\/trix-editor&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"submit\" name=\"submit\" value=\"Submit\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/form&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0&lt;script src=\"{{ asset('js\/trix.js') }}\"&gt;&lt;\/script&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;script src=\"{{ asset('js\/attachments.js') }}\"&gt;&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>Le code HTML ci-dessus affichera le Trix sur votre page Web, comme indiqu\u00e9 dans la capture d&rsquo;\u00e9cran ci-dessous.<\/p>\n<p>Remarquez, nous pla\u00e7ons l&rsquo;\u00e9diteur Trix en HTML \u00e0 l&rsquo;aide de la <code>trix-editor<\/code>balise. Le champ masqu\u00e9 avec le nom &lsquo;content&rsquo; est utilis\u00e9 pour obtenir ou afficher du contenu dans Trix Editor. Lorsque nous tapons quelque chose dans Trix, le m\u00eame contenu est d\u00e9fini sur ce champ cach\u00e9. C\u00f4t\u00e9 serveur, nous obtiendrons le contenu de l&rsquo;\u00e9diteur Trix en utilisant l&rsquo;instruction ci-dessous.<\/p>\n<pre><code>echo $request-&gt;input('content');<\/code><\/pre>\n<p>De la m\u00eame mani\u00e8re, si vous souhaitez afficher du contenu pr\u00e9-rempli dans Trix, d\u00e9finissez la valeur sur le champ masqu\u00e9 comme suit.<\/p>\n<pre><code>&lt;input id=\"x\" type=\"hidden\" name=\"content\" value=\"&lt;h1&gt;This is content&lt;\/h1&gt;\" \/&gt;<\/code><\/pre>\n<h3>T\u00e9l\u00e9charger l&rsquo;image dans l&rsquo;\u00e9diteur Trix<\/h3>\n<p>Si vous souhaitez utiliser des images dans le contenu, vous devez bien s\u00fbr t\u00e9l\u00e9charger l&rsquo;image sur le serveur. L&rsquo;\u00e9diteur Trix fournit un \u00e9v\u00e9nement \u00e0 l&rsquo; <code>trix-attachment-add<\/code>aide duquel nous t\u00e9l\u00e9chargerons l&rsquo;image via Ajax. D\u00e9finissons un itin\u00e9raire pour cela.<\/p>\n<pre><code>Route::post('upload', 'ProductController@upload');<\/code><\/pre>\n<p>Ajustez le nom du contr\u00f4leur dans la route. Dans la m\u00e9thode de t\u00e9l\u00e9chargement du contr\u00f4leur, \u00e9crivez le code comme suit.<\/p>\n<pre><code>public function upload(Request $request)\n{\n\u00a0\u00a0\u00a0\u00a0if($request-&gt;hasFile('file')) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/get filename with extension\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$filenamewithextension = $request-&gt;file('file')-&gt;getClientOriginalName();\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/get filename without extension\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/get file extension\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$extension = $request-&gt;file('file')-&gt;getClientOriginalExtension();\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/filename to store\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$filenametostore = $filename.'_'.time().'.'.$extension;\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Upload File\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$request-&gt;file('file')-&gt;storeAs('public\/uploads', $filenametostore);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ you can save image path below in database\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$path = asset('storage\/uploads\/'.$filenametostore);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0echo $path;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0exit;\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>Ici, je stocke des images sous le <code>public\/uploads<\/code>dossier. Vous devrez peut-\u00eatre cr\u00e9er un lien symbolique vers le dossier de stockage \u00e0 l&rsquo;aide de la commande\u00a0:<\/p>\n<pre><code>php artisan storage:link<\/code><\/pre>\n<p>Nous avons cr\u00e9\u00e9 un <code>attachments.js<\/code>fichier qui sera utilis\u00e9 pour donner un appel Ajax sur l&rsquo;\u00e9v\u00e9nement <code>trix-attachment-add<\/code>. Ajoutez le code ci-dessous dans le <code>attachments.js<\/code>fichier.<\/p>\n<pre><code>(function() {\n\u00a0\u00a0\u00a0\u00a0var HOST = \"http:\/\/localhost:8000\/upload\"; \/\/pass the route\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0addEventListener(\"trix-attachment-add\", function(event) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (event.attachment.file) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uploadFileAttachment(event.attachment)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0})\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0function uploadFileAttachment(attachment) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0uploadFile(attachment.file, setProgress, setAttributes)\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0function setProgress(progress) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0attachment.setUploadProgress(progress)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0function setAttributes(attributes) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0attachment.setAttributes(attributes)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0function uploadFile(file, progressCallback, successCallback) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var formData = createFormData(file);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var xhr = new XMLHttpRequest();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0xhr.open(\"POST\", HOST, true);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0xhr.setRequestHeader( 'X-CSRF-TOKEN', getMeta( 'csrf-token') );\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0xhr.upload.addEventListener(\"progress\", function(event) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var progress = event.loaded \/ event.total * 100\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0progressCallback(progress)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0xhr.addEventListener(\"load\", function(event) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var attributes = {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url: xhr.responseText,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0href: xhr.responseText + \"?content-disposition=attachment\"\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0successCallback(attributes)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0})\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0xhr.send(formData)\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0function createFormData(file) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var data = new FormData()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.append(\"Content-Type\", file.type)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.append(\"file\", file)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return data\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0function getMeta(metaName) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0const metas = document.getElementsByTagName('meta');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (let i = 0; i &lt; metas.length; i++) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (metas[i].getAttribute('name') === metaName) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return metas[i].getAttribute('content');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return '';\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n})();<\/code><\/pre>\n<p>Dans le code ci-dessus, vous devez passer la route \u00e0 la <code>HOST<\/code>variable. Laravel requiert un jeton CSRF dans chaque requ\u00eate. Nous obtenons ce jeton CSRF \u00e0 partir de la balise meta HTML que nous avons ajout\u00e9e dans le fichier blade. Lorsque vous ajoutez l&rsquo;image dans Trix, il lance un appel Ajax, t\u00e9l\u00e9charge l&rsquo;image sur le serveur et renvoie le chemin de l&rsquo;image t\u00e9l\u00e9charg\u00e9e.<\/p>\n<p>J&rsquo;esp\u00e8re que vous comprenez comment installer et utiliser l&rsquo;\u00e9diteur Trix dans Laravel. S&rsquo;il vous pla\u00eet partager vos pens\u00e9es et suggestions dans la section commentaires ci-dessous.<\/p>\n<h4>Articles Li\u00e9s<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/fr\/comment-installer-et-utiliser-ckeditor-dans-laravel\/\" title=\"Comment installer et utiliser CKEditor dans Laravel\">Comment installer et utiliser CKEditor dans Laravel<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/fr\/comment-installer-et-utiliser-tinymce-editor-dans-laravel\/\" title=\"Comment installer et utiliser TinyMCE Editor dans Laravel\">Comment installer et utiliser TinyMCE Editor dans Laravel<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/fr\/redimensionner-l-image-dans-laravel-a-l-aide-de-la-bibliotheque-d-images-d-intervention\/\" title=\"Redimensionner l&#039;image dans Laravel \u00e0 l&#039;aide de la biblioth\u00e8que d&#039;images d&#039;intervention\">Redimensionner l&rsquo;image dans Laravel \u00e0 l&rsquo;aide de la biblioth\u00e8que d&rsquo;images d&rsquo;intervention<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vous souhaitez int\u00e9grer l&rsquo;\u00e9diteur Trix dans Laravel ? Dans cet article, nous \u00e9tudions comment installer et utiliser l&rsquo;\u00e9diteur Trix dans Laravel. On voit aussi l&rsquo;image<\/p>\n","protected":false},"author":1,"featured_media":20291,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[497],"tags":[844],"class_list":["post-25601","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel2-4","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/posts\/25601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/comments?post=25601"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/posts\/25601\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/media\/20291"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/media?parent=25601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/categories?post=25601"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/fr\/wp-json\/wp\/v2\/tags?post=25601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}