2016-12-06 6 views
0

Я использую ZF2, и в форме у меня есть два выбора: один для специалиста (id = select_spe) и продвижение по службе (id = select_promo).Populate select 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(), иль заполняет выбор с формой данных базы данных (и это хорошо работает).

В моей 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(). Основываясь на ответе, полученном вами от действия контроллера, описанного выше, вы заполняете элемент выбора html на основе его идентификатора.

Ваш подход не плох, это просто, когда ваша система становится больше, становится очень сложно поддерживать ее. Причина в том, что вы используете так называемый сценарий транзакций, и это приводит к созданию шаблонов повсюду. Поэтому, если ваша система станет больше, я бы настоятельно рекомендовал редизайн.