Yii动态列表框


Yii Dynamic Listbox

当前在Yii中,我对一个列表框进行了ajax调用,该列表框在选择时将动态修改下一个框。ajax调用当前指向我的控制器和方法。

public function actionDynamicProducts()
    {
        foreach($_POST['ProductGroups']['id'] as $productGroups){
            $groupedP=GroupedProducts::model()->findAll('product_group_id=:product_group_id', array(':product_group_id'=>$productGroups));
            $groupedP=CHtml::listData($groupedP,'id','product_id');
            foreach($groupedP as $value=>$product_id){
                $data=Products::model()->findAll('id=:id', array(':id'=>$product_id));
                $data=CHtml::listData($data,'id','title');
                foreach($data as $value=>$title){
                    echo CHtml::tag('option', array('value'=>$value),CHtml::encode($title),true);
                }
            }
        }
    }

目前它运行得很好,但我希望它能做的是相反,如果选择了一个组,下一个框就不会显示与它相关的产品。我尝试了$data=Products::model()->findAll('id!=:id', array(':id'=>$product_id));,但如果选择了多个项目,它只会显示不可用的内容。例如

$Products  =  
    Array (
          0 => Ties
          1 => Shirts
          2 => Jeans
    )
$groupProducts =
    Array (
          0 => Shirts and Jeans
          1 => Ties
          2 => Jeans and Ties
    )

如果我选择衬衫和牛仔裤,我只想展示领带。或者,如果我选择衬衫和牛仔裤,领带什么都不应该显示。

您的逻辑中有一个错误。第一个"foreach"的每次迭代都会生成一组选项标记。示例:

  1. 您选择:衬衫和牛仔裤,领带
  2. 外部foreach的第一次迭代得到"衬衫和牛仔裤"产品组,并显示领带选项
  3. 外部foreach的第二次迭代获得"领带"产品组,并显示衬衫和牛仔裤选项

所以要修复它,你可以这样做:

// condition whith not in param
$dbc = new CDBCriteria();
$dbc->addNotInCondition('product_group_id', $_POST['ProductGroups']['id']);
$groupedP=GroupedProducts::model()->findAll($dbc);
$groupedP=CHtml::listData($groupedP,'id','product_id');
foreach($groupedP as $value=>$product_id){
    $data=Products::model()->findAll('id=:id', array(':id'=>$product_id));
    $data=CHtml::listData($data,'id','title');
    foreach($data as $value=>$title){
        echo CHtml::tag('option', array('value'=>$value),CHtml::encode($title),true);
    }
}

希望它能帮助你。