Bonjour,
Je suis en train de faire ma page de configuration ayant suivi les vidéos de création d'un site, j'ai voulu me baser sur l'exemple "Post" mais je ne parviens pas à changer les valeurs de mes formulaires au chargement de la page.

Ma table "Configurations" est sous la forme name / value (2 colonnes)
Sachant que "name" est identique au champs des formulaires (ex: date = date)

Ma page "ConfigurationsController.php" :

<?php
    class ConfigurationsController extends Controller{
        /**
        * ADMIN
        **/
        function admin_index(){
            $this->loadModel('Configuration');
            if($this->request->data){
                // Formulaire envoyé
                if($this->Configuration->validates($this->request->data)){
                    foreach($this->request->data as $k=>$v){
                        $configuration = $this->Configuration->update(array(
                            'conditions' => array('value' => $v),
                            'primaryKey' => $k,
                            'where' => 'name',
                        ));
                    }
                    $this->Session->setFlash('Le contenu est modifié','alert-success');
                    $this->redirect('admin/configuration');
                }else{
                    $this->Session->setFlash('veuillez corriger les informations','alert-warning');
                }
            }else{
                // Formulaire non envoyé
                $this->request->data = $this->Configuration->find();
                /* Ici je ne sais pas comment changer les valeurs de mon formulaire */

            }
            // $this->set($d);
            $this->set('lenpassword',"12");
        }
    }
?>

Sur ma page configuration j'ai plusieurs formulaires que j'ai séparé par groupe (ex: utilisateur)

J'arrive bien à mettre à jour les données dans la base de données lors de la validation du formulaire.

Je précise que les formulaires sont composés de champs input, textbox, list (un peu de tout en fait).

D'avance merci je m'arrache les cheveux.

8 réponses


Msappdem
Auteur
Réponse acceptée

Bon je crois que j'ai compris mon problème : j'ai plusieurs formulaires sur la même page et mes fonctions ne sont pas faites pour faire la distinction du coup lors de la validation il indique des erreurs car des données sont manquantes (normal si elles appartiennent à un autre formulaire que celui validé).

Si j'ai bien compris il faut que je parvienne à indiquer à la vérification une data pour différencier les formulaires et ainsi pouvoir faire le distinguo.

je pars sur cette recherche.

Msappdem
Auteur

....

en fait j'utilisais pas les bonnes choses. A l'image de la classe input dans form.php j'ai créé un classe pour les liste déroulante.
Maintenant ça fonctionne mieux (en tout cas pour les liste déroulante). C'est très certainement à améliorer qu'en pensez vous ?

public function select($name,$label,$item = array()){
            $error = false;
            $classError = '';
            if(isset($this->errors$name])){
                $error = $this->errors$name];
                $classError = ' alert-error';
            }
            if(!isset($this->controller->request->data)){
                if(isset($item'default'])){
                    $value = $item'default'];
                }else{
                    $value = '';
                }
            }else{
                foreach($this->controller->request->data as $k=>$v){
                    if($this->controller->request->data$k]->name == $name){
                        $value = $this->controller->request->data$k]->value;
                    }
                }
            }
            $html = '<div class="clearfix'.$classError.'">';
            $html .= $label.'<br />';
            $html .= '<select id="select'.$name.'" name="'.$name.'">';
            asort($item);
            $item = array_unique($item);
            if($value != ''){
                if($value == 0){
                    $html .= '<option value="0" selected="selected">Désactivé</option>';
                }else{
                    $html .= '<option value="'.$value.'" selected="selected">'.$value.'</option>';
                }
            }
            foreach($item as $k=>$v){
                if(isset($item'default']) && $v != $item'default']){
                    if($v == 0){
                        $html .= '<option value="0">Désactivé</option>';
                    }else{
                        $html .= '<option value="'.$v.'">'.$v.'</option>';
                    }
                }
            }
            $html .= '</select>';
            if($error){
                $html .= '<span class="help-inline">'.$error.'</span>';
            }
            $html .= '</div>';
            return $html;
        }

appelée comme ceci :

<?php echo $this->Form->select('name','label',array('0'=>'0','1'=>'10','2'=>'20','3'=>'30','4'=>'120','default'=>'60')); ?>
Msappdem
Auteur

