2016-12-06 83 views
0

我正在使用ZF2,并在一个表单中,我有两个选择:一个用于specialite(id = select_spe)和promotion(id = select_promo)。填充选择JQuery和PHP Zend ZF 2

我想根据第一个选择的值填充第二个选择(从数据库)。

这里是在数据库中的表(MySQL的):

CREATE TABLE `DB_EMARGEMENT`.`SPECIALITE`(
    `id_specialite` INT UNSIGNED AUTO_INCREMENT, 
    `nom_specialite` VARCHAR(30) NOT NULL, 
    PRIMARY KEY(`id_specialite`) 
) ENGINE = InnoDB; 
CREATE INDEX `ix_id_specialite` ON SPECIALITE (`id_specialite`); 
CREATE TABLE `DB_EMARGEMENT`.`PROMOTION`(
    `id_promotion` INT UNSIGNED AUTO_INCREMENT, 
    `nom_promotion` VARCHAR(30) NOT NULL, 
    `id_specialite`INT UNSIGNED NOT NULL, 
    `annee_diplome` YEAR NOT NULL, 
    PRIMARY KEY(`id_promotion`), 
    CONSTRAINT `fk_id_specialite_id_specialite` FOREIGN KEY(`id_specialite`) REFERENCES SPECIALITE(`id_specialite`) 
) ENGINE = InnoDB; 

EmargementForm.php:

 $this->add(array(
     'name' => 'nom_specialite', 
     'type' => 'Select', 

     'options' => array(
      'label' => 'Spécialité', 
      'label_attributes' => array(
       'class' => 'col-sm-4 control-label' 
      ), 
      // 'empty_option' => '-- Choisissez une spécialité --', 
      'value_options' => $this->getSpecialiteOptions(), 

     ), 
     'attributes' => array(
        'value' => '6', //set selected to '1' 
        'id' => 'select_spe', 
      ) 
    )); 
    $this->add(array(
     'name' => 'nom_promotion', 
     'type' => 'Select', 
     'attributes' => array(
      'class' => 'form-control', 
     ), 
     'options' => array(
      'label' => 'Promotion', 
      'label_attributes' => array(
       'class' => 'col-sm-4 control-label' 
      ), 
      'empty_option' => '-- Choisissez une promotion --', 
     ), 
     'attributes' => array(
        'id' => 'select_promo', 
      ) 
    )); 

不要担心getSpecialiteOptions(),IL填充选择用数据形式数据库(这很好)。

在我search.phtml,我的JavaScript:

<script type="text/javascript"> 

    $(document).ready(function() { 
    var $promo = $('#select_promo'); 
    var $departements = $('#departements'); 
     $("#select_spe").change(function() { 
      var id_specialite = $(this).val(); 
      console.log(id_specialite); 
      $.ajax({ 
       url: 'getPromotions.php', 
       data: 'id_specialite='+ id_specialite, // on envoie $_GET['id_region'] 
       dataType: 'json', // on veut un retour JSON 
       success: function(json) { 
        $.each(json, function(index, value) { // pour chaque noeud JSON 
         // on ajoute l option dans la liste 
         //$("#select_promo").append('<option value="'+ index +'">'+ value +'</option>'); 
         $promo.append('<option value="'+ 3 +'">'+ A +'</option>'); 
         console.log(index, value); 
        }); 
       } 
      }); 
     }); 
    }); 

</script> 


<p> 
    <a href="<?php echo $this->url('emargement', array('action'=>'index'));?>">Retour</a> 
</p> 
<?php 
echo $this->formHidden($form->get('num_carte')); 
?> 
<div class="form-group <?php if($this->formElementErrors($form->get('nom_specialite'))) : ?>has-error<?php endif; ?>"> 
    <?php echo $this->formLabel($form->get('nom_specialite')) ?> 
    <div class="col-sm-4 col"> 
     <?php echo $this->formSelect($form->get('nom_specialite')) ?> 
     <?php if($this->formElementErrors($form->get('nom_specialite'))) : ?> 
      <div class="alert alert-danger"> 
       <?php echo $this->formElementErrors($form->get('nom_specialite'));?> 
      </div> 
     <?php endif; ?> 
    </div> 
</div> 
<div class="form-group <?php if($this->formElementErrors($form->get('nom_promotion'))) : ?>has-error<?php endif; ?>"> 
    <?php echo $this->formLabel($form->get('nom_promotion')) ?> 
    <div class="col-sm-4 col"> 
     <?php echo $this->formSelect($form->get('nom_promotion')) ?> 
      <?php if($this->formElementErrors($form->get('nom_promotion'))) : ?> 
      <div class="alert alert-danger"> 
       <?php echo $this->formElementErrors($form->get('nom_promotion'));?> 
      </div> 
     <?php endif; ?> 
    </div> 
</div> 
... 

此脚本调用getPromotions.php(这个脚本运作良好,我测试):

<?php 

if(isset($_GET['go']) || isset($_GET['id_specialite'])) { 


    if(isset($_GET['go'])) { 

    } else if(isset($_GET['id_specialite'])) { 
     $selectstatus = htmlentities(intval($_GET['id_specialite'])); 
} 
} 

$selectstatus = 6; 

// Connexion à la base de données 
try 
{ 
    $bdd = new PDO('mysql:host=localhost;dbname=DB_EMARGEMENT', 'root', 'france47'); 
} 
catch(Exception $e) 
{ 
    die('Erreur : '.$e->getMessage()); 
} 


$requete = 'SELECT id_promotion, nom_promotion FROM PROMOTION WHERE id_specialite='. $selectstatus; 


$selectData = array(); 

$resultat = $bdd->query($requete) or die(print_r($bdd->errorInfo())); 

    while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) { 
     $selectData[$donnees['id_promotion']][] = utf8_encode($donnees['nom_promotion']); 
    } 

    //-------------------------------------------------------------------------- 
    // 3) echo result as json 
    //-------------------------------------------------------------------------- 
    echo json_encode($selectData); 

return $selectData; 

的问题是我可以得到第一个select(specialite)的选定值(我用firebug看到),但是PHP脚本似乎没有被调用。我说因为“console.log(index,value); “不显示任何东西。 你有一个想法如何解决这个问题,并根据第一个选定的值得到第二个选定的填充?

感谢您的帮助。

+0

我有另一个想法:也许我应该把代码里面的getPromotions.php内的控制器中的函数?请告诉我如果我错了 – Willheisen

回答

0

如果我是你,我会做不同的事情。

  1. 我会创建一个将处理数据库交互的映射器。具体来说,映射器将获取您的Select元素的信息。

  2. 我会通过依赖注入将此映射器注入控制器,以便能够从控制器的操作访问映射器。

  3. 有一个专门的控制器的动作,将从映射器的Select元素的数据库获取所需的信息。

  4. 如果您希望在窗体的创建时(在网页上登录时)或用户实际上在网页上做某件事时将表单的Select中的信息获取到信息中,并根据这一点你想从数据库中检索不同的信息。我会认为这是后一种情况。在你的JS脚本中,你通过Jquery Ajax $.post()函数发送数据。根据您从上面描述的控制器的操作获得的响应,您可以根据它的id填充所需的html select元素。

您的方法并不差,只是当您的系统变大时,维护它变得非常困难。原因是你使用了所谓的交易脚本,这导致了各地的样板。所以如果你的系统变大了,我强烈建议重新设计。