8768 sujets

Développement web côté serveur, CMS

Bonjour,

dans un projet, je réalise plusieurs formulaire avec la même structure.
J'ai effectué plusieurs fonction pour eviter de recopier plusieurs foi le même code seulement je plante sur le select

<?php if($oc->societe_etude_id != null){?>
    <div class="form-group">
        <label for="societe_etude" class="col-sm-5 control-label">Sous-traitants :</label>
        <div class="col-sm-7 text-right">
          <select name="societe_etude" id="societe" class="form-control" size="1" />
              <option value="">Veuillez indiquer le sous-traitant...</option>
              <?php foreach($societe as $se):?>
                  <?php if($se->etude === 'oui'):?>
                      <option <?php if($se->id === $oc->societe_etude_id) echo 'selected';?> value="<?= $se->id; ?>"> <?= $se->societe; ?></option>
                  <?php endif;?>
              <?php endforeach;?>
          </select>
        </div>
      </div><!-- SOUS-TRAITANT -->
<?php }else{?>
  <div class="form-group">
    <label for="societe_etude" class="col-sm-5 control-label">Sous-traitants :</label>
    <div class="col-sm-7 text-right">
      <select name="societe_etude" id="societe" class="form-control" size="1" />
        <option value="" <?php if($s->id != $oc->societe_nego_id) echo 'selected';?>>Veuillez indiquer le sous-traitant...</option>
        <?php foreach($societe as $s):?>
          <?php if($s->etude === 'oui'):?>
            <option <?php if($s->id === $oc->societe_nego_id) echo 'selected';?> value="<?= $s->id; ?>"> <?= $s->societe; ?></option>
          <?php endif;?>
        <?php endforeach;?>
      </select>
    </div>
  </div><!-- SOUS-TRAITANT -->
<?php }?>

mes select ont toujours cette forme et je plante surtout sur la partie foreach
ok désolé en fait j'ai fait une fonction select générale qui fonctionne dans tous mes projets. Je n'arrive pas à adapter cette fonction avec le code que j'ai mit plus haut.
Ma fonction standard :
public function select($name, $label, $option, $require = false)
    {
        if($require === true){
            $required = 'required';
        }else {
            $required = '';
        }
        $label = '<label>'.$label.'</label>';
        $input = '<select name="'.$name.'" class="form-control" '.$required.'>';
        foreach($option as $k => $v){
            $attribute = '';
            if($k == $this->getValue($name)){
                $attribute = ' selected';
            }
            $input .= "<option value='$k'$attribute>$v</option>";
        }
        $input .= '</select>';
        return $this->surround($label.$input);
    }

là où j'ai un problème, je rajoute une condition dans le foreach et je ne sais pas comment récupérer la variable vue qu'elle vient de mon foreach :
<?php if($se->etude === 'oui'):?>
Je suis comme Jencal, en plein flou artistique.

S'agit-il d'une faute de recopie à la ligne
 <?php if($se->etude === 'oui'):?>
le point virgule s'est muté en double point. Même chose plus bas dans la boucle qui traite $societe.
Ok,

le surround t'es pas obliger :
return $this->surround($label.$input);

devient
return $label . $input;


ensuite, tu as ton
foreach($societe as $se)

et tu me dis que t'a un problème ici:
<?php if($se->etude === 'oui'):?>

Je ne sais pas quoi te dire, parce que $societe je ne le connait pas. mais ton if ne me semble pas incorrect.
Greg_Lumiere a écrit :
Je suis comme Jencal, en plein flou artistique.

S'agit-il d'une faute de recopie à la ligne
 &lt;?php if($se-&gt;etude === 'oui'):?&gt;
le point virgule s'est muté en double point. Même chose plus bas dans la boucle qui traite $societe.


Oué Greg_lumiere, le double point c'est parce que c'est un mélange HTML / PHP... il va avec le
 <?php endforeach;?>

Modifié par JENCAL (26 Feb 2016 - 11:14)
en fait ce n'est pas une faute de frappe !

le code si dessus fonctionne parfaitement ! ce que je veux avant tout, c'est d'éviter de recopier ce code car je peux en avoir 2 ou 3 sur une dizaine de pages.

en temps normale, sur un simple select, je fais
<?= $form->select($name, $label, [$id => $text]);?>


ce qui est plus simple et beaucoup plus lisible que le pavé du dessus
Ok, alors j'ai toujours pas compris ton problème..... tu cherche à faire quoi exactement?
parce que là tu nous dis "tout marche mais je veux pas recopier ce code 20 fois", quel code ? la fonction select() ? les foreach ? précise merci.
Merci, je ne connaissais pas cette syntaxe.