du coup j'ai également du adapter ma class input :

public function input($name,$label,$options = array()){
            $error = false;
            $classError = '';
            if(isset($this->errors$name])){
                $error = $this->errors$name];
                $classError = ' alert-error';
            }
            if(!isset($this->controller->request->data->$name)){
                if(!isset($this->controller->request->data)){
                    $value = '';
                }else{
                    foreach($this->controller->request->data as $k=>$v){
                        if($this->controller->request->data$k]->name == $name){
                            $value = $this->controller->request->data$k]->value;
                        }
                    }
                }
            }else{
            echo 'patate';
                $value = $this->controller->request->data->$name;
            }
            if($label == 'hidden'){
                return '<input type="hidden" name="'.$name.'" value="'.$value.'">';
            }
            $html = '<div class="clearfix'.$classError.'">';
            if($options'type'] != 'checkbox'){
                $html .= '<label for="input'.$name.'">'.$label.'</label>';
            }
            $attr = ' ';
            foreach($options as $k=>$v){
                if($k!='type' && $k!='ico'){
                    $attr .= " $k=\"$v\"";
                }
                if($k=='ico'){
                    $ico = $v;
                }
            }
            if(!isset($options'type'])){
                if(isset($ico)){
                    $html .= '<div class="input-prepend">';
                    $html .= '<span class="add-on" id="addon'.$name.'" data-placement="top"><i class="'.$ico.'"></i></span>';
                    $html .= '<input type="text" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
                    $html .= '</div>';
                }else{
                    $html .= '<input type="text" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
                }
            }elseif($options'type'] == 'text'){
                $html .= '<input type="text" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
            }elseif($options'type'] == 'email'){
                $html .= '<div class="input-prepend">';
                $html .= '<span class="add-on" id="addon'.$name.'" data-title="Veuillez saisir une adresse email valide" data-toggle="tooltip" data-placement="top">@</span>';
                $html .= '<input type="email" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
                $html .= '</div>';
            }elseif($options'type'] == 'textarea'){
                $html .= '<textarea id="input'.$name.'" name="'.$name.'"'.$attr.'>'.$value.'</textarea>';
            }elseif($options'type'] == 'checkbox'){
                $html .= '<input type="hidden" name="'.$name.'" value="0">';
                $html .= '<label class="checkbox">';
                $html .= '<input type="checkbox" name="'.$name.'" value="1" '.(empty($value)?'':'checked').'> '.$label;
                $html .= '</label>';
            }elseif($options'type'] == 'file'){
                $html .= '<input type="file" id="input'.$name.'" name="'.$name.'" '.$attr.'>';
            }elseif($options'type'] == 'password'){
                $html .= '<div class="input-prepend">';
                $html .= '<span class="add-on" id="addon'.$name.'" data-placement="top"><i class="icon-lock"></i></span>';
                $html .= '<input type="password" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
                $html .= '</div>';
            }
            if($error){
                $html .= '<span class="help-inline">'.$error.'</span>';
            }
            $html .= '</div>';
            return $html;
        }

Pouvez-vous me dire si je fais bien ?

Msappdem
Auteur

j'ai l'erreur : Fatal error: Cannot use object of type stdClass as array

sur cette partie :

foreach($this->controller->request->data as $k=>$v){
                    if($this->controller->request->data$k]->name == $name){
                        $value = $this->controller->request->data$k]->value;
                    }
                }

Alors effectivement je fais comme si c'était un tableau et pas un objet mais si je change pour ceci :

foreach($this->controller->request->data as $k=>$v){
                    if($this->controller->request->data->$k->name == $name){
                        $value = $this->controller->request->data->$k->value;
                    }
                }

J'ai le message : Notice: Trying to get property of non-object

Msappdem
Auteur

J'ai modifié ma fonction pour les select :

public function select($name,$label,$item,$default){
            $error = false;
            $classError = '';
            if(isset($this->errors$name])){
                $error = $this->errors$name];
                $classError = ' alert-error';
            }
            if(isset($this->controller->request->data)){
                if(is_array($this->controller->request->data)){
                    foreach($this->controller->request->data as $k=>$v){
                        if($this->controller->request->data$k]->name == $name){
                            $value = $this->controller->request->data$k]->value;
                        }
                    }
                }else{
                    $value = $this->controller->request->data;
                }
            }
            if(isset($item)){
                $item = explode(",", $item);
            }
            $html = '<div class="clearfix'.$classError.'">';
            $html .= $label.'<br />';
            $html .= '<select id="select'.$name.'" name="'.$name.'">';
            foreach($item as $k=>$v){
                $selected = '';
                if(isset($value) && $value != '' && $value >= 0){
                    if($v == $value){
                        $selected = ' selected="selected"';
                    }
                }else{
                    if(isset($default) && $v == $default){
                        $selected = ' selected="selected"';
                    }
                }
                if($v == 0){
                    $html .= '<option value="0"'.$selected.'>Désactivé</option>';
                }else{
                    $html .= '<option value="'.$v.'"'.$selected.'>'.$v.'</option>';
                }
            }
            $html .= '</select>';
            if($error){
                $html .= '<span class="help-inline">'.$error.'</span>';
            }
            $html .= '</div>';
            return $html;
        }

appelé comme ceci :

<?php echo $this->Form->select('name','text','0,5,7,8,12,20','8'); ?>

je trouve cela plus cohérent mais est-ce bien fait ?
et je n'ai plus d'erreur lors de la vérification ($this->Configuration->validates($this->request->data))

et ma fonction pour les input :

public function input($name,$label,$options = array()){
            $error = false;
            $classError = '';
            if(isset($this->errors$name])){
                $error = $this->errors$name];
                $classError = ' alert-error';
            }else{
                if(isset($this->errors)){
                    foreach($this->errors as $k=>$v){
                        if($k == $name){
                            $error = $k;
                            $classError = ' alert-error';
                        }
                    }
                }
            }
            if(!isset($this->controller->request->data->$name)){
                if(isset($this->controller->request->data)){
                    if(is_array($this->controller->request->data)){
                        foreach($this->controller->request->data as $k=>$v){
                            if($this->controller->request->data$k]->name == $name){
                                $value = $this->controller->request->data$k]->value;
                            }
                        }
                    }else{
                        $value = $this->controller->request->data;
                    }
                }
            }else{
                $value = $this->controller->request->data->$name;
            }
            if($label == 'hidden'){
                return '<input type="hidden" name="'.$name.'" value="'.$value.'">';
            }
            $html = '<div class="clearfix'.$classError.'">';
            if($options'type'] != 'checkbox'){
                $html .= '<label for="input'.$name.'">'.$label.'</label>';
            }
            $attr = ' ';
            foreach($options as $k=>$v){
                if($k!='type' && $k!='ico'){
                    $attr .= " $k=\"$v\"";
                }
                if($k=='ico'){
                    $ico = $v;
                }
            }
            if(!isset($options'type'])){
                if(isset($ico)){
                    $html .= '<div class="input-prepend">';
                    $html .= '<span class="add-on" id="addon'.$name.'" data-placement="top"><i class="'.$ico.'"></i></span>';
                    $html .= '<input type="text" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
                    $html .= '</div>';
                }else{
                    $html .= '<input type="text" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
                }
            }elseif($options'type'] == 'text'){
                $html .= '<input type="text" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
            }elseif($options'type'] == 'email'){
                $html .= '<div class="input-prepend">';
                $html .= '<span class="add-on" id="addon'.$name.'" data-title="Veuillez saisir une adresse email valide" data-toggle="tooltip" data-placement="top">@</span>';
                $html .= '<input type="email" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
                $html .= '</div>';
            }elseif($options'type'] == 'textarea'){
                $html .= '<textarea id="input'.$name.'" name="'.$name.'"'.$attr.'>'.$value.'</textarea>';
            }elseif($options'type'] == 'checkbox'){
                $html .= '<input type="hidden" name="'.$name.'" value="0">';
                $html .= '<label class="checkbox">';
                $html .= '<input type="checkbox" name="'.$name.'" value="1" '.(empty($value)?'':'checked="checked"').'> '.$label;
                $html .= '</label>';
            }elseif($options'type'] == 'file'){
                $html .= '<input type="file" id="input'.$name.'" name="'.$name.'" '.$attr.'>';
            }elseif($options'type'] == 'password'){
                $html .= '<div class="input-prepend">';
                $html .= '<span class="add-on" id="addon'.$name.'" data-placement="top"><i class="icon-lock"></i></span>';
                $html .= '<input type="password" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
                $html .= '</div>';
            }
            if($error){
                $html .= '<span class="help-inline">'.$error.'</span>';
            }
            $html .= '</div>';
            return $html;
        }
