Creare moduli "strani" con Yii




            <?php

                echo CHtml::beginForm(

                        array('ciao/mondo', 'ciao' => 'asdf', 'aaswdf', 'aw'),

                        'get',

                        array('id' => 'asd')

                );

            ?>

            <?php echo CHtml::textField('nome'); ?>

            <?php echo CHtml::endForm(); ?>



Sapete spiegarmi perchè questo codice genera




<form id="asd" action="/blog/index.php?r=ciao/mondo&amp;ciao=asdf&amp;0=aaswdf&amp;1=aw" method="get">

<div style="display:none">

<input type="hidden" value="ciao/mondo" name="r" /> 

<input type="hidden" value="asdf" name="ciao" />

<input type="hidden" value="aaswdf" name="0" />

<input type="hidden" value="aw" name="1" />

</div>

<input type="text" value="" name="nome" id="nome" />

</form>



mentre questo (cambio solo il metodo da GET a POST):




           <?php

                echo CHtml::beginForm(

                        array('ciao/mondo', 'ciao' => 'asdf', 'aaswdf', 'aw'),

                        'post',

                        array('id' => 'asd')

                );

            ?>

            <?php echo CHtml::textField('nome'); ?>

            <?php echo CHtml::endForm(); ?>



genera queest’altro codice?




<form id="asd" action="/blog/index.php?r=ciao/mondo&amp;ciao=asdf&amp;0=aaswdf&amp;1=aw" method="post">

<input type="text" value="" name="nome" id="nome" />

</form>



Perchè usando il metodo GET è necessrio esplicitare sia i dati del form che i parametri utili a determinare il percorso di elaborazione del form in Yii.

Anche in questo caso, facciamo un passo indietro con la spiegazione.

Sia nel metodo POST che nel metodo GET hai la necessità di indicare l’URL dello script che elaborerà la richiesta e gli eventuali PARAMETRI da sottoscrivere.

Ora, il metodo GET ed il metodo POST gestiscono l’URL ed i PARAMETRI in maniera differente.

L’URL che vuoi richiamare è


/blog/index.php?r=ciao/mondo&amp;ciao=asdf&amp;0=aaswdf&amp;1=a

Col metodo POST funziona, col metodo GET no. Perchè?

Nel metodo POST tutto ciò che è stato specificato nell’attributo ACTION del FORM è considerato come l’URL. Nel metodo GET no: l’URL finisce a


/blog/index.php

Nel metodo GET tutto ciò che segue il punto interrogativo corrisponde alla lista dei parametri da inviare allo script. Quei parametri però vencono "costruiti" dal browser alla sottoscrizione del form e accodati allo script blog/index.php?.. (Il metodo GET funziona proprio così)

A Yii però servono i parametri che definiscono il controllore e l’azione, ecco perchè nel metodo GET bisogna “fissarli” con gli elementi nascosti del form. Così quando il browser “assemblerà” l’url da richiamare userà i parametri nascosti (oltre al resto del form).

In effetti, nella generazione automatica dei form in modalità GET, è totalmente inutile aggiungere i parametri che definiscono il percorso Yii all’interno di ACTION. Non capisco perchè non l’hanno rimossa come cosa.

Ti consiglio di fare qualche esperimento ;)

Quello che non mi sembra corretto, è proprio il fatto che se sono in post ho le stesse variabili in campi hidden ed anche nel get. Io non ho detto di volerle sia nel get che nel post. Mi sembra scorretto che ci siano dei doppioni. Non trovi?

Scusami, ma non ti seguo (sarà l’orario). Nel form generato in modalità POST non hai le variabili hidden.

Il problema è nel get: appaiono sia nell’action che come campi hidden quindi sia come campi post che get.

Si infatti :)

Forse si tratta di qualche problema con i browser.

Puo’ darsi che esistano browser che accettano solo l’url come get ed altri che accettano solo i campi hidden, per questo ci sono dei doppioni.

Nel caso del post non ci sono problemi: la roba specificata nell’url va in get, quella nei campi va in post.