Page 1 sur 1

Lier 3 listes déroulantes

Posté : 16 juin 2014, 16:44
par Jordan31
Bonjour à tous,

J'aimerais lier 3 listes déroulantes, en faite il faudrait qu'en fonction du choix de la première liste et de la seconde, la 3ième m'affiche des choix en rapport avec ces 2 derniers...

Voici mon code :
<?php echo "Communes :"; ?>      
        <select name="communes">
        <option value="0"> ----- Choisir ----- </option>
        <option value="1"> Esparros </option>
        <option value="2"> Capvern </option>
        <option value="3"> Heches </option>
        <option value="4"> Tibiran-Jaunac </option>
        </select>

        <?php echo "</br>Hébergement :"; ?>
        <select name="hebergement">
        <option value="0"> ----- Choisir ----- </option>
        <option value="1"> Hôtels </option>
        <option value="2"> Campings </option>
        </select>
        
        

        <!-- un bouton pour valider -->
        <input type="submit" value="Valider" name="OK">
       
    <?php 
        
    include'page-description-h-c.php';
        
        $description = array(
                                                        1 => array(1 => $descriptionhotelesparros, 2 => $descriptioncampingesparros),
                                                        2 => array(1 => $descriptionhotelcapvern, 2 => $descriptioncampingcapvern),
                                                        3 => array(1 => $descriptionhotelheches, 2 => $descriptioncampingheches),
                                                        4 => array(1 => $descriptionhoteltibiran, 2 => $descriptioncampingtibiran)
                                                );
        if(($_POST['communes']==0) and ($_POST['hebergement'])==0)
            {                                        
                echo " ";
            }
        else
            {
                echo $description[$_POST['communes']][$_POST['hebergement']];
            }
        echo "</div>";
Pour le moment j'en est 2 mais je sais pas comment faire la troisième.. Il faudrait qu'elle m'affiche des choix en fonction de ce que j'ai choisi aux 2 premières.

Je sais pas si j'ai était clair..

Merci pour vos idées! :)

Re: Lier 3 listes déroulantes

Posté : 16 juin 2014, 17:21
par sirakawa
Vaguement:
liste principale select normal
liste 1 liée à choix 1 de liste principale HIDDEN
etc etc
Quand tu sélectionnes un item dans la liste principale, tu déclenches javascript qui dévoile la liste liée correspondante
exemple là:
http://www.w3schools.com/js/tryit.asp?f ... s_dropdown

Re: Lier 3 listes déroulantes

Posté : 16 juin 2014, 17:28
par Jordan31
Je comprends pas c'que tu veux faire... Désolé je débute un peu donc pas facile..

Re: Lier 3 listes déroulantes

Posté : 16 juin 2014, 17:30
par telnes
hello

ton message est limpide mais il y a foison de tuto sur le sujet (google/ et même via la fonction recherche du forum ici !)

n'hésite pas à poster du code PHP

Re: Lier 3 listes déroulantes

Posté : 16 juin 2014, 17:39
par Elie
Oui pour moi, je ferais ca en AJAX ...
Faut donc maitriser un peu plus PHP et donc JavaScript (Idealement te pencher sur jQuery)...

Moi je fais comme ca :
<select name="select_1" id="select_1">
 <option value="">La liste des options</option>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</select>
<select name="select_2" id="select_2">
 <option value="">Selectionnez une option dans la liste 1</option>
</select>
[javascript]// JavaScript Document

