Olá pessoal,
Gostaria de compartilhar um problema que, acredito eu, o framework deve contemplar uma solução.
Pois bem, vamos lá.
Em uma view de formulário temos geralmente (quando trata-se de interações com a base) uma model que extende a classe CActiveRecord.
Esta por sua vez instanciada na controller do programa que, após um render, envia esta ($model) à view.
Esta propriedade $model possui relacionamentos (relations).
Até aqui não ha novidades certo! Então vamos lá.
Já que estamos criando um formulário de interação com a base de dados, usamos a classe ‘CHtml’ para maior facilidade de manipulação de dados da base, em campos do formulário.
Estou fazendo uso do método CHtml::activeListBox($model,$attribute,[color="#008000"]$data[/color],$htmlOptions);
para imprimir um list de formulário.
Até aqui também não há crise, não é mesmo!
então beleza, meu problema:
O parametro [color="#008000"]$data[/color] pede o seguinte array:
[indent]array(
[indent]"valor_indice" => "valor_saida"[/indent]
)[/indent]
Legal, mas como fazer para montar este array de forma prática a partir de uma busca na base???
Bom eu fiz o seguinte:
Extendi a classe CHtml para fazer uso de seus métodos e criar novos para interagir com estes primeiros conforme minhas necessidades.
A classe:
<?
class phtml extends CHtml{
/**
* @example:
* $models = $model->model_sistema->model()->findAll();
* $dados = phtml::indiceValor($models,array("campo_indice","campo_valor"));
*
* @param $models
* @param $attributes
* @return array
*/
public static function indiceValor($models,$atributos)
{
if(is_array($atributos) && count($atributos) == 2){
$dados = array();
foreach($models as $obj){
$dados[$obj->getAttribute($atributos[0])] = $obj->getAttribute($atributos[1]);
}
return $dados;
}
throw new CHttpException(16,'Erro por isenção de atributos (CORE). phtml::indiceValor');
}
/**
* $models = $model->model_sistema->model()->findAll();
* echo phtml::ModelListagem(
* $models,
* array("cod_email_tipo","nome"),
* $model->email->email_tipo,
* "cod_email_tipo",
* array("size"=>1)
* );
* @param $models
* @param $atributos
* @param $model
* @param $attribute
* @param $htmlOptions
* @return CHtml::activeListBox
*/
public static function modelListagem($models,$atributos,$model,$attribute,$htmlOptions)
{
$dados = self::indiceValor($models,$atributos);
return parent::activeListBox($model,$attribute,$dados,$htmlOptions);
}
}
?>
Na view eu faço o seguinte para imprimir um list:
<div class="row">
<?
echo CHtml::activeLabelEx($model->email->email_tipo,'nome');
echo phtml::modelListagem(
$model->email->email_tipo->model()->findAll(),
array("cod_email_tipo","nome"),
$model->email->email_tipo,
"cod_email_tipo",
array("size"=>1)
);
?>
</div>
Bacana nehh, evito muito codigo na view usado o método "modelListagem" da minha nova classe, mas fica a pergunta no ar: O FRAMEWORK não teria estas facilidades já contempladas? Afinal de contas estamos falando em redução de scripts php na view certo?
Grande abraço.