I am using behavior in model extending CActiveRecordBehavior and understand how it works, but in controller I don’t understand how to add a behavior. Somebody can post one example from how to use it? I’ve read this cookbook http://www.yiiframework.com/doc/cookbook/44/ and it’s like abstract to me!
samdark
(Alexander Makarov)
April 26, 2010, 10:15am
2
You can do it two ways.
First, you can use AR’s http://www.yiiframework.com/doc/api/1.1/CModel#behaviors-detail .
Second is:
$post = Post::model();
$post->attachbehavior('tags', new ETaggableBehavior());
$post->tags = 'Yii, PHP, behavior';
$post->save();
What’s the diference between attachBehavior and
public function behaviors()
{
return array(
'UploadActiveRecordBehavior'=>'application.behaviors.UploadActiveRecordBehavior',
);
}
In this behavior I have…
beforeValidate event
afterDelete event
afterSave event
… to control upload and delete on save the model.
In this case I have two behaviors, one in model, that I typed above, and another that I’m typing a lot:
public function actionMidia()
{
$model=$this->loadModel();
$criteria=new CDbCriteria;
$criteria->condition='dicaId='.$model->id;
$criteria->order='ordem ASC';
$midia=Midia::model()->findAll($criteria);
$this->render('midia',array('model'=>$model,'midia'=>$midia));
}
public function actionUpload()
{
Yii::app()->session->sessionID=$_POST['PHPSESSID'];
Yii::app()->session->init();
$uploadedData=$_FILES['Filedata']['tmp_name'];
$midia=new Midia;
$pathFile=param('dicaPath');
$midia->dicaId=$_GET['id'];
$midia->ordem=Midia::model()->count('dicaId='.$midia->dicaId);
// Pasta thumb
$pathThumb=$pathFile.DS.param('thumbsFolder');
// Nome do arquivo que será salvo
$midia->url=md5(uniqid(microtime())).'.'.param('extDefault');
if($midia->save())
{
// Fotos
f($pathFile)->createDir();
Yii::app()->thumb->setThumbsDirectory($pathFile);
Yii::app()->thumb
->load($uploadedData)
->resize(param('photoWidth'), param('photoHeight'))
->save($midia->url, param('extDefault'));
// Thumbs
f($pathThumb)->createDir();
Yii::app()->thumb->setThumbsDirectory($pathThumb);
Yii::app()->thumb
->load($uploadedData)
->resize(param('thumbWidth'), param('thumbHeight'))
->save($midia->url, param('extDefault'));
}
$criteria=new CDbCriteria;
$criteria->condition='dicaId='.$midia->dicaId;
$criteria->order='ordem ASC';
$model=Midia::model()->findAll($criteria);
return $this->renderPartial('_ajaxMidia', array('model'=>$model));
}
public function actionOrdenarMidias()
{
$ordem=$_POST['ordem'];
vardump($_POST);
if(isset($ordem))
{
foreach($ordem as $i=>$id)
{
$model=Midia::model()->findByPk($id);
$model->ordem=$i;
$model->save();
}
}
}
public function actionApagarMidia()
{
$id=$_GET['id'];
$itens=$_POST['ordem'];
$criteria1=new CDbCriteria;
$criteria1->addCondition('dicaId='.$id);
if(not_null($itens))
{
$lista_itens=array();
foreach($itens as $ordem=>$_id)
{
$lista_itens[]=$_id;
}
$criteria1->addNotInCondition('id',$lista_itens);
}
if(not_null($deleteItem=Midia::model()->find($criteria1)->id))
{
f(param('dicaPath').DS.Midia::model()->findByPk($deleteItem)->url)->delete();
f(param('dicaPath').DS.param('thumbsFolder').DS.Midia::model()->findByPk($deleteItem)->url)->delete();
Midia::model()->deleteByPk($deleteItem);
}
$criteria2=new CDbCriteria;
$criteria2->condition='dicaId='.$id;
$criteria2->order='ordem ASC';
$model=Midia::model()->findAll($criteria2);
return $this->renderPartial('_ajaxMidia', array('model'=>$model));
}
How I want to reuse this code in several controllers, then I think that behavior will help.
Am I correct?
samdark
(Alexander Makarov)
April 26, 2010, 4:52pm
4
Humm… Now I understand that what I need is divide my controller in so many parts to reuse, thanks!
jgarberi
(Jgarberi)
January 7, 2014, 8:28pm
6
great explanation, thanks!