{"id":309,"date":"2016-05-19T12:39:34","date_gmt":"2016-05-19T11:39:34","guid":{"rendered":"http:\/\/blog.bellanca-web.com\/?p=309"},"modified":"2016-05-19T21:18:36","modified_gmt":"2016-05-19T20:18:36","slug":"upload-dune-image","status":"publish","type":"post","link":"https:\/\/blog.bellanca-web.com\/?p=309","title":{"rendered":"Upload d&rsquo;une image"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>Ce petit tutoriel explique comment sauvegarder un fichier \u00ab\u00a0image\u00a0\u00bb avec Yii 2.<\/p>\n<h1>Mod\u00e8le de base<\/h1>\n<p>Le mod\u00e8le de base sur lequel sont bas\u00e9 les op\u00e9rations pr\u00e9sent\u00e9es ci-dessous est le suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"thumbnail alignnone wp-image-310 size-full\" src=\"http:\/\/blog.bellanca-web.com\/wp-content\/uploads\/mdl.png\" alt=\"mdl\" width=\"546\" height=\"197\" \/><\/p>\n<p>Dans ce tutoriel, nous allons nous concentrer uniquement sur la classe\/table <strong>Site<\/strong> qui contient une image (logo du site).<\/p>\n<h1>Pr\u00e9requis<\/h1>\n<p>Avoir cr\u00e9\u00e9 le CRUD des deux mod\u00e8les \u00e0 l&rsquo;aide de Gii.<\/p>\n<h1>Op\u00e9rations \u00e0 effectuer<\/h1>\n<h2>Mod\u00e8le<\/h2>\n<p>Pour commencer, il faut modifier le mod\u00e8le Site afin d&rsquo;y ajouter la variable $image et des r\u00e8gles concernant l&rsquo;image.<\/p>\n<p># modeles\/Site.php<\/p>\n<pre class=\"lang:default decode:true\">class Site extends \\yii\\db\\ActiveRecord\r\n{\r\n    public $image;<\/pre>\n<p>les r\u00e8gles :<\/p>\n<p># models\/Site.php::rules()<\/p>\n<pre class=\"lang:default decode:true\">\/\/ Other rules\r\n[['image'], 'file', 'skipOnEmpty' =&gt; true,\r\n\u00a0\u00a0\u00a0 'maxSize' =&gt; 102400, 'extensions' =&gt; 'jpg, jpeg, png',\r\n\u00a0\u00a0\u00a0 'tooBig' =&gt; 'L\\'image ne peut pas \u00eatre plus grande que 100 Ko.',\r\n\u00a0\u00a0\u00a0 'wrongExtension' =&gt; 'L\\'image doit \u00eatre au format JPG ou PNG.',\r\n\u00a0\u00a0\u00a0 'on' =&gt; 'register'],\r\n[['image'], 'file', 'skipOnEmpty' =&gt; false,\r\n\u00a0\u00a0\u00a0 'maxSize' =&gt; 102400, 'extensions' =&gt; 'jpg, jpeg, png',\r\n\u00a0\u00a0\u00a0 'tooBig' =&gt; 'L\\'image ne peut pas \u00eatre plus grande que 100 Ko.',\r\n\u00a0\u00a0\u00a0 'wrongExtension' =&gt; 'L\\'image doit \u00eatre au format JPG ou PNG.',\r\n\u00a0\u00a0\u00a0 'on' =&gt; 'update']<\/pre>\n<p>Dans cet exemple, l&rsquo;image doit \u00eatre de type jpg, jpeg ou png et ne doit pas \u00eatre plus grande que 100 octets.<\/p>\n<h2>Form<\/h2>\n<p>Nous devons ensuite modifier le formulaire afin de permettre la s\u00e9lection de l&rsquo;image. Nous en profiterons pour \u00e9purer l&rsquo;affichage du formulaire des donn\u00e9es techniques de l&rsquo;image (type et taille).<\/p>\n<p>Il faut que le formulaire ait l&rsquo;option <strong>enctype<\/strong> de type <strong>multipart\/form-data<\/strong>.<\/p>\n<pre class=\"lang:default decode:true \">use yii\\widgets\\ActiveForm;\r\n$form = ActiveForm::begin(\r\n  [\r\n    'enableAjaxValidation' =&gt; false,\r\n    'options' =&gt; ['enctype' =&gt; 'multipart\/form-data'],\r\n  ]\r\n);<\/pre>\n<p>Ensuite, il faut supprimer les lignes suivantes car ces champs seront renseign\u00e9s par le controller\u00a0 :<\/p>\n<pre class=\"lang:default decode:true \">    &lt;?= $form-&gt;field($model, 'image_name')-&gt;textInput(['maxlength' =&gt; true]) ?&gt;\r\n\r\n    &lt;?= $form-&gt;field($model, 'image_type')-&gt;textInput(['maxlength' =&gt; true]) ?&gt;\r\n\r\n    &lt;?= $form-&gt;field($model, 'image_size')-&gt;textInput() ?&gt;<\/pre>\n<p>Puis, il faut ajouter le champs \u00ab\u00a0fichier\u00a0\u00bb d&rsquo;upload de l&rsquo;image :<\/p>\n<pre class=\"lang:default decode:true\">&lt;?= $form-&gt;field($model, 'image')-&gt;fileInput() ?&gt;<\/pre>\n<h2>Controller<\/h2>\n<p>Finalement, nous allons voir comment r\u00e9cup\u00e9rer et sauvegarder l&rsquo;image. Pour ce faire, il faut modifier le controller <strong>controllers\/SiteController.php<\/strong>.<\/p>\n<h3>Create<\/h3>\n<p>Nous allons commencer par modifier l&rsquo;action actionCreate. Son \u00e9tat de base est le suivant :<\/p>\n<pre class=\"lang:default decode:true\">public function actionCreate()\r\n{\r\n    $model = new Site();\r\n\r\n    if ($model-&gt;load(Yii::$app-&gt;request-&gt;post()) &amp;&amp; $model-&gt;save()) {\r\n        return $this-&gt;redirect(['view', 'id' =&gt; $model-&gt;id]);\r\n    } else {\r\n        return $this-&gt;render('create', [\r\n            'model' =&gt; $model,\r\n        ]);\r\n    }\r\n}<\/pre>\n<p>Il faut la modifier comme suite :<\/p>\n<pre class=\"lang:default decode:true\">public function actionCreate()\r\n{\r\n    $model = new Site();\r\n\r\n\u00a0\u00a0\u00a0 if (Yii::$app-&gt;request-&gt;isPost) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $model-&gt;load(Yii::$app-&gt;request-&gt;post());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $model-&gt;image = UploadedFile::getInstance($model, 'image');\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if($model-&gt;image !== null){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $model-&gt;image_name = $model-&gt;mnemo . '.' . $model-&gt;image-&gt;extension;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $model-&gt;image_type = $model-&gt;image-&gt;type;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $model-&gt;image_size = $model-&gt;image-&gt;size;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ($model-&gt;save()) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if($model-&gt;image !== null){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $model-&gt;image-&gt;saveAs('chemin\/vers\/destination');\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n            return $this-&gt;redirect(['view','id' =&gt; $model-&gt;id]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 return $this-&gt;render('create', ['model' =&gt; $model]);\r\n}<\/pre>\n<p>Il faut \u00e9galement ajouter en d\u00e9but de document le namespace pour pouvoir utiliser le helper du m\u00eame nom :<\/p>\n<pre class=\"lang:default decode:true \">use yii\\web\\UploadedFile;<\/pre>\n<h3>Update<\/h3>\n<p>Les modifications \u00e0 apporter \u00e0 l&rsquo;action Update sont tr\u00e8s similaire \u00e0 l&rsquo;action Create.<\/p>\n<p>L&rsquo;action sans modification est la suivante :<\/p>\n<pre class=\"lang:default decode:true\">public function actionUpdate($id)\r\n{\r\n    $model = $this-&gt;findModel($id);\r\n\r\n    if ($model-&gt;load(Yii::$app-&gt;request-&gt;post()) &amp;&amp; $model-&gt;save()) {\r\n        return $this-&gt;redirect(['view', 'id' =&gt; $model-&gt;id]);\r\n    } else {\r\n        return $this-&gt;render('update', [\r\n            'model' =&gt; $model,\r\n        ]);\r\n    }\r\n}<\/pre>\n<p>Nous la modifions comme suite :<\/p>\n<pre class=\"lang:default decode:true \">public function actionUpdate($id)\r\n{\r\n    $model = $this-&gt;findModel($id);\r\n\r\n    if (Yii::$app-&gt;request-&gt;isPost) {\r\n        $model-&gt;load(Yii::$app-&gt;request-&gt;post());\r\n        $upload = UploadedFile::getInstance($model, 'image');\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if($upload !== null){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $model-&gt;image_name = $model-&gt;mnemo . '.' . $upload-&gt;extension;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $model-&gt;image_type = $upload-&gt;type;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $model-&gt;image_size = $upload-&gt;size;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n        if ($model-&gt;save()) {\r\n            if($upload !== null){\r\n                $model-&gt;image = $upload;\r\n\r\n                $model-&gt;image-&gt;saveAs('chemin\/vers\/destination');\r\n            }\r\n            return $this-&gt;redirect(['view','id' =&gt; $model-&gt;id]);\r\n        }    \r\n    }\r\n    return $this-&gt;render('update', ['model' =&gt; $model]);       \r\n}<\/pre>\n<h3>Delete<\/h3>\n<p>Il ne faut pas oublier de supprimer le fichier lors du lancement de l&rsquo;action Delete. Pour ce faire, nous utilisons la fonction <strong>unlink<\/strong> de PHP.<\/p>\n<p>Action d&rsquo;origine :<\/p>\n<pre class=\"lang:default decode:true \">public function actionDelete($id)\r\n{\r\n    $this-&gt;findModel($id)-&gt;delete();\r\n\r\n    return $this-&gt;redirect(['index']);\r\n}<\/pre>\n<p>Action modifi\u00e9e :<\/p>\n<pre class=\"lang:default decode:true \">public function actionDelete($id)\r\n{\r\n    $model = $this-&gt;findModel($id);\r\n    $filename = $model-&gt;image_name;\r\n        \r\n    $model-&gt;delete();\r\n        \r\n    unlink('chemin\/vers\/destination' . $filename);\r\n\r\n    return $this-&gt;redirect(['index']);\r\n}<\/pre>\n<h1>Remarques<\/h1>\n<p>Dans ce tutoriel, nous n&rsquo;avons pas abord\u00e9 plusieurs aspect qu&rsquo;il est important de traiter dans un projet r\u00e9el :<\/p>\n<ul>\n<li>centraliser le chemin vers les image dans les param\u00e8tres de l&rsquo;application<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Ce petit tutoriel explique comment sauvegarder un fichier \u00ab\u00a0image\u00a0\u00bb avec Yii 2. Mod\u00e8le de base Le mod\u00e8le de base sur lequel sont bas\u00e9 les op\u00e9rations pr\u00e9sent\u00e9es ci-dessous est le suivant : Dans ce tutoriel, nous allons nous concentrer uniquement sur la classe\/table Site qui contient une image (logo du site). Pr\u00e9requis Avoir cr\u00e9\u00e9 le &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.bellanca-web.com\/?p=309\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Upload d&rsquo;une image&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31],"tags":[],"class_list":["post-309","post","type-post","status-publish","format-standard","hentry","category-yii2"],"_links":{"self":[{"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=\/wp\/v2\/posts\/309","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=309"}],"version-history":[{"count":20,"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=\/wp\/v2\/posts\/309\/revisions"}],"predecessor-version":[{"id":333,"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=\/wp\/v2\/posts\/309\/revisions\/333"}],"wp:attachment":[{"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=309"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=309"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.bellanca-web.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}