刚刚开始使用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();
}
任何建议将不胜感激..:/
答案 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相对应,而不是仅允许该格式的任何属性通过。