$(document).ready(function(){

$( "#select_1" ).change(function() {
$.ajax({
type: 'GET',
url: 'ta_page_avec_les_nouvelles_options.php',
data: $(this).val(), // Je suis pas sur de ca mais apprend le javascript !
processData: true,
async: false,
error:function(msg){
alert( 'Error !);
},
success:function(data){
$('#select_2').html(data);
}
});
});

});[/javascript]

Re: Lier 3 listes déroulantes

Posté : 16 juin 2014, 17:54
par Jordan31
Je vais essayer de me débrouiller avec ça, merci beaucoup !

Re: Lier 3 listes déroulantes

Posté : 16 juin 2014, 18:11
par sirakawa
On peut faire assez simple:
<?PHP
/*Il faut forcer à 0 les choix de commune et d'hebergement pour le premier passage : aucun affichage;
Les autres fois, ils prennent la valeur choisie avant de valider*/
$commune = isset($_POST['commune']) ?  $_POST['commune'] : 0;
$hebergement = isset($_POST['hebergement']) ?  $_POST['hebergement'] : 0;

/* tableau à deux dimensions:
lignes: communes
colonnes: dscriptions 
*/
$descriptions =
array(
	1 => array(1 =>  "Hôtel Esparros", 2=>  "Camping Esparros", 3 => "Gîte Esparros"), 
	2 => array(1 => "Hôtel Capvern", 2 => "Camping Capvern", 3 =>"Gîte Capvern"),
	3 => array( 1 => "Hôtel Heches", 2 => "Camping Heches", 3 => "Gîte Heches"),
	4 => array(1 => "Hôtel Tibiran", 2 => "Camping Tibiran", 3 => "Gîte Tibiran"),
) ;

/* tableaux servant à montrer ce qui a été choisi*/
$commune_selected = array_fill(0,5, "");
$commune_selected [$commune] = "selected ='selected'";

$heberg_selected = array_fill(0,3, "");
$heberg_selected [$hebergement] = "selected ='selected'";

print"
/*pour que ton truc fonctionne, il faut créer un formulaire; un formulaire sans action recharge la même page en envoyant les choix faits*/
<form method = 'post'>
<Label for 'communes'>Communes   </label>     
 <select name='commune'>
      <option value='1'  $commune_selected[1]> Esparros </option>
         <option value='2' $commune_selected[2]> Capvern </option>
         <option value='3'  $commune_selected[3]> Heches </option>
         <option value='4'  $commune_selected[4]> Tibiran-Jaunac </option>
         </select>

      <Label for 'hebergement'>Hébergement   </label>    
         <select name='hebergement'>
         <option value='1' $heberg_selected[1]> Hôtels </option>
         <option value='2'  $heberg_selected[2]> Campings </option>
         </select>
               <!-- un bouton pour valider -->
         <input type='submit' value='Valider' name='OK'>
  </form>";   

/*Si un choix a été fait*/  
  if (($commune != 0) and ($hebergement != 0))
{
	$descro = $descriptions[$commune][$hebergement];
	print "$descro";
}
?>

Re: Lier 3 listes déroulantes

Posté : 17 juin 2014, 09:24
par Jordan31
Désolé mais ton code ne marche pas, ça m'affiche une erreur dans le navigateur : " unexpected end of file " alors que j'ai tout vérifié..

Re: Lier 3 listes déroulantes

Posté : 17 juin 2014, 10:02
par Jordan31
Si quelqu'un peut me trouver l'erreur.. moi je la voie pas.

Voici mon code :
<!doctype html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Mon widget</title>
    
</head>
<body>

<?php
/*
Plugin Name: Mon widget
Plugin URI: localhost/adaclive
Description: Widget test
Version: 1.0
Author: Jordan
Author URI: localhost/adaclive
License: GPL2+
*/

class MonWidget extends WP_Widget 
{
 
    function MonWidget()
    {
        // Constructeur
        parent::WP_Widget(false, $name = 'MonWidget', array("description" => 'Afficher texte'));
    }
 
    function widget($args, $instance)
    {        
        echo $args['before_title'];
        echo "<div style='color: red; font-weight: 700; text-align: center; font-family: verdana; text-shadow: 1px 1px 1px black; '>";
        echo apply_filters('widget_title', $instance['title']);
        echo "</div>";
        echo $args['after_title'];
    
        
    
        echo "<div style='border: 2px solid black; border-radius: 15px; padding: 5px; width: 300px; '>"; 
   
        $commune = isset($_POST['commune']) ?  $_POST['commune'] : 0;
        $hebergement = isset($_POST['hebergement']) ?  $_POST['hebergement'] : 0;

        /* tableau à deux dimensions:
        lignes: communes
        colonnes: dscriptions 
        */
        $descriptions =
                array(
                        1 => array(1 =>  "Hôtel Esparros", 2=>  "Camping Esparros", 3 => "Gîte Esparros"), 
                        2 => array(1 => "Hôtel Capvern", 2 => "Camping Capvern", 3 =>"Gîte Capvern"),
                        3 => array(1 => "Hôtel Heches", 2 => "Camping Heches", 3 => "Gîte Heches"),
                        4 => array(1 => "Hôtel Tibiran", 2 => "Camping Tibiran", 3 => "Gîte Tibiran"),
                    ) ;

        /* tableaux servant à montrer ce qui a été choisi*/
        $commune_selected = array_fill(0,5, "");
        $commune_selected [$commune] = "selected ='selected'";

        $heberg_selected = array_fill(0,3, "");
        $heberg_selected [$hebergement] = "selected ='selected'";

        /*pour que ton truc fonctionne, il faut créer un formulaire; un formulaire sans action recharge la même page en envoyant les choix               faits*/

        print"

            <form method = 'post'>
            <Label for 'communes'>Communes   </label>     
             <select name='commune'>
                  <option value='1'  $commune_selected[1]> Esparros </option>
                  <option value='2' $commune_selected[2]> Capvern </option>
                  <option value='3'  $commune_selected[3]> Heches </option>
                  <option value='4'  $commune_selected[4]> Tibiran-Jaunac </option>
             </select>

           <Label for 'hebergement'>Hébergement   </label>    
            <select name='hebergement'>
                 <option value='1' $heberg_selected[1]> Hôtels </option>
                 <option value='2'  $heberg_selected[2]> Campings </option>
            </select>
                   <!-- un bouton pour valider -->
                 <input type='submit' value='Valider' name='OK'>
           </form>";   

        /*Si un choix a été fait*/  
        if (($commune != 0) and ($hebergement != 0))
        {
                $descro = $descriptions[$commune][$hebergement];
                print "$descro";
        }

        
        
        
    }
    
    
    
    function update($new_instance, $old_instance)
    {
        $instance = array();
        $instance['title'] = strip_tags( $new_instance['title'] );
        $instance['description'] = strip_tags( $new_instance['description'] );
 
        return $instance;
    }
 
    function form($instance)
    {
        if ( isset( $instance['title'] ) ) {
            $title = $instance['title'];
        }
        else {
            $title = "mon titre";
        }
 
            $description = $instance['description'];
    ?>
        <p>
        <label for="<?php echo $this->get_field_id('title'); ?>">
                   Titre :
                </label>
        <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>"
                name="<?php echo $this->get_field_name('title'); ?>" type="text"
                value="<?php echo esc_attr($title); ?>" />
 
        <label for="<?php echo $this->get_field_id( 'description' ); ?>">
                   Description :
                </label>
        <input class="widefat" id="<?php echo $this->get_field_id('description'); ?>"
                name="<?php echo $this->get_field_name('description'); ?>" type="text"
                value="<?php echo esc_attr($description); ?>" />
        </p>
        
             
    }
  
} 
 
<?php

add_action('widgets_init', create_function('', 'return register_widget("MonWidget");'));

?>

</body>
</html>

Re: Lier 3 listes déroulantes

Posté : 17 juin 2014, 11:29
par Elie
1° Le <?php ligne 137.
2° Dans ta function form($instance), met tout en PHP ...
    function form($instance)
    {
        
 
            $description = $instance['description'];

        echo '<p>
        <label for="'.$this->get_field_id('title').'">
                   Titre :
                </label>
        <input class="widefat" id="'.$this->get_field_id('title').'"
                name="'.$this->get_field_name('title').'" type="text"
                value="'.esc_attr($title).'" />
 
        <label for="'.$this->get_field_id( 'description' ).'">
                   Description :
                </label>
        <input class="widefat" id="'.$this->get_field_id('description').'"
                name="'.$this->get_field_name('description').'" type="text"
                value="'.esc_attr($description).'" />
        </p>';
       
       

Re: Lier 3 listes déroulantes

Posté : 17 juin 2014, 13:46
par Jordan31
Merci beaucoup ça marche :)

Re: Lier 3 listes déroulantes

Posté : 17 juin 2014, 16:57
par sirakawa
Le minimum serait de marquer le sujet RESOLU