Good day, I’m new at using Yii and I’m having difficulty with one situation. I’m developing a new module for an existing site of a academy with several franchisees. This module entails the upload of files. When we upload a file we tell to which franchisees the file belongs. The file may belong to more than one franchisee and I have an option that it belongs to everyone. I attached the table structure.
This is my model:
class RepositorioFicheiros extends CActiveRecord
{
public $academiasId;
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return 'repositorioficheiros';
}
public function rules()
{
return array(
array('titulo, descricao, data_criacao, academiasId', 'required'),
array('data_criacao, academiasId', 'safe'),
array('ficheiro', 'file', 'types' => '7z, bmp, doc, docx, dwf, dwg, dxf, eml, gif, jpeg, jpg, msg, pdf, png, pps, ppsx, ppt, pptx, rar, tif, tiff, txt, xls, xlsx, zip', 'maxSize' => '15728640', 'allowEmpty' => true),
array('ficheiro', 'required', 'on' => 'create'),
array('titulo, ficheiro, ficheiro_original, descricao', 'safe', 'on' => 'search')
);
}
public function relations()
{
return array(
'repositorioficheirosacademias' => array(self::HAS_MANY, 'RepositorioFicheirosAcademias', 'repositorioficheirosId')
);
}
public function attributeLabels()
{
return array(
'id' => Yii::t('main', 'id'),
'titulo' => Yii::t('main', 'title'),
'descricao' => Yii::t('main', 'description'),
'data_criacao' => Yii::t('main', 'creation_date'),
'ficheiro' => Yii::t('main', 'file'),
'ficheiro_original' => Yii::t('main', 'file'),
'academiasId' => Yii::t('main', 'academiasRep')
);
}
public function search()
{
if(Yii::app()->user->checkAccess('administrator') || Yii::app()->user->checkAccess('superadmin'))
{
$strSearch = array('with' => array('repositorioficheirosacademias' => array()));
}
else
{
$userTmp = Users::model()->find('id = :userid AND block = :blockuser', array(':userid' => Yii::app()->user->id, ':blockuser' => 0));
$condition = 'repositorioficheirosacademias.academiasId = :idacademia OR repositorioficheirosacademias.academiasId = 0';
$params = array(':idacademia' => $userTmp->academiasId);
$strSearch = array('with' => array('repositorioficheirosacademias' => array('select' => 'repositorioficheirosacademias.id, repositorioficheirosacademias.academiasId, repositorioficheirosacademias.repositorioficheirosId',
'condition' => $condition,
'params' => $params)),
'together' => true);
}
$pageSize = Yii::app()->params['defaultPageSize'];
$criteria = new CDbCriteria($strSearch);
$criteria->compare('LOWER(data_criacao)', $this->data_criacao, true);
$criteria->compare('LOWER(titulo)', $this->titulo, true);
$criteria->compare('LOWER(descricao)', $this->descricao, true);
$criteria->compare('LOWER(ficheiro_original)', $this->ficheiro_original, true);
$sort = new CSort;
$sort->attributes = array('data_criacao',
'titulo',
'descricao',
'ficheiro_original');
$sort->defaultOrder = array('data_criacao' => true,
'titulo' => true,
'descricao' => true,
'ficheiro_original' => true);
return new CActiveDataProvider('RepositorioFicheiros', array('criteria' => $criteria,
'sort' => $sort,
'pagination' => array('pageSize' => $pageSize)));
}
public static function getAcademias($id)
{
$academias = array();
$resultado = "";
$todos = false;
foreach (RepositorioFicheirosAcademias::model()->findAll("repositorioficheirosId = :repositorioficheirosId", array(":repositorioficheirosId" => $id)) as $academia) {
if ($academia->academiasId == 0)
{
$todos = true;
}
else
{
$academias[] = Academias::model()->find("id = :id", array(":id" => $academia->academiasId))->nome;
}
}
sort($academias);
if ($todos)
{
$resultado = "Todos";
}
else
{
$resultado = implode(" ; ", $academias);
}
return $resultado;
}
}
This the widget call I make in the view.
$this->widget('zii.widgets.grid.CGridView', array('id' => 'repositorioficheiros-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'emptyText' => Yii::t('main', 'no results found'),
'summaryText' => ' ',
'columns' => array(array('name' => 'data_criacao',
'htmlOptions' => array('style' => 'text-align:center; width: 105px;')),
array('name' => 'titulo',
'type' => 'html',
'value' => ((Yii::app()->user->checkAccess('administrator') || Yii::app()->user->checkAccess('superadmin')) ? '"<a href=\'update/id/" . $data->id . "\'>" . $data->titulo . "</a>";' : '$data->titulo')),
array('name' => 'descricao'),
array('name' => 'ficheiro_original',
'type' => 'html',
'value' => '"<a href=\'download/" . $data->id . "\' target=\'_blank\'>" . $data->ficheiro_original . "</a>";'),
array('header' => Yii::t('main', 'academiasRepAdmin'),
'type' => 'raw',
'visible' => Yii::app()->user->checkAccess('administrator') || Yii::app()->user->checkAccess('superadmin'),
'value'=> 'RepositorioFicheiros::getAcademias($data->id)'),
array('class' => 'CButtonColumn',
'template' => ((Yii::app()->user->checkAccess('administrator') || Yii::app()->user->checkAccess('superadmin')) ? '{update} {delete}' : ''),
'updateButtonImageUrl' => '../images/edit.png',
'deleteButtonImageUrl' => '../images/delete.png',
'deleteConfirmation' => Yii::t('errorWarn', 'sure_delete_item')))));
In the fifth column of the grid I have the name of all franchisees to whom the file belongs that is built using the function getAcademias that is located on the model. The problem is that I don’t know how to use the filters to search in that field.
Can anyone help me?
Thanks!