Yii:具有相同模型的多个activeCheckboxlist

时间:2013-08-06 09:39:47

标签: yii

刚刚开始使用Yii网络应用并遇到了这个问题,欢迎任何建议:)

我想要实现的目标: - 要显示带有选项卡的表单,每个选项卡内容都包含来自同一模型的复选框列表。 - 用户可以从选项卡1中选择一些项目,从选项卡2中选择一些项目等,然后单击“提交”按钮进行处理。

问题: 但无论如何我无法想到最后一个标签activecheckboxlist不会破坏前一个标签。 我想尝试类似的东西:[www.yiiframework.com/forum/index.php/topic/20388-2-checkboxlist-and-1-model]

但不是将其固定在2,而是我的动态。

到目前为止我做了什么:

<?php
    $tabArray = array();
    foreach ((Product::model()->listParentChild(0)) as $productparent) {
        array_push($tabArray, array(
            'label' => $productparent['name'],
            'content' => CHtml::activeCheckBoxList(
                    $model, 'products', CHtml::listData(Product::model()->listParentChild($productparent['id']), 'id', 'name'), array(
                'labelOptions' => array('style' => 'display:inline'),
                'template' => '<div class="check-option">{input} {label}</div>',
                'separator' => '',
                    )
            ), 'active' => ($productparent['id'] == 1 ? true : false),
        ));
    }
    ?>   

    <?php
    $this->widget('bootstrap.widgets.TbTabs', array(
        'type' => 'tabs', // 'tabs' or 'pills'
        'placement' => 'left',
        'tabs' => $tabArray,
    ));
    ?>

在我的产品型号中:

 public function listParentChild($parentid) {
    $sql = "SELECT * FROM piki_product WHERE parentid=:parentid";        
    $productlist = Yii::app()->db->createCommand($sql);
    $productlist->bindValue(":parentid", $parentid, PDO::PARAM_INT);
    return $productlist->queryAll();
}

任何建议将不胜感激..:/

1 个答案:

答案 0 :(得分:0)

我可能是错的,但我不认为悬崖栏杆是关于动态嵌套的评论。据我所知,你只处理一个级别的儿童产品;只是可能有多套这些儿童产品。

在这种情况下,您选择的链接实际上提供了正确的解决方案:

<?php echo CHtml::checkBoxList('array1', CHtml::listData(Atributos::model()-> findAllByAttributes(array('tipo'=>'talla')), 'id_atributo','valor'))?>

<?php echo CHtml::checkBoxList('array2', CHtml::listData(Atributos::model()-> findAllByAttributes(array('tipo'=>'talla')), 'id_atributo','valor'))?>

每组复选框都有一个不同的名称(array1和array2),因此每个字段的选定值不会覆盖另一个。在你的情况下,解决方案是相同的;你只需要使字段名称动态化。即。

foreach ((Product::model()->listParentChild(0)) as $productparent) {
  $fieldname = 'product' . $productparent['id'];
  echo CHtml::checkBoxList($fieldname, ... (etc)

在您的控制器中,您将检查每个动态字段名称是否有结果。

foreach ((Product::model()->listParentChild(0)) as $productparent) {
  if (isset($_POST['product' . $productparent['id']]) {
    // Add values to $model->product
  }
}

更好的解决方案是单独输出每个复选框,这样您就可以创建一个结果数组,并按子ID进行索引。

foreach ((Product::model()->listParentChild(0)) as $productparent) {
  foreach (Product::model()->listParentChild($productparent['id']) as $child) {
    CHtml::checkBox("product[{$child['id']}]", ... (etc)

然后在您的控制器中,您所要做的就是:

if (isset($_POST['product']) && count($_POST['product']) > 0) {
  $model->product = array_keys($_POST['product']);
}

此解决方案不适用于activeCheckBoxList()。如果您想覆盖__get()__set()魔术方法以使这些动态属性名称可供您的模型使用,那么它会起作用,但这可能会过度杀死。

修改(根据要求)

如果您需要为复选框选择默认选项,则可以将它们作为CHtml::checkBoxList()的第二个参数传递。 http://www.yiiframework.com/doc/api/1.1/CHtml#checkBoxList-detail

但如果您仍想使用__get()__set(),请举例:

class YourModel extends CActiveRecord {
    // I usually create a placeholder to contain the values of my virtual attribute
    protected $_childValues = array();

    public function __get($name) {
        // The following regular expression finds attributes
        // with the name product_{parent ID}
        if (preg_match("/^product_\d+$/", $name)) {
            // I put the underscore in the name so I could get
            // parent ID easier.
            list($junk, $id) = explode("_", $name);
            if (!isset($this->_childValues[$id])) {
                $this->_childValues[$id] = array();
            }
            return $this->_childValues[$id];
        }
        else {
            // Make sure to still call the parent's __get() method
            return parent::__get($name);
        }
    }

    public function __set($name, $value) {
        // Same regex as above
        if (preg_match("/^product_\d+$/", $name)) {
            list($junk, $id) = explode("_", $name);
            $this->_childValues[$id] = $value;
        }
        else {
            // Make sure to still call the parent's __set() method
            parent::__set($name, $value);
        }
    }
}

$model = new YourModel;

// Any property in the format of product_{parent ID} is available
// through your model.
echo $model->product_1;
$model->product_300 = array();

您还可以考虑检查属性名称中的父ID是否与数据库中的父ID相对应,而不是仅允许该格式的任何属性通过。