Login senza aggiornare pagina

Salve a tutti, da un paio di giorni cerco una soluzione per creare dei form in grado di eseguire le loro belle operazioni senza aggiornare completamente la pagina. I form in questione li ho inclusi direttamente nel layout dell’applicazione, proprio nell’intestazione delle pagine, quindi visibili su ogni pagina dell’intera applicazione.

Potreste aiutarmi o indirizzarmi verso la corretta soluzione?

Beh, io invierei il form di autenticazione via ajax e se la risposta e’ corretta, aggiornerei i cookie. Da quel momento in poi, avendo i cookie aggiornati, tutte le richieste dovrebbero essere valide.

Qualcosa non mi quadra…

…ho una action nel controller, e fin quando eseguo il form da una view… tutto fila liscio.

Se il form lo vado a inserire nel layout, invece di averlo in una view, ad ogni submit mi carica la view.

Ma se la view è già aperta… il form nel layout funziona benissimo. Appena abbandono la view, si ripresenta lo stesso problema.

Questa è l’action:




    public function actionTransactions() {


        // Dichiarato anche nel layout dell'applicazione per provare il form incluso nel layout

        $model = new \yii\base\DynamicModel(['username', 'value', 'type']);

        $model->addRule(['username', 'value', 'type'], 'required');


        header('Cache-Control: no-cache, must-revalidate');

        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

        header('Content-type: application/json');


        $request = \Yii::$app->getRequest();


        if ($request->isAjax) {


            Yii::$app->response->format = Response::FORMAT_JSON;


            $user_id = $request->post('user_id');

            $type = $request->post('type');

            $amount = $request->post('amount');


            $result = json_encode(['status' => 'error']);


            if ($type) {

                if ( .... ) {

                    ....

                    $result = json_encode(['status' => 'success', 'message' => 'Transaction OK']);

                } else {

                    $result = json_encode(['status' => 'error', 'message' => 'User balance error']);

                }

            } else {

                if ( .... ) {

                    ....

                    $result = json_encode(['status' => 'success', 'message' => 'Transaction OK']);

                } else {

                    $result = json_encode(['status' => 'error', 'message' => 'User balance error']);

                }

            }


            echo $result;

            Yii::$app->end();

        } else {

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

                'model' => $model

            ]);

        }


    }



Da premettere che il $model lo vado a dichiarare e inizializzare già nel layout quando tento di utilizzare la form inclusa nel layout.

Aggiungo il block che renderizzzo nel layout:




$this->beginBlock('transfer');

if (!Yii::$app->user->isGuest) {

    Pjax::begin([ /* Pjax options */]);


        $model = new \yii\base\DynamicModel(['username', 'value', 'type']);

        $model->addRule(['username', 'value', 'type'], 'required');


        $list = [

            0 => Yii::t('frontend', 'Deposit'),

            1 => Yii::t('frontend', 'Withdraw')

        ];


        $form = ActiveForm::begin([

            'id' => 'transaction-form',

            'action' => ['site/transactions'],

            'type' => ActiveForm::TYPE_HORIZONTAL,

            'enableClientValidation' => false,

            //'formConfig' => ['labelSpan' => 3, 'deviceSize' => ActiveForm::SIZE_SMALL]

        ]);


        echo $form->field($model, 'username')->dropDownList(

            ArrayHelper::map(User::find()->where(['refer' => \Yii::$app->user->getIdentity()->id])->all(), 'id', 'username'),

            ['id' => 'user_id', 'name' => 'user_id']

        );

        echo $form->field($model, 'value')->textInput(['placeholder' => Yii::t('frontend', 'Insert an amount to transfer...'), 'id' => 'amount', 'name' => 'amount']);

        echo $form->field($model, 'type')->radioList($list, ['inline' => true, 'id' => 'type', 'name' => 'type'])->label(false);

        echo Html::submitButton(Yii::t('frontend', 'Transfer'), ['class' => 'btn btn-primary']);

        ActiveForm::end();

    }


    Pjax::end();

$this->endBlock();



[RISOLTO]

Per qualche scherzo infame del mio umile intelletto… avevo dimenticato di inserire direttamente nel layout il codice java legato al form. Ecco cos’era che non quadrava :lol:




$this->registerJs('      

    $("#transaction-form").on("beforeSubmit", function(e) {

    

        var form = $(this);

        

        if (form.find(".has-error").length) {

              return false;

        }

        

        var formData = form.serialize();

        

        $.ajax({

            url: form.attr("action"),

            type: form.attr("method"),

            data: formData,

            success: function (data) {

            

                if(data.status == "success"){

                    alert(data.message);

                }else if(data.status == "error"){

                    alert(data.message);

                }

            },

            error: function () {

                console.log("internal server error");

            }

        });

    }).on("submit", function(e){

        e.preventDefault();

    });

    ',

\yii\web\View::POS_READY, 'my-ajax-transactions-submit');



occhio che e’ javascript, non java ^_^