28/12/2009

Framework Yii : Utilizando DropDownList

yii_dropDowList As DropDownList são um dos recursos que mais utilizamos nos formulários e como tal vou mostrar como criar dinamicamente as dropdowList na Framework Yii.
Na framework yii os métodos de criação de elementos de visualização HTML estão na classe estática  CHtml e como tal a  DropDownList não é excepção , se verificar na documentação da yii existem dois métodos para a criação destas listas temos o dropDownList() que permite criar dropdowslist html simples sem associação a model e a activeDropDownList() esta sim associada a um model.
  • CHtml::dropDownList()
public static function dropDownList($name,$select,$data,$htmlOptions=array())
Onde :$name é o nome da lista, $select valor seleccionado ,$data array com os dados do tipo chave valor, $htmlOptions array das opções de Html bem como também definição do texto a mostrar no caso de permitir elemento vazio.
Neste primeiro exemplo é criado uma combobox  com o nome 'Meunome' para escolher o sexo onde $selecionado é o que é apresentado caso seja vazio então mostrado o valor da opção 'empty'  nas opções html.
echo CHtml::dropDownList('Meunome', $selecionado,array('M' => 'Masculino', 'F' => 'Feminino'),array('empty' => 'Escolha o sexo'));

Agora caso queira gerar os valores das opções dinamicamente do seu model tambem o poderá fazer basta recorrer ao método listData devolve uma lista do tipo chave, valor que pode ser usada na dropDownList.

$lista = CHtml::listData($model,'sexo_id', 'sexo_nome');
echo CHtml::dropDownList('Meunome', $selecionado,$lista ,array('empty' => 'Escolha o sexo'));
  • CHtml::activedropDownList()
public static string activeDropDownList(CModel $model, string $attribute, array $data, array $htmlOptions=array ( ))

Neste primeiro exemplo é uma DropDownList simples para escolha do sexo quando do submit deste formulário no atributo sexo via ter um dos 3 possíveis valores M,F ou vazio .

echo CHtml::activeDropDownList($model,'sexo',array('M'=>'Masculino','F'=>'Feminino'),array('empty'=>'Escolha o sexo'))

Este exemplo é um pouco mais complexo mas a grande diferença é que os valores que o nosso atributo ‘tipo_cliente’ pode conter vem da tabela tipo_cliente onde o valor que assume é o id e o que é mostrado é o nome

$lista =CHtml::listData(tipo_cliente::model()->findAll(), 'id', 'nome');
echo CHtml::activeDropDownList($model,'tipo_cliente',$lista,array('empty'=>'Escolha o tipo de cliente')); 
  • Listas dropDown dependentes
E para concluir só dar uma visão geral como construir DropDownList  desdentes ou seja os valores de uma dependa da selecção da outra:
Criamos a nossa dropDownList e nas opções de html vamos inserir a chave ‘ajax’ as opções desta chave são as mesma do jquery pois a yii vai  gerar código jquery , no nosso caso vai fazer um pedido ao nosso controlo e este irá devolver as opções da lista a actualizar  que actualizará as opções dessa lista.

echo CHtml::dropDownList('pais_id','', array(1=>'PORTUGAL',2=>'BRASIL',3=>'ANGOLA'),
array(
'ajax' => array(
'type'=>'POST', //Tipo de pedidos outra alternativa GET
'url'=>'cidadesDinaminas', //url para chamar
'update'=>'#cidade_id', // Selector jquery da combo a actualizar)));

//dropDownList a ser actualizada
echo CHtml::dropDownList('cidade_id','', array());

// metodo do controlo que será chamado
public function actionCidadesDinaminas() 
{ 
$data=Location::model()->findAll('parent_id=:parent_id',array(':parent_id'=>(int) $_POST['pais_id']));     $data=CHtml::listData($data,'id','nome'); 
foreach($data as $value=>$nome) 
{ 
echo CHtml::tag('option',array('value'=>$value),CHtml::encode($nome),true); 
}
}

Recursos complementares:

Sem comentários: