我想创建ImageBehavior
来上传和保存图片。我的行为有两个字段:imagePath
和imageField
。在我的模型中,我写道:
public function behaviors(){
return array(
'imageBehavior' => array(
'class' => 'ImageBehavior',
'imagePath' => 'images/avatar-pics/'.$this->user->username,
'imageField' => 'avatar',
),
);
}
但这不起作用 - 我收到路径 -
图像/化身图片// image.png
什么解决方案?在行为字段imageFolder
中创建并添加到配置'imageFolder' => 'user->username'
?感谢。
答案 0 :(得分:1)
作为建议:
更改您使用行为的方式并为模型添加一些代码。看一下下面的例子:
例如,您的behavior
:
class ImageBehavior extends CBehavior {
public $imagePath;
public $imageField;
public function getImagePath() {
return $this->imagePath;
}
}
您的model
:
class TestModel extends CFormModel {
private $imagePath = '/home/x/y';
public function setImagePath($imagePath) {
$this->imagePath = $imagePath;
$this->attachBehaviors(array(
array(
'class' => 'ImageBehavior',
'imagePath' => $this->imagePath
)
));
}
public function init() {
$this->setImagePath($this->imagePath);
parent::init();
}
}
现在,看看测试和结果:
$model=new TestModel();
CVarDumper::dump($model->getImagePath()); //output: /home/x/y
$model->setImagePath('/home/x/path2');
CVarDumper::dump($model->getImagePath()); //output: /home/x/path2
$model->setImagePath('/home/x/path3');
CVarDumper::dump($model->getImagePath()); //output: /home/x/path3
通过这种方式,如果您未设置任何imagePath
,则它使用模型的默认值。在前面,每次更改imagePath
时,您的路径都会改变您的行为。
注意:这只是一个建议。这样,您可以自定义setImagePath
方法,以便从您想要的任何地方获取值(另一个模型,会话等......)。
答案 1 :(得分:1)
很抱歉回答自己的问题,但差不多两年后才为这个问题建立了正确的愿景:
1)不要使用行
“图像/化身的PIC /'.$这 - >用户>用户名
在你的行为中 - 它会发出通知“试图获得非对象的属性” - 良好的应用程序不会发出通知和警告。
2)您只需要使用
'images/avatar-pics/' . CHtml::value($this, 'user.username')
代替。如果$ this-> user为null,则value方法返回null,因此请确保您的模型具有相关用户。
答案 2 :(得分:0)
//inside the behavior:
$this->owner->user->username;
$ this->所有者 - 这是你的模特。在填充属性之前初始化行为,并且只有在初始化之后才能获取属性值。