【问题标题】:Zend forms working with ajax/javascript onchange eventZend 表单使用 ajax/javascript onchange 事件
【发布时间】:2013-11-26 09:15:51
【问题描述】:

我正在编写代码以在我的应用程序中使用 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);
                }

        }
        }

当您从区域中选择一个字段选项时,该代码假设查看一个隐藏的输入选择,称为卫星,卫星应根据所选区域查看某些选项。简而言之,选择的区域应该与用户选择的区域相对应。例如,省是豪登省,所以引用将是,约翰塞堡,比勒陀利亚等。请注意,根据名称和 ID 从数据库表中调用区域和卫星选项。上面的代码不断给我和错误消息:方法 onchange 不存在。被告知不要使用 onchange 方法,我应该使用 ajax,我可以在视图中使用 javascript 和 sqlquery 还是应该将其称为操作?如果有怎么办?这是一个轻微的图片示例。

请帮忙

提前致谢

【问题讨论】:

  • 如果您有更多详细信息要添加到上一个问题中,请编辑它而不是提出新问题。

标签: javascript ajax zend-framework zend-form


【解决方案1】:

我会就您那里的内容提出一些建议。

首先,为了简单起见,我不会使用 onChange 函数,因为我看不到它in the API,而且以这种方式编写的 JavaScript 或 jQuery 可能会变得难以维护和正确编写。改为包含外部 JavaScript 文件要简单得多。通过这样做,您还可以单独测试和调试 JavaScript,以及重用它。

查看onChangegetJson 的优秀文档。我用过这些和其他的,它们非常简单。对于测试,我建议初学者使用QUnit。它使测试变得轻而易举。

其次,如果您将 Zend 库用于 Model_Regions$region_name,那么我建议您也使用它们而不是直接调用 mysql。这将允许您构建一个好的库,您可以根据需要继续扩展它,而且它使编写 SQL 更快、更安全。

对于控制器,我建议使用 RestControllerRestful 路由。 Here's an excellent tutorial.

我希望这可以帮助您解决问题。如果您需要更多信息,请告诉我。

【讨论】:

  • 请在下面查看我的答案仍然需要一些帮助
【解决方案2】:

感谢您通过电子邮件告知我。 我的做法如下:

首先我设置了表单,然后在控制器中设置了一个动作。 让我们说 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} );});
});

希望这是有道理的。

【讨论】:

  • 请在下面查看我的答案仍然需要一些帮助
  • 很抱歉延迟回复您。我应该很快就会给你答复。
【解决方案3】:

谢谢,这很有用,但我找到了一种使用下面这个公式的方法,但是每次我点击第一个选择时,仍然在会话中,第二个选择一直出现,例如,如果一个人选择了错误的选择并重新尝试它带来了另一个领域,而不是修复领域。我认为它在一个计数循环中。这是我的脚本

<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>   

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2015-01-01
    • 2021-03-24
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多