[yii2] Due submit per un unico form

Salve,

Vi sottopongo questa problematica.

Sto sviluppando un sistema per registrazione fatture/emissione di fatture in PDF.

Ho un form dove inserisco i dati della fattura e vorrei fare in modo che aggiungendo un tasto ANTEPRIMA, sia possibile recuperare i dati del form per generare un anteprima del documento in PDF (eseguendo una action diversa con gli stessi dati presenti nelle celle).

ho provato ad inserire nel form

<?= Html::submitButton(‘Anteprima’, [‘class’ => ‘btn btn-info’, ‘Name’ => ‘PreviewButton’]) ?>

e nel controller

if(isset($_POST["PreviewButton"])) {esegui anteprima}

ma non mi funziona (non mi legge l’array $_POST in generale…)

Grazie!

Per prima cosa verificherei il motivo per cui non arrivano i dati in POST.

Ciao

Ho inserito una textbox nel form ed ho cercato di stampare a video il contenuto con

echo $_POST[“miatextbox”] nell’action, ma nulla, mi da errore già quando carico la pagina “Undefined index”

l’array $_POST è proprio vuoto non capisco dove sbaglio, forse la logica di yii2 di come invia il contenuto del form al controller? non può essere letto da $_POST[“nomecampo”] ?

Posta un pò di codice così si può vedere, sia della view che dell’action del controller.

_form.php




use yii\helpers\Html;

use yii\bootstrap\ActiveForm;

use yii\helpers\Json;

use yii\helpers\ArrayHelper;


use backend\controllers\FactotumAnagraficheController;

use backend\models\FactotumDocumenti;


?>


<div class="factotum-documenti-form">


    <?php $form = ActiveForm::begin(['id' => 'dynamic-form']); ?>

<?= $form->field($model, 'Intestazione')->textarea(['rows' => 6]) ?>

    <?= $form->field($model, 'Intestazione')->textarea(['rows' => 6]) ?>

    <?= $form->field($model, 'Destinazione')->textarea(['rows' => 6])->label('Destinazione Merce') ?>


[...]


<input type="text" name="campotest" value="prova">


[...]


<div class="form-group">

        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

        

        <?= Html::submitButton('Anteprima', ['class' => 'btn btn-info', 'Name' => 'PreviewButton']) ?>

       

    </div>


        

    <?php ActiveForm::end(); ?>


</div>




controller





public function actionCreadocumento()

    {


        $model = new FactotumDocumenti();

        $modelsDocumentiDati = [new FactotumDocumentiDati];


        if ($model->load(Yii::$app->request->post()) && $model->save()) {

         

            

            

        $modelsDocumentiDati = Model::createMultiple(FactotumDocumentiDati::classname());

            Model::loadMultiple($modelsDocumentiDati, Yii::$app->request->post());


            $valid = $model->validate();

            $valid = Model::validateMultiple($modelsDocumentiDati) && $valid;


            if ($valid) {

                $transaction = \Yii::$app->db->beginTransaction();

                try {

                    if ($flag = $model->save(false)) {

                        foreach ($modelsDocumentiDati as $modelsDocumentiDati) {

                            $modelsDocumentiDati->IDDocumento = $model->IDDocumento;

                            if (! ($flag = $modelsDocumentiDati->save(false))) {

                                $transaction->rollBack();

                                break;

                            }

                        }

                    }

                    if ($flag) {

                        $transaction->commit();

                        return $this->redirect(['view', 'id' => $model->IDDocumento]);

                    }

                } catch (Exception $e) {

                    $transaction->rollBack();

                }

            }

        


        }

            else {

           

            

           

            echo $_POST["campotest"]; // qui dovrebbe leggere i dati dall'input "campotest" nel form stamparli e poi arrestarsi


die();

                


       


            return $this->render('creadocumento', [

                'model' => $model,

                'modelsDocumentiDati' => (empty($modelsDocumentiDati)) ? [new FactotumDocumentiDati] : $modelsDocumentiDati

                ]);

                     

        }

    }




Ecco lo stralcio di codice, anche se ho fatto diverse prove non saprei se l’errore può essere qui o sto sbagliando logica. Grazie anticipate per il tuo aiuto!

La parte dell’“else” del $model->load è un pò ambigua:




            else {

           

            

           

            echo $_POST["campotest"]; // qui dovrebbe leggere i dati dall'imput "campotest" nella view stamparli e poi arrestarsi


die();

                


        else


            return $this->render('creadocumento', [

                'model' => $model,

                'modelsDocumentiDati' => (empty($modelsDocumentiDati)) ? [new FactotumDocumentiDati] : $modelsDocumentiDati

                ]);

                     

        }




Non manca qualche parentesi?

Perdonami un banale errore nel trascriverlo c’era un else di troppo (ho corretto il post sopra)

Quindi _form.php è un renderPartial in creadocumento.php.

Hai provato a mettere in testa all’action




public function actionCreadocumento()

    {

           var_dump($_POST);

            ....

    }



per vedere cosa arriva in POST ?

Arriva vuoto




<pre class='xdebug-var-dump' dir='ltr'>

<b>array</b> <i>(size=0)</i>

  <i><font color='#888a85'>empty</font></i>

</pre>



No non è un render partial (perdonami il metodo un po ‘grezzo’ volevo solo vedere se riuscivo ad intercettare un qualsiasi valore, fondamentalmente mi basta stampare a video i valori delle celle del form in qualche modo per generare l’anteprima).

ti allego x sicurezza anche

creadocumento.php




<?php


use yii\helpers\Html;




/* @var $this yii\web\View */

/* @var $model backend\models\FactotumDocumenti */


$this->title = 'Crea nuovo documento';

$this->params['breadcrumbs'][] = ['label' => 'Fatturazione', 'url' => ['index']];

$this->params['breadcrumbs'][] = $this->title;

?>

<div class="factotum-documenti-create">


    <h1><?= Html::encode($this->title) ?></h1>


    <?= $this->render('_form', [

        'model' => $model,

        'modelsDocumentiDati' => $modelsDocumentiDati

    ]) ?>


</div>



OK, ma con firebug o altra console del browser non riesci a vedere se effettivamente viene fatta una POST verso l’action?

Gentile Fabrizio, innanzitutto grazie per la tua pazienza e supporto.

Ho verificato, non viene passato nulla attraverso il POST.

Ho letto anche alcune info/esempi da qui

http://www.yiiframework.com/doc-2.0/guide-runtime-requests.html

e gli esempi indicati non mi funzionano in questa installazione, mentre funzionano su una installazione diversa (base) di Yii2. Di norma il valore $_POST viene passato e letto nell’action.

quindi sono un po sconcertato e sto indagando su tutto anche il template che ho inserito qui (metronic 3.9) magari influisce su qualche aspetto, sperando di non essere troppo fuori strada.

Per la cronaca le altre variabili di sistema $_GET, gli headers e altro vengono letti. Sembra mancare solo $_POST che e sempre vuota.

Si ma la verifica l’hai fatto lato client, cioè dal browser?

Perchè se già il browser non sta inviando nulla, il problema è sul client e quindi sul form che stai inviando.

Salve, il problema è risolto!

Il controllo come tu dicevi era già stato fatto sul client (quindi confermo che era il browser che non inviava nulla).

Il motivo era dovuto ad un errore nello script di validazione del form (abbastanza articolato) che inviava i dati dalla pagina (per questo quando inviavo da form diversi funzionava)!.

Per tornare all’argomento principale confermo che la chiamata $_POST[“nomecampo”] può essere letta tranquillamente nell’action o meglio ancora si può usare Yii::$app->request->post() quindi in caso di doppio submit il codice


if(isset($_POST["PULSANTE_SCELTO"])) {//fai qualcosa...}

puo essere usato come soluzione!

Ti ringrazio molto per il tuo aiuto !!!

Si ma non si spiega perchè nell’action il vettore $_POST era vuoto.