填充select JQuery和PHP Zend ZF 2

时间:2016-12-06 14:51:01

标签: php jquery select zend-framework

我使用的是ZF2,在表格中,我有两个选择:一个用于专门(id = select_spe)和促销(id = select_promo)。

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

这是数据库中的表(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;

问题在于我可以获得第一个选择(特殊)的选定值(我用firebug看到),但PHP脚本似乎没有被调用。我说因为&#34; console.log(index,value);&#34;不显示任何内容。 您是否知道如何解决问题并根据第一个选定的值填充第二个选定值?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果我是你,我会采用不同的方式。

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

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

  3. 拥有专用控制器的操作,该操作将使用映射器从您的Select元素的数据库中获取所需信息。

  4. 如果您希望在创建表单时(或登录网页时)或当用户实际访问网页时将信息输入到表单Select中,那么您的代码就不是很清楚了页面并做了一些事情,并根据这一点你想要从数据库中检索不同的信息。我认为这是后一种情况。在JS脚本中,您通过Jquery Ajax $.post()函数发送数据。根据您从我上面描述的控制器操作获得的响应,您可以根据它的id填充所需的html选择元素。

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