我使用的是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;不显示任何内容。 您是否知道如何解决问题并根据第一个选定的值填充第二个选定值?
感谢您的帮助。
答案 0 :(得分:0)
如果我是你,我会采用不同的方式。
我将创建一个处理数据库交互的映射器。具体来说,映射器将获取Select
元素的信息。
我会通过依赖注入将此映射器注入控制器,以便能够从控制器的操作中访问映射器。
拥有专用控制器的操作,该操作将使用映射器从您的Select
元素的数据库中获取所需信息。
如果您希望在创建表单时(或登录网页时)或当用户实际访问网页时将信息输入到表单Select
中,那么您的代码就不是很清楚了页面并做了一些事情,并根据这一点你想要从数据库中检索不同的信息。我认为这是后一种情况。在JS脚本中,您通过Jquery Ajax $.post()
函数发送数据。根据您从我上面描述的控制器操作获得的响应,您可以根据它的id填充所需的html选择元素。
您的方法并不差,只是当您的系统变大时,维护它变得非常困难。原因是你使用了所谓的事务脚本,这导致了遍布各处的样板。因此,如果您的系统变大,我强烈建议重新设计。