繁体   English   中英

Zend表单使用Ajax / javascript onchange事件

[英]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,以及重新使用它。

看看onChangegetJson的出色文档。 我已经使用了这些和其他工具,它们很简单。 对于测试,我建议初学者使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM