Bonsoir, Problème lors de l'édition d'un formulaire avec image, l'ajout marche très bien.

A l'édition, si je veux laisser la même image, je ne remplie pas l'input.
Donc il remplit bien tous les champs sauf le input de type file, donc il applique quand même la règle et du coup bloque la soumission du formulaire.

J’espère avoir été clair ;-)

Controller :

public function admin_edit($id = null) {
        $this->layout = 'admin';
        $this->Galery->id = $id;

        $d'albums'] = $this->Album->find('list');
        $this->set($d);
        //if (!$this->Galery->exists()) {
        //  throw new NotFoundException(__('Invalid galery'));
        //}
        if ($this->request->is('post')) {
            if ($this->Galery->save($this->request->data)) {
                    $image = $this->request->data"Galery"]"img"];
                       $ext = strtolower(substr($image'name'],-3));
                       $allow_ext = array("jpg");
                    if(in_array($ext,$allow_ext)){
                           move_uploaded_file($this->request->data"Galery"]"img"]"tmp_name"],"img/galerie/".$this->Galery->id.".jpg");
                           $img = $this->Galery->id;
                           $this->Galery->saveField('image', $img);
                    }
                $this->Session->setFlash('L\'Image à bien été ajouter.', 'admin_notif');
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash('L\'Image n\'a pas été modifié, Vérifier les champs.', 'admin_notif', array('type' => 'error'));
            }
        } 

        if ($this->request->is('put')) {
                    if ($this->Galery->save($this->request->data)) {
                           $image = $this->request->data"Galery"]"img"];
                           $ext = strtolower(substr($image'name'],-3));
                           $allow_ext = array("jpg");
                        if(in_array($ext,$allow_ext)){
                               move_uploaded_file($this->request->data"Galery"]"img"]"tmp_name"],"img/galerie/".$this->request->data"Galery"]"id"].".jpg");
                            unlink('img/galerie/thumbs/'.$this->request->data'Galery']'id'].'_300x160.jpg');
                            unlink('img/galerie/thumbs/'.$this->request->data'Galery']'id'].'_902x300.jpg');
                            $img = $this->request->data"Galery"]"id"];
                            $this->Galery->saveField('image', $img);
                        }
                        $this->Session->setFlash('L\'Image à bien été modifié.', 'admin_notif');
                        $this->redirect(array('action' => 'index'));
                    } else {
                        $this->Session->setFlash('L\'Image n\'a pas été modifié, Vérifier les champs.', 'admin_notif', array('type' => 'error'));
                    }

            }
            if (empty($this->request->data)) {
                $this->request->data = $this->Galery->read(null, $id);
            }
    }

Model :

class Galery extends AppModel {
    public $belongsTo = array('Album');
    public $validate = array(
        "title" => array(
            "rule" => 'notEmpty',
            "message" => "Vous devez entrer un Titre"
        ),
        'img' => array(        
            'rule' => array('extension', array('jpeg', 'jpg')),
            'message' => "Le fichier n'est pas une image valide."
        )
     );
}

View :

<?php $this->assign('title', 'Administration | Galerie Edition'); ?>
<?php debug($this->request->data); ?>
    <h2>Ajout/Edition d'une Image</h2> 
    <div class="form">
         <?php echo $this->Form->create('Galery', array('type' => 'file', 'inputDefaults' => array('label' => false)));?>
        <table>
                <?php echo $this->Form->input('id'); ?>
            <tr>
                <td><strong>Titre :</strong><br/><?php echo $this->Form->input('title'); ?></td>
            </tr>
               <tr>
                  <td><strong>Image : (.jpg / 2 Mo max)</strong><br /><?php echo $this->Form->input('img', array('type' => 'file')); ?></td>
              </tr>
              <tr>
                <td>    
                    <?php if(isset($this->request->data'Galery']'id']) AND $this->request->data'Galery']'id'] != null){ 
                    $img = $this->Form->data'Galery']'image']; 
                    echo '<strong>Image Actuelle :</strong><br>';
                    echo $this->Html->image('galerie/thumbs/'.$img.'_122x100.jpg');
                    }?>
                </td>
            </tr>
               <tr>
                  <td><strong>Album : </strong><br /><?php echo $this->Form->input('album_id'); ?></td>
              </tr>
            <tr>
                <td><strong>Date :</strong><br /><?php echo $this->Form->input('date', array('dateFormat' => 'DMY')); ?></td>
            </tr>
        </table>
    <?php echo $this->Form->end('Envoyé');?>
         </div>

Cordialement Flo2315.

5 réponses


Je connais ce problème, en faite il faut obligatoirement mettre quelque chose dans le selectionner le fichier au sinon il rale.

Flo2315
Auteur

Merci de ta réponse, mais moi j'aimerais que si je ne change pas d'image, ne pas la rechercher dans mon ordi, juste pour valider cette règle.

Ce que tu peux faire s'est mettre une valeur de validation et tu vérifie avant de faire ton save si tu as une image tu l'upload et tu renvoie le nom de l'image au sinon tu renvoies une valeure prédéfinie dans ton système de validation. Je ne vois que sa.

Flo2315
Auteur

Merci, ralala c'est le bordel les images ;-)

Du coup j'ai rajouté une règle dans mon model qui vérifie l'image, mais seulement à l'ajout, pas à l'édition. Du coup si à l’édition on envoie un fichier autre q'une image il l'accepte. Mais bon c'est déjà mieux.

'img' => array(        
            'rule' => array('extension', array('jpeg', 'jpg')),
            'on' => 'create',
            'message' => "Le fichier n'est pas une image valide."
        )

Je laisse le post ouvert si d'autres solutions arrivent :-)

Salut Flo je pense qu'il te faudrais une regle de validation personnaliser avec un test en php si le champ est vide return true sinon test extension...

Voila