【问题标题】:Yii Multiple Dependent DropdownYii 多依赖下拉菜单
【发布时间】:2014-07-03 08:14:43
【问题描述】:

我是 Yii 框架的新手。我正在制作多个相关的下拉菜单。 岛屿 地区 省份 城市

我有一个岛屿下拉列表,当您选择一个岛屿时,区域下拉列表将被更新,并且只会出现属于该岛屿的区域。省和市也是如此。

现在,我已经完成了群岛。当您选择一个岛时,只会出现属于该岛的区域。我的问题是第二级下降。当我选择区域时,只会出现属于该区域的provides。我已经以与第一个相同的方式和逻辑对其进行了编码,但我没有得到任何输出或错误。我正在使用 Ajax。你能帮助我吗?谢谢

这是我的观点

<div class="row">
    <?php echo $form->labelEx($model,'island'); ?>
    <?php
        echo $form->dropDownList($model,'island',CHtml::listData(Islands::model()->findAll(), 'IslandID', 'IslandName'),
        array(
        'prompt'=>'Select Island',
        'ajax' => array(
        'type'=>'POST', 
        'url'=>CController::createUrl('loadRegions'), //or $this->createUrl('loadcities') if '$this' extends CController
        'update'=>'#region', //or 'success' => 'function(data){...handle the data in the way you want...}',
        'data'=>array('IslandID'=>'js:this.value'),
        ))
    );
    ?>
</div>

<div class="row">
    <?php echo $form->labelEx($model,'region'); ?>
    <?php
        /*echo $form->dropDownList($model,'region',CHtml::listData(Regions::model()->findAll(), 'RegionID', 'RegionName'),
        array('class'=>'span4 chosen','maxlength'=>20)*/
        echo CHtml::dropDownList('region','', array(), array('prompt'=>'Select Region'),
        array(
        'ajax' => array(
        'type'=>'POST', 
        'url'=>CController::createUrl('loadProvinces'), //or $this->createUrl('loadcities') if '$this' extends CController
        'update'=>'#province', //or 'success' => 'function(data){...handle the data in the way you want...}',
        'data'=>array('region'=>'js:this.value'),
        ))

    );

    ?>
</div>

<div class="row">
    <?php echo $form->labelEx($model,'province'); ?>
    <?php
        echo CHtml::dropDownList('province','', array(), array('prompt'=>'Select Province'));
    ?>  
</div>

这是我的控制器

/* Function for dependent dropdown */
public function actionLoadRegions()
{

   $data=Regions::model()->findAll('IslandID=:IslandID', 
   array(':IslandID'=>(int) $_POST['IslandID']));

   $data=CHtml::listData($data,'RegionID','RegionName');

   foreach($data as $value=>$region)
   echo CHtml::tag('option', array('value'=>$value),CHtml::encode($region),true);
}

public function actionLoadProvinces()
{
    //var_dump($_POST['region']);

    $data=Provinces::model()->findAll('RegionID=:RegionID', 
    array(':RegionID'=>(int) $_POST['RegionID']));

   $data=CHtml::listData($data,'ProvinceID','ProvinceName');

   foreach($data as $value=>$province)
   echo CHtml::tag('option',                         array('value'=>$value),CHtml::encode($province),true);
}

我刚刚关注了这个,但是在多个下拉列表中,它似乎不起作用?谢谢!

