Problemas Ao Usar $_Get


(Jcdeadbody) #1

Ola! Estou com alguns problemas para usar formulários na view configurados como:


<?php $form=$this->beginWidget('CActiveForm', array(

	'action'=>Yii::app()->createUrl($this->route),

	'method'=>'get',

)); ?>

A seguinte mensagem de erro está sendo mostrada:


PHP notice


Undefined index: opcoes_busca


C:\Program Files (x86)\EasyPHP-12.1\www\Empresa\protected\controllers\ClienteController.php(202)

Ela está sendo mostrada quando eu clico no botão Clientes em meu menu principal:


<div id="mainmenu">

		<?php $this->widget('zii.widgets.CMenu',array(

			'items'=>array(

				array('label'=>'Clientes', 'url'=>array('/cliente/index')),

				),

		)); ?>

	</div><!-- mainmenu -->

Na minha view há um dropDownList com as opções de busca e um TextField para inserir um valor da busca. No meu Controler na action index o código é esse:


public function actionIndex(){            

    $cliente=new Cliente('search');

    $tipo=$_GET['opcoes_busca'];


    switch ($tipo){

    case 1:

        $cliente->nome=$_GET['valor_busca'];

        break;

    case 2:

        $cliente->cpf=$_GET['valor_busca'];

        break;

    case 3:

        $cliente->razao_social=$_GET['valor_busca'];

        break;

    case 4:

        $cliente->cnpj=$_GET['valor_busca'];

        break;

    default:                

        $cliente->unsetAttributes();

    }


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

                'dataProvider'=>$cliente->search(),

                'cliente'=>$cliente,

        ));

}

Alguém tem idéia do porque dá esse erro? Posso estar errado, mas acho que tem alguma coisa relacionada com a url, pois quando eu comento as partes do código que possuem $_GET[] e clico no menu, ele funciona corretamente, depois, já dentro da pagina cliente/index eu descomento o código e tento fazer uma busca usando o formulário, ele faz ela direitinho e se nesse mesmo momento eu clico no botão Clientes do menu principal ele mostra o erro novamente. Algém pode me ajudar ?


(Newerton Araujo) #2

Deadbody,

Esse erro e do PHP, deve está configurado para mostrar que uma váriavel não foi inicializada.

Faz assim:


$tipo = isset($_GET['opcoes_busca']) ? $_GET['opcoes_busca'] : '';


(Jcdeadbody) #3

Newerton,

Eu fiz a alteração que você sugeriu e realmente funcionou, obrigado. Mas eu preciso entender algumas questões sobre o erro. Com as alterações o código ficou assim:

Controller(Cliente)/Action(index):


public function actionIndex(){

    $cliente=new Cliente('search');

    $tipo = isset($_GET['opcoes_busca']) ? $_GET['opcoes_busca'] : '';

    if($tipo!=''){

    switch ($tipo){

    case 1:

        $cliente->nome=$_GET['valor_busca'];

        break;

    case 2:

        $cliente->cpf=$_GET['valor_busca'];

        break;

    case 3:

        $cliente->razao_social=$_GET['valor_busca'];

        break;

    case 4:

        $cliente->cnpj=$_GET['valor_busca'];

        break;

    default:

        $cliente->unsetAttributes();

    }

}


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

                'dataProvider'=>$cliente->search(),

                'cliente'=>$cliente,

        ));

}

Bom, vamos as dúvidas:

[list=1]

[*]A minha view index possui um renderPartial de uma página chamada _search que contém um formulário, então após o carregamento eu tenho o formulário de busca da página _search e um CListView na mesma página,certo?

[*]Quando ela é apresentada pela primeira vez não da pra fazer $_get nesse momento pois todos os campos estão vazios, por isso a função isset() para ver se o campo está vazio, certo?

[*]Quando eu clico no botão de busca(‘submit’), ele atualiza a página e executa a action index novamente ?

[*]Usando script em Jquery que usa ajax para executar essa busca(aquele mesmo gerado automaticamente pelo gii que fica na view admin.php, "Advantage search") também atualiza a página toda, o que acontece por traz de fato?

[/list]

