2014-05-22 2 views
4

이미지 업로드 및 저장을 위해 ImageBehavior을 생성하고 싶습니다. 내 행동에는 두 개의 필드가 있습니다 : imagePathimageField. 내 모델에서 내가 쓴 해요 :동작 구성에서 모델 속성 값을 사용하는 방법 Yii

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

을하지만이 일을하지 않습니다 - 내가 경로받을 -

이미지/아바타 사진 // image.png를

무엇 해결책? 행동 입력란 imageFolder을 만들고 설정을 'imageFolder' => 'user->username'에 추가 하시겠습니까? 감사.

답변

1

자신의 질문에 대답 죄송하지만 :

1) 라인

'이미지/아바타 사진을 사용하지 않는를 /'.$이 -> 사용자 -> 사용자 이름

당신의 행동에 - 당신은 "비 객체의 속성을 얻으려고합니다."라는 메시지를 던집니다. 좋은 응용 프로그램은주의와 경고를 전달하지 않습니다.

2) 당신이 필요로하는 모든 대신

'images/avatar-pics/' . CHtml::value($this, 'user.username') 

를 사용합니다. $ this-> user가 null의 경우, value 메소드는 null를 돌려 주므로, 사용자와 관련 지을 수 있고있는 모델을 확인해주세요.

0
//inside the behavior: 
$this->owner->user->username; 

$ this-> owner - 귀하의 모델입니다. 행동은 속성을 채우기 전에 초기화되며 속성 값은 초기화 후에 만 ​​가져올 수 있습니다.

+0

나쁜 해결책. 한 모델의 경우이 방법은 작동하지만 다른 모델의 경우 작동합니까? 두 번째 모델에서는''imagePath '=>'images/help/'.$ this-> id' - 유연성을 잃어 버리게 설정해야합니다. – f0rtis

1

제안 사항 :

동작을 사용하는 방식을 변경하고 모델에 코드를 추가하십시오. 다음 예를 살펴 :

예를 들어

, 당신의 behavior :

class ImageBehavior extends CBehavior { 
    public $imagePath; 
    public $imageField; 
    public function getImagePath() { 
     return $this->imagePath; 
    } 
} 

당신의 model :

$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 
: 이제

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(); 
    } 

} 

, 테스트 및 결과를 살펴

이렇게하면 아무 것도 설정하지 않으면 imagePath 모델의 기본값을 사용합니다. 앞에, imagePath을 변경할 때마다 경로가 행동에 따라 바뀝니다.

참고 : 이것은 단지 제안 사항입니다. 이를 통해 setImagePath 메서드를 사용자 정의하여 원하는 곳에서 값을 가져올 수 있습니다 (다른 모델, 세션 등 ...). 이 문제에 대한 올바른 비전을 구축 거의 2 년이 지난