filtros no preload - checar se existe dados em tabela

Bom dia

Meu primeiro post, comecei agora a testar o yii (ontem), e não estou conseguindo entender/fazer uma verificação e redirecionar para uma msg de erro, no caso pra render partial…

um exemplo simples, estados / cidades

pra cadastrar cidades a aplicação precisa de um estado (FK)

crio no model Estados o que busca os dados pro dropdown, até ai tudo ok, eu queria fazer que ao tentar rodar o create / update (talvez desnecessário) de cidades, checasse se existe algum registro na tabela estados, caso não tenha, eu direciono a um partial render com a mensagem de erro e o link para o crud dependente (estado) e vazio até então.

no model eu criei esse metodo que "cria" o dropdown, mas os filters no controller cidades não faço a mínima idéia, já li o manual e confesso que não compreendi muito bem…




public function getEstadosOptions()

        {

                $criteria=new CDbCriteria;

                $criteria->select='id,desc_estado';

                $criteria->order = 'desc_estado';


                $dados = self::model()->findAll($criteria);


                if(count($dados) == 0) {

                    $this->_error = true;

                }


                $ret = array(''=>' -- Selecione -- ');

                foreach($dados as $reg){

                        $ret[$reg->id] = $reg->desc_estado;

                }

                return $ret;

        }



se alguém puder ajudar, dar uma luz, o caminho das pedras eu agradeço :)

Cara, não precisa de tudo isso não! ;D

Basta apenas:




<?php echo CHtml::activeDropDownList($usuario, 'id_estado', CHtml::listData($estados, 'id', 'desc_estado'), array('prompt'=>'Selecione um Estado')); ?>



Nesse caso, $estados é um vetor com todos os estados no banco de dados.

Como os values do DropDown são ids que JÁ EXISTEM no banco de dados, não há necessidade de filtro, ou qualquer outra verificação para verificar se já existe esse estado no banco.

Note que esse trecho de código, deve ficar na view. Nesse caso, uma suposta página de cadastro de usuários, onde $usuario é o modelo e id_estado é chave estrangeira nesse modelo, que armazena o id do estado selecionado.

Davi obrigado pela resposta, muito legal o caso de popular o dropdown, mas a questão do filtro seria, caso não existirem dados na tabela, tabela estados vazia por exemplo, usei estados por ser mais intuitivo, mas por exemplo poderia ser laboratórios / medicamentos, é pra faze inicial de uma aplicação. caso não exista nenhum dado na tabela e sendo uma FK e dependente precisa ter algum dado no dropdown :)

mas eu to é confundindo também… posso criar um view warning e verificar direto no action do controller e mandar renderizar algo como:

" Para cadastrar um medicamento precisa-se ter laboratórios cadastrados (e o link pro create de laboratório no caso) "

Mas valeu, já me ajudou a entender mais algumas coisas… essa possibilidade de passar o "prompt" diretamente não tinha visto …

Cara, acho que entendi o que você quer fazer, apesar do seu texto estar muito confuso ;)

Acho que uma view, só para esse warning não é necessário, além de são ser muito interessante se pensarmos na usabilidade do site.

Um opção, seria utilizar uma flash message (http://www.yiiframework.com/doc/cookbook/21/) para informar o usuário.

Outra opção seria um formulário mais elaborado, onde, caso não exista o item (por exemplo laboratório), o usuário possa cadastra-lo no mesmo formulário que o medicamento. Muito mais legal, principalmente no ponto de vista da usabilidade. ;D

Isso é bastante simples de se fazer. Abaixo um tutorial do cookbook, que mostra como pode ser feito:

http://www.yiiframework.com/doc/cookbook/19/

Se eu fosse vc faria bem mais simples: mostra o dropdown dos estados e, ao lado dele, adiciona um link pro estado/create.

Se a lista estiver vazia, o usuario clica no link para ir ao CRUD de estados. Simples, sem complicar muito.

Davi, é verdade, tá bem confuso o meu texto… hehe

mas era isso mesmo… vou fazer com a opção de cadastrar um laboratório sem sair do formulário de medicamento, bem melhor para o usuário com certeza…

Obrigado mais uma vez!