[英]Zend forms working with ajax/javascript onchange event
我正在编写代码以在应用程序中使用onchange
,这是到目前为止的代码
.Phtml
<script type="text/javascript">
function submit()
{
$id = intval($_GET['id']);
$satellite = intval($_GET['satellite_id']);
if ($id == 0)
{
echo "Please select a Region";
}
else
{
$query = "select * from satellites where region_id = '".$id."'";
$query = mysql_query($query);
echo "<select name='satellite_id'><option value=''>-- select one --</option>";
while ($row = mysql_fetch_assoc($query))
{
echo "<option value='".$row['satellite_id']."'".($row['satellite_id']==$satellite?" selected":"").">".$row['satellite_name']."</option>";
}
echo "</select>";
//DisplayFormRow ("Satellite", FormDropDownBox ("satellite_id", $SatelliteARY, $Result['satellite_id']));
}
}
</script
//zend code Form
$region_name = new Zend_Form_Element_Select('region_name');
$region_name->setAttribs(array('style' => 'width: 150px;'));
$region_name ->setLabel('Region')
->onchange('this.form.submit();') //tried this code ->onchange('javascript:submit();')
->addMultiOption('--Select One--', '--Select One--');
$mdlRegions = new Model_Regions();
$regions = $mdlRegions->getRegions();
foreach ($regions as $region)
{
$region_name->addMultiOption($region->region_id, $region->region_name, $region->region_short_name);
}
//model
<?php
class Model_Regions extends Zend_Db_Table_Abstract
{
protected $_name = 'regions';
//protected $_name = 'smmedetails';
public function getregion($region_id)
{
$region_id = (int)$region_id;
$row = $this->fetchRow('region_id = ' . $region_id);
if (!$row) {
throw new Exception("Could not find row $region_id");
}
return $row->toArray();
}
public function smmedetails2region($region_name)
{
$data = array(
'region_name'=> $region_name
);
return $this->insert($data);
}
public function getRegions()
{
$select = $this->select();
return $this->fetchAll($select);
}
}
//controller
public function registerAction()
{
$this->view->headScript()->appendFile('/js/ui/jquery.ui.autocomplete.js');
$form = new Form_SmmeDetails();
$this->view->form = $form;
if ($this->getRequest()->isPost()) {
$formData = $this->getRequest()->getPost();
if ($form->isValid($formData)) {
$companyname = $form->getValue('companyname');
$companytradingname = $form->getValue('companytradingname');
$region_name = $form->getValue('region_name');
$satellite_name = $form->getValue('satellite_name');
$city = $form->getValue('city');
$companyaddress = $form->getValue('companyaddress');
$addresscode = $form->getValue('addresscode');
$companypostaladdress = $form->getValue('companypostaladdress');
$postalcode = $form->getValue('postalcode');
$companyphonenumber = $form->getValue('companyphonenumber');
$companyfaxnumber = $form->getValue('companyfaxnumber');
$companycellnumber = $form->getValue('companycellnumber');
$businessemailaddress = $form->getValue('businessemailaddress');
$businesswebsite = $form->getValue('businesswebsite');
$smmedetails = new Application_Model_DbTable_SmmeDetails();
$smmeid = $smmedetails ->smmedetailsSmmeDetails($companyname, $companytradingname, $region_name, $satellite_name, $city, $companyaddress, $addresscode, $companypostaladdress, $postalcode, $companyphonenumber, $companyfaxnumber,
$companycellnumber, $businessemailaddress, $businesswebsite);
// $region = new Application_Model_DbTable_Region();
//$region ->smmedetails2region($formData, $smmedetails->smmeid);
$this->_redirect('/admin/smme/register2/smmeid/'.$smmeid);
} else {
$form->populate($formData);
}
}
}
该代码假定查看一个隐藏的输入选择,即当您从区域中选择一个领域选项时称为“ satellite”的选项,satellite应该根据所选区域查看某些选项。 简而言之,选择的区域应与用户选择的区域相对应。 例如,省份是豪登省,因此引用的是约翰内斯堡,比勒陀利亚等。请注意,区域名称和卫星选项是根据名称和ID从数据库表中调用的。 上面的代码不断给我和错误消息:方法onchange不存在。 有人被告知不要使用onchange方法,我应该使用ajax,可以在视图中使用javascript和sqlquery还是应该将其称为操作? 如果可以,怎么办? 这是一个简短的图片示例。
请帮忙
提前致谢
我会给你一些建议。
首先,为简单起见,我不使用onChange函数,因为我在API中看不到它,而且以这种方式编写的JavaScript或jQuery可能难以维护和正确编写。 而是包含一个外部JavaScript文件要简单得多。 这样,您还可以分别测试和调试JavaScript,以及重新使用它。
看看onChange和getJson的出色文档。 我已经使用了这些和其他工具,它们很简单。 对于测试,我建议初学者使用QUnit 。 它使测试变得轻而易举。
其次,如果您将Zend库用于Model_Regions
和$region_name
,那么我建议您也使用它们,而不是直接使用mysql进行调用。 这将使您能够构建良好的库,并且可以根据需要继续扩展该库,而且它使编写SQL更快,更安全。
对于控制器,我建议使用带有Restful
Route的RestController
。 这是一个很棒的教程 。
我希望这可以帮助您解决问题。 如果您还有其他需要,请告诉我。
感谢您向我发送电子邮件。 我的解决方法如下:
首先,我设置表单,然后在控制器中执行操作。 可以说getmajorgroupAction(),然后在该操作中我将禁用布局,并仅基于id获取相关结果。 然后在视图文件中,循环浏览
因此该调用的输出为
<option value="1">1</option>
<option value="2">2</option>
等等
我个人现在使用jquery,而您在给我发电子邮件时引用的帖子却使用了另一种方法。 试图使用这样的东西
jQuery(document).ready(function() {
jQuery("#division").change(function () {var division = jQuery("#division").val();
jQuery("#major_group").load("/module/getmajorgroup/", {division_id: division} );});
});
希望有道理。
谢谢,这很有用,但是我在下面找到了一种使用此公式的方法,但是每次我单击第一个选择时,仍然在会话中的第二个选择就会一直出现,例如,如果某个人选择了错误的选择并重试它带来了另一个领域,而不是固定领域。 我认为这是一个巨大的循环。 这是我的剧本
<script type="text/javascript">
$(document).ready(function() {
$("#region_name").on('change', function () {
ajaxAddField();
}
);
}
);
// Retrieve new element's html from controller
function ajaxAddField()
{
$.ajax(
{
type: "POST",
url: '<?php echo $this->baseURL()?>/admin/ajax/get-cities/city/' + encodeURIComponent($('#region_name').val()),
success: function(newElement) {
// Insert new element before the Add button
//$(this).prev().remove().end().before('#city-label');
$("#city-label").before(newElement);
}
}
);
}
</script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.