Widget 能否封装到 model里面

因为让用户自定义字段,我的model的属性对应的就是一个个挂件(比如 CAutoComplete)或者基本的表单元素(比如 input textare)等。

我希望能在model里面根据属性的值自动创建挂件或者form元素,封装起来。这样我在view直接调用就可以了。可是我怎么在model里面创建widget呢?createWidget会报错的……

或者有没有别的什么解决办法?

谢谢

是否在model里只保存创建widget需要的配置数组,把widget的创建留到真正需要的时候由controller或其它widget来创建?

这样的话需要在视图里面写一些判断的代码了,因为除了widget之外,还有input等元素,他们不用能统一的方式。后者用CHtml或者ActiveForm就可以了。

我觉得比较理想的是在视图里面 用$model->input.

model 里面的getInput 作为统一的接口,根据属性的值+上“Input”自动的去调用 textInput radioInput autoCompleteInput 等。至于用widget还是Chtml就都可以在方法内各自实现了。

所以能想到的就是在视图里面,先判断一下是不是基本类型,是的话,继续用$model->input,不是的话,再去根据参数创建widget。但是这样感觉视图里面就有了些逻辑代码

我觉得这样应该可以。视图里的这种逻辑代码是合理的,因为它们是和显示相关的(把这种代码放到model或controller都不合适)。你也可以考虑把这个代码抽象出来做成一个helper class。

嗯,只好如此了。

不过我觉得放到model里面应该也合适吧,因为我的一个属性值就代表了一个视图片段。或者model只有和数据库模型相关的那些才是正道?

也不绝对如此,关键看你如何理解model。如果你的model本身就需要表达view,那么存放在model也没什么不合适的。但是,为了增加可重用性以及降低耦合度,最好避免在model里直接存放view的片段,因为view的片段往往是上下文相关的。这种情况下,存取一种配置(在需要时可以转化成view)可能是更好的选择。

收到 谢谢