Formatando dados para um Behavior

27 views
Skip to first unread message

Francis Rodrigues

unread,
Dec 27, 2013, 6:08:56 AM12/27/13
to yii-framew...@googlegroups.com
Olá, como vão?
A empresa onde eu trabalho desenvolveu um Behavior para logs que está usando um método getAttributes() dentro de um afterFind() para recuperar dados de um Model que naquele instante foi requisitado e gravou dados no banco. O problema é que esse getAttributes(), de acordo com a documentação recupera dados diretamente do banco de dados e mostram muitos índices nos logs e eu queria tratar esses dados antes de escrever esta tabela de log.

Como posso fazer isso?
Eu não encontrei nada relacionado a isso pesquisando na internet.

<?php
class LoggableBehavior extends CActiveRecordBehavior
{
       
private $_oldattributes = array();

       
public function afterSave($event)
       
{

                $newattributes
= $this->Owner->getAttributes();
                $oldattributes
= $this->getOldAttributes();
               
               
if (!$this->Owner->isNewRecord) {
                       
// compare old and new
                       
foreach ($newattributes as $name => $value) {
                               
if (!empty($oldattributes)) {
                                        $old
= $oldattributes[$name];
                               
} else {
                                        $old
= '';
                               
}

                               
if ($value != $old) {
                                        $log
=new LogTable();
                                        $log
->old_value = $old;
                                        $log
->new_value = $value;
                                        $log
->action = 'CHANGE';
                                        $log
->model = get_class($this->Owner);
                                        $log
->model_id = $this->Owner->getPrimaryKey();
                                       
// Conditions for primary key advanced for more one columns.
                                       
if(is_array($log->model_id))
                                                $log
->model_id = implode('#', $log->model_id);
                                        $log
->field = $name;
                                        $log
->stamp = date('Y-m-d H:i:s');
                                        $log
->user_id = $userid;
                   
                                        $log
->save();
                               
}
                       
}
       
// ...

       
public function afterFind($event)
       
{
               
// Save old values
                $this
->setOldAttributes($this->Owner->getAttributes());

               
return parent::afterFind($event);
       
}

       
public function getOldAttributes()
       
{
               
return $this->_oldattributes;
       
}

       
public function setOldAttributes($value)
       
{
                $this
->_oldattributes=$value;
       
}
}

Espero uma ajuda de vocês nesse processo.
Abraço.

Fábio Sales

unread,
Dec 27, 2013, 6:36:49 AM12/27/13
to yii-framew...@googlegroups.com
Caro,

Acho que você poderia tentar sobrescrever o método getAttributes() do CActiveRecord para filtrar essas informações indesejadas.

Atenciosamente,

Fábio Sales
Visite meu blog: http://www.tiradaruim.blogspot.com/


2013/12/27 Francis Rodrigues <tyler....@gmail.com>

--
YFB - Yii Framework Brasil
04/2011: Anexos de até 250kb foram autorizados pelos membros da lista. Use com moderação.
---
You received this message because you are subscribed to the Google Groups "YFB - Yii Framework Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to yii-framework-br...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/yii-framework-brasil/c20300ee-49e7-4e7a-860e-3f70aa292b8e%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Francis Rodrigues

unread,
Dec 27, 2013, 6:42:18 AM12/27/13
to yii-framew...@googlegroups.com
Fabio, o problema é como não fazer gambiarra no Behavior para recuperar esses dados.
Eu gostaria que o behavior buscasse os dados do Model que o requisitou e buscasse os tratamentos do método afterFind() também, mas este eu não sei fazer.
Não encontrei isso em lugar algum.

Ainda estou a procura. Se souberem de algo, agradeceria muito em ajudar.

Fábio Sales

unread,
Dec 27, 2013, 6:50:39 AM12/27/13
to yii-framew...@googlegroups.com
Francis,

Entendi. Já que você não quer implemementar no behavior, você não poderia criar uma classe intermediária entre os models que utilizam o behavior e o CActiveRecord, sobrescrevendo esse método? Nesse caso faria todos os models herdarem da classe intermediária, sendo que esta ultima herdaria de CActiveRecord.

Atenciosamente,

Fábio Sales
Visite meu blog: http://www.tiradaruim.blogspot.com/


2013/12/27 Francis Rodrigues <tyler....@gmail.com>
Fabio, o problema é como não fazer gambiarra no Behavior para recuperar esses dados.

--
YFB - Yii Framework Brasil
04/2011: Anexos de até 250kb foram autorizados pelos membros da lista. Use com moderação.
---
You received this message because you are subscribed to the Google Groups "YFB - Yii Framework Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to yii-framework-br...@googlegroups.com.

Francis Rodrigues

unread,
Dec 27, 2013, 9:05:31 AM12/27/13
to yii-framew...@googlegroups.com
Fabio, fiz quase isso.
Sobrescrevi uma função dentro do próprio model.
Agora que fui entender que o $this->Owner vai recuperar o objeto do model, então pensei nessa idéia:

In model add code:

public function getFormatAttributes() {
        $model
= new DMConexao;
        $model
->attributes = $this->getAttributes();

        $model
->principal = ($model->principal == 'S') ? 'Sim' : 'Não';
        $model
->ativo = ($model->ativo == '1') ? 'Sim' : 'Não';
       
$model->data_alteracao = date('Y-m-d H:i:s', strtotime($model->data_alteracao));

        $model
->id_conexao = $this->id_conexao;
       
return $model->attributes;
}


No behavior alterar o código:
getAttributes()

por
getFormatAttributes();
2013/12/27 Francis Rodrigues <tyler....@gmail.com>
To unsubscribe from this group and stop receiving emails from it, send an email to yii-framework-brasil+unsub...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages