Lavorare con le form in Yii2

Per raccogliere dati di ingresso da un utente in una pagina web si usano le form.

In Yii2, ricordiamoci, bisogna sempre pensare con il paradigma MVC. Sarà dunque necessario:

  1. Creare un modello che effettui le operazioni sui dati;
  2. Creare una vista che raccolga i dati;
  3. Creare un’azione che colleghi vista e modello.

1. Creiamo il modello

Nella directory basic/models creiamo il file UserForm.php. Esso conterrà il seguente codice:

<?php

namespace app\models;

use yii\base\Model;

class UserForm extends Model
{
	public $name;
	public $email;

	public function rules()
	   {
	   	return [
	   	        [['name', 'email'], 'required'],
	   	        ['email', 'email']
	   	       ];
	   }
}
?>

Analizziamo il codice:

namespace app\models;

use yii\base\Model;

Queste sono le due righe di codice che identificano il namespace a cui appartiene la classe e importano la classe Model.

class UserForm extends Model
{

Creiamo la classe UserForm che estende la classe Model. Ciò significa che creiamo una classe modello, che verrà utilizzata per raccogliere i dati.

public $name;
public $email;

Sono gli attributi che appartengono alla classe UserForm.

public function rules()
	   {
	   	return [
	   	        [
                         ['name', 'email'], 'required'],
	   	         ['email', 'email']
	   	       ];
	   }

La funzione rules() è molto importante, in quanto restituisce un array con tutte le regole a cui devono sottostare gli attributi. Nella prima riga dell’array si comunica che gli attributi sono entrambi richiesti; nella seconda riga invece si richiede che l’attributo email sia di tipo appunto email. La funzione rules() viene chiamata all’atto della validazione del modello, che vedremo più avanti in questo paragrafo.

2. Creiamo la vista

Nella directory basic/views/site creiamo il file userForm.php. Esso conterrà il seguente codice:

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;

?>

<div class="alert alert-success">
<?php
     if(Yii::$app->session->hasFlash('success'))
        {
         echo Yii::$app->session->getFlash('success');
        }

?>
</div>

<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name'); ?>
<?= $form->field($model, 'email'); ?>

<?= Html::submitButton('Submit', ['class' => 'btn btn-success']); ?>

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

Analizziamo il codice:

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;

?>

Le prime due righe importano le classi che verranno utilizzate all’interno della vista. yii\helpers\Html viene usato per visualizzare il bottone di invio dati. yii\widgets\ActiveForm viene invece utilizzato per tutto quanto riguarda la form.

<div class="alert alert-success">
<?php
     if(Yii::$app->session->hasFlash('success'))
        {
         echo Yii::$app->session->getFlash('success');
        }

?>
</div>

Queste righe invece permettono di visualizzare, in un box con sfondo verde, un eventuale messaggio flash di successo inviato dal controller.

<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name'); ?>
<?= $form->field($model, 'email'); ?>

<?= Html::submitButton('Submit', ['class' => 'btn btn-success']); ?>

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

Le ultime righe definiscono una form di tipo ActiveForm e definiscono di seguito i suoi campi.
Si nota che nella definizione dei campi si utilizza la variabile $model. Questa è una variabile che viene “inviata” dal controllore durante il rendering della vista. Vedremo poi che non è altro che la variabile che contiene l’istanza dell’oggetto di classe UserForm che viene creato dal controllore al’atto della chiamata.

3. Creiamo il controllore

Nel controllore già esistente basic/controller/SiteController.php creiamo la funzione actionUserForm(). Essa è un’azione del controllore e conterrà il seguente codice:

    
public function actionUserForm()
   {
    $model = new UserForm;

    if($model->load(Yii::$app->request->post()) && $model->validate())
       {
        Yii::$app->session->setFlash('success', 'Hai inserito i dati correttamente');
       }
            
    return $this->render('userForm', ['model' => $model]);
        
   }

Analizziamo il codice:

public function actionUserForm()
   {
    $model = new UserForm;

Dopo aver aperto la funzione, viene dichiarata la variabile $model come istanza della classe UserForm.

if($model->load(Yii::$app->request->post()) && $model->validate())
       {
        Yii::$app->session->setFlash('success', 'Hai inserito i dati correttamente');
       }

$model->load(Yii::$app->request->post()) richiama il metodo load() della classe UserForm (metodo ereditato dalla classe Model) per popolare gli attributi del modello con i dati ricevuti dalla vista.
Spieghiamo meglio questo passo:

  1. Il metodo load() controlla se attraverso la form sono stati inviati dei dati attraverso il metodo POST.
  2. Se il controllo risulta positivo, cerca un array che abbia lo stesso nome della classe di cui $model è un’istanza (nel nostro caso quindi cercherà l’array UserForm).
  3. Se trova l’array UserForm, associerà tutti gli elementi dell’array con i corrispondenti attributi dell’istanza $model ($model->name = UserForm[‘name’]; $model->email = UserForm[‘email’)].
    Si noti che eventuali elementi dell’array che non abbiano un nome corrispondente al nome di un attributo dell’istanza $model non vengono considerati.

$model->validate() richiama invece il metodo validate() della classe UserForm, anch’esso ereditato dalla classe Model. Tale metodo controlla che le regole descritte nella funzione rules() del modello vengano soddisfatte. Se esse non vengono soddisfatte, ritorna un array che contiene l’indicazione dell’attributo e della regola che non è stata soddisfatta.
L’errore viene visualizzato nella form, il tutto utilizzando Ajax, quindi senza ricaricare l’intera pagina:
ErroriForm

Se entrambe le funzioni danno esito positivo (true), viene inviato un messaggio flash di successo alla view (vedi al punto 2), utilizzando l’istruzione

Yii::$app->session->setFlash('success', 'Hai inserito i dati correttamente')

FlashMessage

 

L’ultima istruzione della funzione:

         
    return $this->render('userForm', ['model' => $model]);
        
   }

imposta il valore di ritorno della funzione stessa. Esso consiste in una stringa contenente la vista ‘userForm’ definita sopra, alla quale viene passato il parametro $model.

Commenti

commenti