Yii Framework Forum: CHtml:: - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

CHtml:: Como utilizar de maneira fácil Rate Topic: -----

#1 User is offline   webd 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 4
  • Joined: 09-February 10

Posted 26 February 2010 - 11:02 PM

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,$data,$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 $data pede o seguinte array:
array(
"valor_indice" => "valor_saida"

)

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.
0

#2 User is offline   tuga 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 69
  • Joined: 02-January 10

Posted 01 March 2010 - 04:32 AM

View Postwebd, on 26 February 2010 - 11:02 PM, said:

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,$data,$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 $data pede o seguinte array:
array(
"valor_indice" => "valor_saida"

)

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
0

#3 User is offline   webd 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 4
  • Joined: 09-February 10

Posted 16 March 2010 - 08:46 AM

View Posttuga, on 01 March 2010 - 04:32 AM, said:

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;
        }        
}


0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users