YII框架 form表单更新数据时候选值问题

你打球像那谁 发布于 2013/02/03 16:34
阅读 2K+
收藏 2

kindeditor 好多莫名其妙的换行。。。

category表和post表是多对多,有个中间表relationships,分别记着category_id和post_id 

 Post.php model中 有关系 

'cids'=>array(self::HAS_MANY,'Relationships','post_id'),
Category.php model中有方法:
static public function getAllCategory(){
		return CHtml::listData(self::model()->findAll(), 'id', 'name');
	}
比如现在我要更新一条数据,这条数据的栏目有两个,假设该文章id是21,是属于两个栏目,那么在relationship表中的数据就应该是
id post_id category_id
1    21          1 
2    21          2

其中id是流水,该文章的category是1和2. 该栏目的数据我通过建立Relationship.php的AR能够获取,

_from中表单我是这么写的:

<div class='row'>
		<?php echo $form->labelEx($model,'cid'); ?>
		<?php echo $form->checkBoxList($model,'cid',
				Category::getAllCategory(),array(
					'style'=>'display:inline;',
					'separator'=>"<br />\n",
					'template'=>'{input}{label}',
					'labelOptions'=>array('style'=>'display:inline')));
		?>
		<?php echo $form->error($model,'cid'); ?>
	</div>

问题是我在_form 中不知道要肿么将数据填进去?就是我在更新数据的时候,栏目应该选中才对。

以下是问题补充:

@你打球像那谁:relationship表中的category_id 字段实际是 cid,所有下面的 视图有点出入。 (2013/02/03 18:35)
加载中
0
iceteea
iceteea

对于view层数据的解耦,抛开checkBoxList,用dropDownList来说举个例子:

1=>分类1,2=>分类2,表现层(view)中可能是''=>请选择,1=>分类1,2=>分类2。通过此,你想到了什么?

关于Behavior是这样的,Behavior只是一种解决方案,稍后再说。目前你要明白的是,你如果要为Model提供一个属性(像cid[]),需要考虑哪几点?(提示:要与CActiveRecord接地气)

 

0
你打球像那谁
你打球像那谁

最后我在afterFind中用一个循环搞定了,但是我觉得应该有更好的方法才对

//通过relations 的关系,将 栏目压入到cid中
		foreach($this->cids as $v){
			$this->cid[] = $v->attributes['cid'];
		}

0
iceteea
iceteea

首先提个建议:

view层不应该关心Category::getAllCategory(),诸如此类,本人是将 dropDownList、xxxList所需的数组,用一个代理类来访问。解耦的好处显而易见。

再来看你的问题:

首先告诉你,你的方案存在什么隐患:

1.new model后cid不是数组!

2.validate对于cid是否够严谨?

最后提示:

这种需求,用CActiveRecordBehavior解决,可以提高重用性。

 

 

你打球像那谁
你打球像那谁
谢谢你的回答。您能提供一下您的代理类的写法法?我不太能够理解代理类的意思。然后对于行为至今没怎么理解。您能提供一下像这个需求这个行为应该的写法吗?谢谢。
0
你打球像那谁
你打球像那谁
@ Susanno  
是否在controller中增加代理方法
function xxAction () 
{
    return Category::getAllCategory();
}
几个月之后,还是没能很好的理解。

CActiveRecordBehavior中应该是
public function events()
{
    return array_merge(parent::event(), [
        'onGetAllCategory' => 'getAllCategory'
    ]);
}

public function getAllCategory()
{
    return $this->getOwner()->findAll(XXX);
}
0
iceteea
iceteea

以下纯属本人愚见:

首先看controller部分,controller可以看作是action的集合。

controller职责就是负责request&response。概不封装任何逻辑,即使有也是细粒度的代理方法。我写代码时一般controller中只有一个方法,actions()。

将可重用的部分封装到全局类里面,比如静态的helper或者单例类里面,提高重用性,Yii本身用Application components,可以用Yii::app()->xxx访问,这个很不错,集中管理。

 

其次看beahvior部分,

上次我说的behavior是讲,如果对一个model中的数组属性进行管理,该怎么做!你讲到用afterFind进行对该属性的初始化,这可以解决,完全没有问题。但是如果一个和Post model毫无相干的model,也需要数组属性的特性,你怎么办?重写一遍afterFind方法吗?你说可以继承,别忘了我说的是和Post model毫无相关的model(PS:马和驴ox可以有骡子...)!而选择behavior可以很好的解决这种问题,这就是组合优于继承的体现!

 

接下来我们再说说getAllCategory,

比如说,我们要将All category的存储方式改为XML、改为PHP数组。你怎么办?

返回顶部
顶部