Bom dia pessoal, estou com um problema ha um bom tempo, já tentei por vários tópicos existentes no fórum e nada. Na listagem das news, gostaria de listar os pageslot e nesta coluna do pageslot, queria colocar uma combo para filtro populada com todos os pageslot. Foram muitas as tentativas sem sucesso, segue abaixo uma delas:
//news model
function relations(){
return array(
'newsPublications'=>array(self::HAS_MANY,'newsPublication','news_id'),
'pageSlots'=>array(self::HAS_MANY,'newsPageSlot','pageslot_id','through'=>'newsPublications'),
);
}
primeiro teste se o relacionamento funciona e veja se a query gerada está correta
pra habilitar o log das querys adicione na config do db enableProfiling como true e enableParamLogging como true e habilite o log
o método search deve ter algo como isto:
//na model adicione o campo / propriedade slotName
public $slotName;
//metodo search
$criteria->select='t.*,pageSlots.name as slotName';
$criteria->compare('pageSlots.name',$this->slotName);
$criteria->with=array('pageSlots');
e o filter deve ser apenas
array(
'name'=> 'slotName',
'filter'=>//como estava
),
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->with = array('user', 'segmentation', 'newsPublications', 'newsPageSlots');
# o "t" faz referência a tabela principal, para poder fazer o filtro
$criteria->compare('t.id',$this->id,true);
$criteria->compare('title',$this->title,true);
$criteria->compare('summary',$this->summary,true);
$criteria->compare('summary2',$this->summary2,true);
$criteria->compare('body',$this->body,true);
$criteria->compare('author',$this->author,true);
$criteria->compare('summaryimage_id',$this->summaryimage_id,true);
$criteria->compare('bodyimage1_id',$this->bodyimage1_id,true);
$criteria->compare('bodyimage2_id',$this->bodyimage2_id,true);
$criteria->compare('bodyimage3_id',$this->bodyimage3_id,true);
$criteria->compare('bodyimage4_id',$this->bodyimage4_id,true);
$criteria->compare('bodyimage5_id',$this->bodyimage5_id,true);
$criteria->compare('summarycaption',$this->summarycaption,true);
$criteria->compare('bodycaption1',$this->bodycaption1,true);
$criteria->compare('bodycaption2',$this->bodycaption2,true);
$criteria->compare('bodycaption3',$this->bodycaption3,true);
$criteria->compare('bodycaption4',$this->bodycaption4,true);
$criteria->compare('bodycaption5',$this->bodycaption5,true);
$criteria->compare('t.created_at',$this->created_at,true);
$criteria->compare('t.updated_at',$this->updated_at,true);
$criteria->compare('status_id',$this->status_id,true);
$criteria->compare('user_id_review',$this->user_id_review,true);
$criteria->compare('note_review',$this->note_review,true);
$criteria->compare('date_review',$this->date_review,true);
// 3º parametro false (default) pois deve considerar o valor exato para combos
$criteria->compare('t.active',$this->active);
// combos
$criteria->compare('user.id', $this->user_id);
$criteria->compare('segmentation.id', $this->segmentation_id);
$criteria->compare('pageslot_id', NewsPublication::model()->getPublicationNews( $this->id )->pageslot_id);
$criteria->select='t.*,newsPageSlots.name as slotName';
$criteria->compare('newsPageSlots.name', $this->slotName);
return new CActiveDataProvider(get_class($this), array(
'criteria'=>$criteria,
'sort' => array('defaultOrder' => 'title'),
));
}
Sobre o log, tive que inclui ‘class’=>‘CWebLogRoute’ para funcionar
Deve ser por causa do relacionamento, que é o meu maior problema aqui, news possui segmentation_id, porem pageslot_id está em news_publication, onde news_publication possui news_id.
Bom, a combo apareceu, mas agora o problema é o relacionamento citado no primeiro post, como ficaria na model News de acordo com o DER que postei?
Opa, funcionou, porém agora nao sei como enviar para a model o valor selecionado no filtro. Quando seleciono um valor no filtro, a combo perde o valor:
Realmente não estava, mas coloquei, o filtro funciona, mas a combo nao mantém o valor.
public function rules()
{
return array(
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('slotName', 'safe', 'on'=>'search'),
);
}
Isso mesmo cara , quase lá. Agora gerou um problema estranho, na pagina 1 da grid filtra perfeitamente, mas na pagina 2 ocorre o seguinte erro:
PHP Error [2]
htmlspecialchars() expects parameter 1 to be string, array given (C:\Users\fabio.policeno\Documents\PHP\xampp\htdocs\EspiralEducadoraEF1\Dev\yii\framework\web\helpers\CHtml.php:66)
não saberia te dizer o que é, mas na action search veja os valores que está recebendo por get e que vão pra model, por algum motivo um desses valores está vindo como array
Em cada models sempre crio uma função para guardar as informações do banco, assim:
public static function listEscolaridade($withName = true) {
$list = array();
$models = self::model()->findAll('idescolaridade!="9999"');
foreach ($models as $model) {
$list[$model->idescolaridade] = $withName ? $model->descricao : $model->descricao;
}
return $list;
}
Na função search() deixo da mesma forma
public function search() {
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria = new CDbCriteria;
$criteria->compare('idescolaridade', $this->idescolaridade);
$criteria->compare('descricao', $this->descricao, true);
return new CActiveDataProvider('escolaridade', array(
'criteria' => $criteria,
));
}