CHtml::

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.

Olá webd,

Pelo teu código não vi grande necessidade de extenderes a classe CHtml.

Pelo que percebi do que pretendias fazer acho poderias usar o listData.

No teu caso eu fazia o seguinte:




//controller

$model = Tabela::model()->findAll();//ou os dados que necessitares para a listagem, esta parte não percebi bem, pelo teu código

$modelListagem = CHtml::listData($model,'cod_email_tipo','nome' ); //listData(dados,valor para listagem, nome para listagem

$this->render('view',array(

'model'=>$model,

'modelListagem'=>$modelListagem));



Na view




<div class="row">

                <? echo CHtml::activeLabelEx($model->email->email_tipo,'nome'); ?>

                <? echo CHtml::activeListBox($model, 'cod_email_tipo', $modelListagem); ?>

        </div>



Espero ter ajudado. Mas como já disse não percebo muito disto, estou ainda aprendendo.

Abraço

Olá Tuga, mais uma vez obrigado pela força, mas realmente senti a necessidade de estender a CHTML para utilizar de forma mais prática as funcionalidades desta classe, até mesmo, achei melhor extende-la a partir da Classe EHtml geradora de erros integrada com Jquery (client side).

Segue a classe de view:





<?


class VHtml extends EHtml{

	

	public static function printR($data){

		print "<pre>";

		print_r($data);

		print "</pre>";

	}

        public static function indiceValor($rs, $indiceValor)

        {	

            if(is_array($indiceValor) && count($indiceValor) == 2){

                       $dados = array(""=>"Selecione uma opção");

                       if(is_a($rs,"CActiveRecord") && count($rs)==1){

	                       $dados[$rs->getAttribute($indiceValor[0])]=$rs->getAttribute($indiceValor[1]);

                       }else if(count($rs)>1){

                       	   foreach($rs as $row){

	                       		$dados[$row->getAttribute($indiceValor[0])]=$row->getAttribute($indiceValor[1]);

	                       }

                       }

                       return $dados;

                }

                throw new CHttpException(16,'Erro por isenção de atributos (CORE). phtml::indiceValor');

        }

        

		public static function activeAutoListAll($model,$stringModel,$indiceValor,$campo,$htmlOptions)

        {	

        		$instance	=	new $stringModel;

        		$rs			=	$instance->model()->findAll();

        		$dados	=	self::indiceValor($rs,$indiceValor);

                return CHtml::activeListBox($model,$campo,$dados,$htmlOptions);

        } 

        

		public static function label_activeAutoListAll_error($model,$stringModel,$indiceValor,$campo,$htmlOptions)

        {	

        		$instance	=	new $stringModel;

        		$rs			=	$instance->model()->findAll();

        		$dados		=	self::indiceValor($rs,$indiceValor);

        		$string		=	CHtml::activeListBox($model,$campo,$dados,$htmlOptions);

        		return 			self::labelEx_recheio_error($string,$model,$campo);

        }

        


		public static function label_eActiveAutoListAll_error($model,$stringModel,$indiceValor,$campo,$htmlOptions)

        {	

        		$instance	=	new $stringModel;

        		$rs			=	$instance->model()->findAll();

        		$dados		=	self::indiceValor($rs,$indiceValor);

        		$string		=	EHtml::activeListBox($model,$campo,$dados,$htmlOptions);

        		return 			self::labelEx_recheio_error($string,$model,$campo);

        }

              

        public static function activeAutoList($model,$rs,$indiceValor,$campo,$htmlOptions)

        {

        		$dados	=	self::indiceValor($rs,$indiceValor);

                return CHtml::activeListBox($model,$campo,$dados,$htmlOptions);

        }

        

		public static function label_text_error($model,$campo,$htmlOptions="",array $itens = array(1,1,1)){

			$string = "";

			if(isset($itens[1]) && $itens[1]==1){

				$string .= CHtml::activeTextField($model,$campo,$htmlOptions);

			}

			return self::labelEx_recheio_error($string,$model,$campo,$itens);

        }

        

		public static function label_etext_error($model,$campo,$htmlOptions,array $itens = array(1,1,1)){

			$string = "";

			if(isset($itens[1]) && $itens[1]==1){

				$string .= EHtml::activeTextField($model,$campo,$htmlOptions);

			}

			return self::labelEx_recheio_error($string,$model,$campo,$itens);

        }

        

		public static function label_CheckBox_error($model,$campo,$htmlOptions="",array $itens = array(1,1,1)){

			$string = "";

			if(isset($itens[1]) && $itens[1]==1){

				$string .= CHtml::activeCheckBox($model,$campo,$htmlOptions);

			}

			return self::labelEx_recheio_error($string,$model,$campo,$itens);

        }

        

		public static function label_autoListAll_error($model,$stringModel,$indiceValor,$campo,$htmlOptions,array $itens = array(1,1,1)){

			$string = "";

			if(isset($itens[1]) && $itens[1]==1){

				$string .= self::activeAutoListAll($model,$stringModel,$indiceValor,$campo,$htmlOptions);

			}

			return self::labelEx_recheio_error($string,$model,$campo,$itens);

        }

        

		public static function label_autoList_error($model,$rs,$indiceValor,$campo,$htmlOptions,array $itens = array(1,1,1)){

			$string = "";

			if(isset($itens[1]) && $itens[1]==1){

				$string .= CHtml::activeAutoList($model,$rs,$indiceValor,$campo,$htmlOptions);

			}

			return self::labelEx_recheio_error($string,$model,$campo,$itens);

        }

        

		public static function label_list_error($model,$campo,$dados,$htmlOptions,array $itens = array(1,1,1)){

			$string = "";

			if(isset($itens[1]) && $itens[1]==1){

				$string .= CHtml::activeListBox($model,$campo,$dados,$htmlOptions);

			}

			return self::labelEx_recheio_error($string,$model,$campo,$itens);

        }

        

		public static function label_textArea_error($model,$campo,$htmlOptions="",array $itens = array(1,1,1)){

			$string = "";

			if(isset($itens[1]) && $itens[1]==1){

				$string .= CHtml::activeTextArea($model,$campo,$htmlOptions);

			}

			return self::labelEx_recheio_error($string,$model,$campo,$itens);

        }

        

        private function labelEx_recheio_error($recheio,$model,$campo,$itens = array(1,1,1)){

        	$string = "";

        	if(isset($itens[0]) && $itens[0]==1){

				$string .= CHtml::activeLabelEx($model,$campo);

			}

			if(isset($itens[1]) && $itens[1]==1){

				$string .= $recheio;

			}

			if(isset($itens[2]) && $itens[2]==1){

				$string .= CHtml::error($model,$campo);

			}

			return $string;

        }        

}