CakePHP - Valeur par défaut d'une liste déroulante

Petit nouveau ! | 1 Messages

09 oct. 2014, 16:15

Bonjour,

Je suis actuellement en train de modifier les fonctions admin d'un site internet.

J'ai une fonction add (Me permettant d'ajouter une référence (exemple : construction d'une villa).
Les champs dont j'ai besoin pour l'écriture sur la database sont les suivants :
-Nom
-Description
-Catégorie (Qui est sur une autre table de la DB avec une fk.) sous forme de liste déroulante.

J'ai réussi sans autre à créer les deux premiers champs, j'ai aussi réussi à créer le 3ème avec un appel sur l'autre table pour récupérer que les noms des catégories, non pas l'id ou la description.

Mais j'ai cependant deux problèmes : J'aimerais mettre une valeur par défaut dans la liste déroulante (Par exemple : "Veuillez sélectionner une catégorie").
Le second problème est le fait que lorsque je 'envoie le formulaire, cela se crée bien en effet, mais category_id m'affiche toujours 0, malgré que je choississe une autre.

Voici mon code :
ReferencesController.php
 function admin_add() {
    $this->layout = "admin";
 
      $d['categories'] = $this->Reference->Category->find('list');
      $this->set($d);
    //Vérification si les données sur formulaire ont bien été postées
    if ($this->request->is('post')){
      //Ici, on vérifie si les données peuvent être validées et sauvegardées
      $this->Reference->create();
      if ($this->Reference->save($this->request->data)) {
          //Message flash en session puis on redirige
          $this->Session->setFlash(__('La référence a été ajouté.'));
        }
      } else {
      //si il n'y a pas de données.
      $this->Session->setFlash('Impossible de créer la référence.');
    }
    }
admin_add.ctp
    <h1><?php echo $this->Html->image('admin/icons/posts.png', array('alt' => "Ajouter des références", 'title' => "Ajouter des références")); ?> Ajouter des références</h1>
    <div class="bloc">
        <div class="content">
            <?php echo $this->Session->flash(); ?>
            <?php echo $this->Form->create('Reference'); ?>
            <?php
                echo $this->Form->input('name', array('label' => 'Nom'));
                echo $this->Form->input('description', array('label' => 'Contenu'));
                echo '<label>Catégories</label>';
                echo $this->Form->select('category',$categories, array('label' => 'Catégories'));
     
            ?>
            <?php echo $this->Form->end('Envoyer'); ?>
        </div>
     </div>
Reference.php
    <?php
    class Reference extends AppModel{
        public $belongsTo = "Category";
    }
     
    ?>
Category.php
    <?php
    class Category extends AppModel{
      public $hasOne = 'Reference';
       
    }
     
    ?>
J'espère avoir tout clarifié, la situation n'étant pas très simple pour moi même non plus, et vous remercie par avance de votre aide.

Eléphanteau du PHP | 19 Messages

27 oct. 2014, 04:45

Bonjour,

Je vous donne un exemplaire de liste déroulante (select) en php avec une valeur par défaut.
Je pense qu'en CakePHP çà devrait ressembler à ceci;
<?php
...
echo "<tr><td> region   </td><td><select id='region' 	name='region'> 			\n";
echo "				<option value='Defaut'>	Choisir 		</option>	\n";
echo "				<option value='Lorraine'>	Lorraine		</option>	\n";
echo "				<option value='Savoie'>	Savoie 		</option>	\n";
echo "				<option value='Moselle'>	Moselle		</option>	\n";
echo "				</select></td></tr>                                      	         \n";
...
?>

Dans le cas des liste déroulante remplie à la main, il faut faire attention à bien mettre les bonnes valeurs à la fois pour celle affichée et celle que l'on envoie quand on la sélectionne .

Liste déroulante obtenue avec une requête sql.
<?php
....
	echo "<tr><td>Regions</td>";
	echo "<td>";
	
	//recuperation de la liste des rédions
	$query      = "SELECT id_region, nom_region         ";
	$query     .= "FROM   regions                       ";
	$query     .= ";									";
	//echo "<br>query = $query <br>";
	$result = execute_query($query);
	
	//creation select avec liste des regions
	echo "<select id='id_region' name='id_region'>";
	while($row = mysql_fetch_array($result)) {
		$id_region  = $row[0];
		$nom_region = $row[1];
		echo "	<option value='" . $id_region . "'>" . $nom_region . "</option>";
	}//end while
	echo "</select>";
	echo "</td>";
	echo "</tr>";
...
?>
Si vous voulez avoir "Choisir une valeur" par défaut, vous pouvez mettre dans la table regions à l'id 1 "Choisir une valeur".
Je ne sais pas comment faire autrement.


J'espère que çà va vous aider.

A+

Eléphant du PHP | 343 Messages

11 mars 2015, 21:20

Pour info (même si j'arrive trop tard), il faut utiliser la clé "empty" ;)
<?php 

$this->Form->input('category', array(
                                      'options' => array("machin","truc"),
                                      'empty' => 'Veuillez sélectionner une catégorie',                                  
                                  )
					);
?>
Développeur web