【问题讨论】:

  • 应该有一些错误,如果您使用的是 chrome,只需在开发人员工具窗口的网络选项卡中查看并更改第一个下拉菜单,然后更改第二个... ajax 调用控制器成功或失败将显示跨度>
  • 是的。我试过了,但我没有收到任何错误:(
  • 在您的区域下拉列表中将'data'=&gt;array('region'=&gt;'js:this.value')修改为'data'=&gt;array('RegionID'=&gt;'js:this.value')
  • 我也试过了,但还是不行,也没有错误或任何错误:(
  • codingbin.com/dependent-drop-down-lists-in-yii 如果有帮助,请检查一下

标签: php ajax drop-down-menu yii


【解决方案1】:

您在控制器文件中没有问题。我认为您的查看文件有问题。特别是在您的选择区域部分。这是您的视图文件的更新代码。请删除 1 个参数 array() 并检查它。

<div class="row">
<?php echo $form->labelEx($model,'region'); ?>
<?php
    echo $form->dropDownList($model,'region',CHtml::listData(Regions::model()->findAll(), 'RegionID', 'RegionName'),
    array('class'=>'span4 chosen','maxlength'=>20)*/
    echo CHtml::dropDownList('region','', array('prompt'=>'Select Region'),**//Here i remove array() and it works.**
    array(
    'ajax' => array(
    'type'=>'POST', 
    'url'=>CController::createUrl('loadProvinces'), //or $this->createUrl('loadcities') if '$this' extends CController
    'update'=>'#province', //or 'success' => 'function(data){...handle the data in the way you want...}',
    'data'=>array('region'=>'js:this.value'),
    ))

);

?>

【讨论】:

    【解决方案2】:

    示例程序,类似于您的要求。

    下面是IslandsRegionsProvinces表格

    岛屿表

     Islands
     -------
     IslandID
     IslandName
    

    区域表

     Regions
     ---------
     RegionID
     RegionName
     IslandID
    

    省份表

     Provinces
     ----------
     ProvinceID
     ProvinceName
     IslandID
     RegionID
    

    假设我正在编程用户注册。所以,$modelUser 模型的实例/对象

    我的看法

     Select Island 
     <?php
        echo $form->dropDownList($model,'IslandID',CHtml::listData(Islands::model()->findAll(), 'IslandID', 'IslandName'),
         array(
            'prompt'=>'Select Island',
            'ajax' => array(
                'type' => 'POST', //My method type
                'url' => CController::createUrl('myController/LoadRegions'), //This is my request/ajax URL
                array('IslandID'=>'js:this.value'), //I'm passing the selected dropdonw value.
                'dataType' => 'JSON', 
                'success'=>'js:function(data)' //The functionaliy after success
                . '{'
                . '    var html="";'
                . '    $.each(data,function(i,obj)'
                . '    {'
                . '         html+="<option value=obj.RegionID>"+obj.RegionName+"</option>"'
                . '    });'
                . '    $("#User_RegionID").html(html);' //ID of regions dropdown list
                . '}' 
    
        )));
    );
    ?>
    
    Select Region
    <?php
    echo CHtml::dropDownList($model,'RegionID', array(), array('prompt'=>'Select Region'));
    ?>
    

    对于这个 dropDownlist id 将生成为 User_RegionID。即,将生成一个字段id,其中模型名称和字段名称居中,下划线“_”。

    前:

    1. ModelName_FieldName
    2. City_Id(City 是模型,Id 是 City 模型中的属性/字段)

    控制器方法

    public function actionLoadRegions()
    {
    
        $IslandID=$_POST['IslandID'];
    
        $criteria=new CDbCriteria();
        $criteria->select=array('RegionID,RegionName');
        $criteria->condition='IslandID='.$IslandID;
        $criteria->order='RegionName';
        $RegionsAry= Regions::model()->findAll($criteria);
    
        $ary=array();
        foreach($RegionsAry as $i=>$obj)
        {
             $ary[$i]['RegionID']=$obj->RegionID;
             $ary[$i]['RegionName']=$obj->RegionName;            
        }
        echo json_encode($ary);
    }
    

    在选择地区时获取省份列表

    Select Region
    <?php
    echo CHtml::dropDownList($model,'RegionID', array(),
    array(
      'prompt'=>'Select Region'
      'ajax' => array(
           'type' => 'POST', //My method type
           'url' => CController::createUrl('myController/LoadProvinces'), //This is my request/ajax URL
           array('RegionID'=>'js:this.value'), //I'm passing the selected dropdonw value.
                'dataType' => 'JSON', 
                'success'=>'js:function(data)' //The functionaliy after success
                . '{'
                . '    var html="";'
                . '    $.each(data,function(i,obj)'
                . '    {'
                . '         html+="<option value=obj.ProvinceID>"+obj.ProvinceName+"</option>"'
                . '    });'
                . '    $("#User_ProvinceID").html(html);' //ID of Province dropdown list
                . '}' 
    ));
    ?>
    
    Select Provinces
    <?php
    echo CHtml::dropDownList($model,'ProvinceID', array(), array('prompt'=>'Select Province'));
    ?>
    

    获取所有省份的控制器方法

    public function actionLoadProvinces()
    {
         //To your task
    }
    

    【讨论】:

      【解决方案3】:

      试试

          <?php echo CHtml::activeDropDownList($model,'region',array(),array(prompt'=>'Select Region'),'ajax' => array(
          'type'=>'POST', 
          'url'=>CController::createUrl('loadProvinces'), //or $this->createUrl('loadcities') if '$this' extends CController
          'data'=>array('region'=>'js:this.value'),
          'update'=>'#'.CHtml::activeId($model,'province'),
                )
              )); ?>
      

      还有

        <?php echo CHtml::activeDropDownList($model,'province', array(),array('prompt'=>'Choose Province')); ?>
      

      【讨论】:

      • 感谢您的帮助,但它也不起作用。我想知道为什么我的 ajax 请求是看不到的。我正在尝试查看我的区域下拉列表的值 $_POST 并且没有错误并且没有输出:(
      • Juz 尝试将 listdata 提供给您的下拉列表,然后查看 ajax 是否被触发。
      • 我的意思是用 CHtml::listData(Regions::model()-&gt;findAll() 替换 array()。试试看 ajax 是否会出错!
      • 它正在工作。区域列表的填充取决于岛屿列表上的值。我的问题是省,当我选择任何地区时,省不会改变,我什至看不到错误或萤火虫:(
      • 您的下拉菜单中似乎有格式错误。试试我更新的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      相关资源
      最近更新 更多