Le coup du "<?= $variable;?>" n'est pas mal non plus. Il n'est même pas midi et je suis déjà moins bête qu'hier. Super ! Smiley lol
Greg_Lumiere a écrit :
Merci, je ne connaissais pas cette syntaxe.

Le coup du "<?= $variable;?>" n'est pas mal non plus. Il n'est même pas midi et je suis déjà moins bête qu'hier. Super ! Smiley lol


Du coup le <?= je connais pas .... lol
Oui, ça remplace le 'echo'

Bon pour avancer, j'ai fais la fonction que je souhaites réaliser

public function libSelect($name, $label, $data, $var)
    {
        
        if($var != null || $var != ''){
            $select = '
                <div class="form-group">
                <label for="'.$name.'" class="col-sm-5 control-label">'.$label.'</label>
                <div class="col-sm-7 text-right">
                    <select name="'.$name.'" id="'.$name.'" class="form-control" size="1" />
                        <option value="">Choisir dans cette liste</option>
            ';
            foreach($data as $k => $v){
                if( $k->//je recupère une colonne issue du $data === 'oui'){
                    $select .= '
                        <option value="'.$k.'"
                    ';
                }
            //autre prob
                if( $k->//je recupère une colonne issue du $data === $var){
                    $select .= ' selected';
                }
                $select .= '>'.$v.'</option>';
            }
            $select .= '</select>';
        }
        return $select;
    }


Le prob c'est pour récupérer dynamiquement les variables de mes conditions
si je fais :
if( $k->nom_de_ma_colonne === 'oui'){

ça ne fonctionne pas me retourne une erreur non objet

Pk je m'emmerde à faire ça !
ben dans mes pages où je veux mettre un select
j'ai plus qu'a faire un

//$data issue d'une fonction extract où je récupère l'id et le nom ce qui me donne un tableau ['id'=>'nom'] 
<?= $form->libSelect('name, 'liste', $data, $donnée_de_la_table);?>

Modifié par cid5420 (26 Feb 2016 - 11:42)
fait un var_dump() de $k, sonde ta variable, voir même, sonde $societe avant ton foreach pour être sur des valeurs,

essaye $k['tacolonne'] === 'oui'
Modérateur
Bonjour,
Greg_Lumiere a écrit :
Le coup du "<?= $variable;?>" n'est pas mal non plus. Il n'est même pas midi et je suis déjà moins bête qu'hier. Super ! Smiley lol
La syntaxe "<?=" ne marche pas partout (ça peut dépendre de la configuration du serveur). J'en déconseille l'usage.

Amicalement,
hmmm enfin je viens de reflechir,

vue que $data vient de ma fonction extract, elle contient un id et un nom mais pas la colonne en question !

je suis perdu, je ne sais pas comment faire !!
cid5420 a écrit :
hmmm enfin je viens de reflechir,

vue que $data vient de ma fonction extract, elle contient un id et un nom mais pas la colonne en question !

je suis perdu, je ne sais pas comment faire !!


peux pas t'aider désolé... a chaque nouveau message de ta part, j'en apprend d'avantage, maintenant ya une $data... que je n'avais jamais vu... je comprend pas ton code j'ai pas tout les éléments.
Si j'ai bien suivis,

$data est un tableau clé/valeur qui provient d'un traitement de données de la table.

Mais c'est quoi la colonne que tu souhaite récupérer ? A tous les coups elle ne fait pas partie de $data mais d'un niveau supérieur dans la bdd.

c'est flou pour moi, désolé
Bon je viens de résoudre le problème, j'ai un peut simplifié mon code de départ mais le résultat est le même voici ma fonction libSelect si il y a des personnes intéressé :

public function libSelect($name, $label, $data, $var, $type, $value)
    {
        $select = '
            <div class="form-group">
                <label for="'.$name.'" class="col-sm-5 control-label">'.$label.'</label>
            <div class="col-sm-7 text-right">
                <select name="'.$name.'" id="'.$name.'" class="form-control" size="1" />
                    <option value="">Choisir dans cette liste</option>
        ';
        foreach($data as $k){
            if( $k->$type === 'oui'){
                $select .= '
                    <option value="'.$k->id.'"
                ';
            }
            if($k->id === $var){
                $select .= ' selected';
            }
            $select .= '>'.$k->$value.'</option>';
        }
        $select .= '</select></div></div>';
        return $select;
    }


du coup $data contient tous les resultats de ma table
Modifié par cid5420 (26 Feb 2016 - 12:33)