Msappdem
Auteur

je ne m'en sort pas.
je pensais avoir compris mais à priori pas du tout.

A partir des fonctions de mon précédent post, j'ai ajouté un deuxième formulaire sur ma page.
Lors de l'affichage au chargement de la page toutes les valeurs sont bien récupérées.
Lors de la validation du premier formulaire (le plus haut) tout ce passe correctement.
En revanche quand je valide le deuxième formulaire c'est pas la même chose.

L'erreur est la suivante : Catchable fatal error: Object of class stdClass could not be converted to string

qui correspond à ceci :

Fonction input :

$html .= '<input type="text" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';

en fait c'est $value qui pose problème :

if(!isset($this->controller->request->data->$name)){
                if(isset($this->controller->request->data)){
                    if(is_array($this->controller->request->data)){
                        foreach($this->controller->request->data as $k=>$v){
                            if($this->controller->request->data$k]->name == $name){
                                $value = $this->controller->request->data$k]->value;
                            }
                        }
                    }else{
                        $value = $this->controller->request->data;
                    }
                }
            }else{
                $value = $this->controller->request->data->$name;
            }

Précisions, dans le premier formulaire j'ai une checkbox, un input et plusieurs select.
Dans le deuxième formulaire j'ai deux checkbox.

Ce phénomène ne se produit pas si je met en commentaire le contenu de la fonction de vérification :

public $validate = array(
            // 'strongpassword' => array(
                // 'rule' => '([0-1]{1})',
                // 'message' => 'ne peux être que 0 ou 1'
            // ),
            // 'regexppassword' => array(
                // 'rule' => '([a-z0-9\-]+)',
                // 'message' => 'pas encore défini'
            // ),
            'lenpassword' => array(
                'rule' => '([0-9]{1,2})',
                'message' => 'vérifiez votre choix'
            ),
            'expirationpassword' => array(
                'rule' => '([0-9]{1,2})',
                'message' => 'vérifiez votre choix'
            ),
            'blockattemptuser' => array(
                'rule' => '([0-9]{1,2})',
                'message' => 'vérifiez votre choix'
            ),
            'blocktimeuserd' => array(
                'rule' => '([0-9]{1,2})',
                'message' => 'vérifiez votre choix'
            ),
            'timeouttimesession' => array(
                'rule' => '([0-9]{1,2})',
                'message' => 'vérifiez votre choix'
            ),
            // 'newsletteruser' => array(
                // 'rule' => '([0-1]{1})',
                // 'message' => 'ne peux être que 0 ou 1'
            // ),
            // 'newsuser' => array(
                // 'rule' => '([0-1]{1})',
                // 'message' => 'ne peux être que 0 ou 1'
            // )            
        );

je dois vraiment mal m'y prendre !

quelqu'un pour m'aider ?

Msappdem
Auteur

Pour compléter, en fait les modifications sont bien enregistrées si il n'y a pas de vérification et si il y'a la redirection après l'enregistrement.

Dans tous les cas si je commente la redirection j'ai dans tous les cas une erreur.

Fonction udpate :

function admin_index(){
            $this->loadModel('Configuration');
            if($this->request->data){
                // Formulaire envoyé
                if($this->Configuration->validates($this->request->data)){
                    foreach($this->request->data as $k=>$v){
                        $this->Configuration->update(array(
                            'conditions' => array('value' => $v),
                            'primaryKey' => $k,
                            'where' => 'name',
                        ));
                    }
                    // $this->Session->setFlash('Le contenu est modifié','alert-success');
                    // $this->redirect('admin/configuration');
                }else{
                    $this->Session->setFlash('veuillez corriger les informations','alert-warning');
                }
            }else{
                // Formulaire non envoyé
                $this->request->data = $this->Configuration->find();
            }
        }

Comment m'y prendre ?

Msappdem
Auteur

Houla y'a foule !

Je peux donner quoi comme code pour avoir une piste ?