如何在行为配置中使用模型属性值Yii

时间:2014-05-22 11:45:28

标签: php yii model behavior

我想创建ImageBehavior来上传和保存图片。我的行为有两个字段:imagePathimageField。在我的模型中,我写道:

public function behaviors(){
    return array(
        'imageBehavior' => array(
            'class' => 'ImageBehavior',
            'imagePath' => 'images/avatar-pics/'.$this->user->username,
            'imageField' => 'avatar',
        ),
    );
}

但这不起作用 - 我收到路径 -

  

图像/化身图片// image.png

什么解决方案?在行为字段imageFolder中创建并添加到配置'imageFolder' => 'user->username'?感谢。

3 个答案:

答案 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->所有者 - 这是你的模特。在填充属性之前初始化行为,并且只有在初始化之后才能获取属性值。