Desde já agradeço…


(Newerton Araujo) #4

Deadbody,

A minha view index possui um renderPartial de uma página chamada _search que contém um formulário, então após o carregamento eu tenho o formulário de busca da página _search e um CListView na mesma página,certo?

Certo.

Quando ela é apresentada pela primeira vez não da pra fazer $_get nesse momento pois todos os campos estão vazios, por isso a função isset() para ver se o campo está vazio, certo?

Certo, nos parametros do php.ini tem o error_reporting, que deve está definido para mostrar as váriaveis não inicializada. Mais isso não impende do funcionamento do sistema.

Quando eu clico no botão de busca(‘submit’), ele atualiza a página e executa a action index novamente ?

Correto.

Usando script em Jquery que usa ajax para executar essa busca(aquele mesmo gerado automaticamente pelo gii que fica na view admin.php, "Advantage search") também atualiza a página toda, o que acontece por traz de fato?

Na verdade ele não atualiza a página toda, ele atualiza somente o CListView, e que você alterou o actionIndex do padrão, e deve ser por isso que ele está atualizando a página, por que não usa o index padrão, por que você criou aquele switch?


(Jcdeadbody) #5

Newerton,

Eu alterei o actionIndex padrão pois tive de incluir uma lógica de busca que inclui um switch para capturar o tipo de busca escolhido pelo usuário para somente após procurar o valor solicitado:


<?php

Yii::app()->clientScript->registerScript('trocar_tipo_pessoa_cliente', "




$('body').on('change', 'select#opcoes_busca', function(){

        var id = $(this).val();

		if(id != 0){                           

                    $('#valor_busca').removeAttr('disabled');                 

                   

		}else{

                    $('#valor_busca').attr('disabled','disabled');

                }

});

$('#resetar').click(function(){

    $('#valor_busca').attr('disabled','disabled');

    $('#valor_busca').val('');

    $('#opcoes_busca').attr('selected',0);

    location.reload();


	

	}

);

");

?>


<b>Busca de clientes</b><br/>

<hr/>


<div class="form">


<?php

$form = $this->beginWidget('CActiveForm', array(

    'action' => Yii::app()->createUrl($this->route),

    'method' => 'get',

        ));

?>

    <div style="float: left;padding: 0 10px 0 0; position: relative">

        <?php

        $opcoes_busca = array(

            0 => 'Selecione',

            1 => 'Nome',

            2 => 'CPF',

            3 => 'Razão Social',

            4 => 'CNPJ'

        );

        ?>

        <?php echo CHtml::label(CHtml::encode('Tipo de busca'), 'opcoes_busca'); ?>

        

        <?php

        echo CHtml::dropDownList('opcoes_busca', '', $opcoes_busca, array(

            'id' => 'opcoes_busca',

            'options' => array(0 => array('selected' => 'selected')),

        ));

        ?>

    </div>

    <div style="float: left;padding: 0 10px 0 0; position: relative">

        <?php echo CHtml::label(CHtml::encode('Valor procurado'), 'valor_busca'); ?>

        <?php

        echo CHtml::textField('valor_busca', '', array(

            'id' => 'valor_busca',

            'disabled' => 'disabled'

        ));

        ?> 

    </div>

    <div style="float: left;padding-top:17px; position: relative">

<?php echo CHtml::submitButton('Pesquisar'); ?>

<?php echo CHtml::resetButton('Limpar', array('id' => 'resetar')); ?>

    </div>

    <div style="clear: left"></div>

<?php $this->endWidget(); ?>

Na view há um combobox com os tipos de busca e um campo para inserir o valor para a busca. Gostaria de saber se há alguma forma mais interessante de criar essa busca.

Uma outra questão que me ocorreu, nessa minha solução para a busca os tipos de busca são 4 atributos diferentes do mesmo model "Cliente", o controlador que estou trabalhando agora é o ClienteController. A forma como modelei: um "Cliente::model()" possui um "Endereco::model()" que por sua vez possui um "Municipio::model()". Se eu incluisse na minha logica de busca a opção de busca por cidade, como eu faria para esse "model->serch()" retornar Objetos "Cliente"?