Secondo passo: gestione degli utenti
Per la gestione degli utenti ho deciso di appoggiarmi al componente yii2-user.
Installo il tutto da composer e procedo con la sua configurazione (la procedura di installazione è molto dettagliata già su GitHub e quindi non la riporto).
Per l’applicativo che stò sviluppando non ho bisogno della registrazione degli utenti, che quindi disabilito nella configurazione impostando enableRegistration e enableConfirmation a false.
Rimane il problema dell’amministatore: devo creare un primo utente da utilizzare come amministratore del sistema.
Riabilito la registrazione tramite enableRegistration (lasciando però la enableConfirmation a false) e creo l’account.
Dopodichè valorizzo con l’username creato la variabile in configurazione admins e disabilito nuovamente la registrazione con enableRegistration.
Yii2-user genera in automatico in fase di migrazione sia la tabella user che la tabella profile. Su GitHub è riportato come aggiungere nuovi campi alla tabella user, ma noi vogliamo aggiungere campi di profilo, quindi procediamo in modo lievemente diverso.
Diciamo di voler aggiungere i campi surname e phone. Creo uno script di migrazione via shell con il comando
php yii migrate/create add_new_field_to_profile
e nel file che viene generato riporto il seguente codice per aggiungere le due colonne
public function up(){ $this->addColumn('{{%profile}}', 'surname', Schema::TYPE_STRING); $this->addColumn('{{%profile}}', 'phone', Schema::TYPE_STRING); } public function down(){ $this->dropColumn('{{%profile}}', 'surname'); $this->dropColumn('{{%profile}}', 'phone'); }
Eseguo la migrazione con
php yii migrate
.
A questo punto bisogna effettuare l’override del modello Profile originale.
Creo il file Profile.php nella cartella models ed inserisco il seguente codice
namespace app\models; use dektrium\user\models\Profile as BaseProfile; class Profile extends BaseProfile{ public function rules(){ return [ 'bioString' => ['bio', 'string'], 'publicEmailPattern' => ['public_email', 'email'], 'gravatarEmailPattern' => ['gravatar_email', 'email'], 'websiteUrl' => ['website', 'url'], 'nameLength' => ['name', 'string', 'max' => 255], 'publicEmailLength' => ['public_email', 'string', 'max' => 255], 'gravatarEmailLength' => ['gravatar_email', 'string', 'max' => 255], 'locationLength' => ['location', 'string', 'max' => 255], 'websiteLength' => ['website', 'string', 'max' => 255], 'surnameLength' => ['surname', 'string', 'max' => 255], 'phoneLength' => ['phone', 'string', 'max' => 100], ]; } /** @inheritdoc */ public function attributeLabels(){ return [ 'name' => \Yii::t('user', 'Name'), 'public_email' => \Yii::t('user', 'Email (public)'), 'gravatar_email' => \Yii::t('user', 'Gravatar email'), 'location' => \Yii::t('user', 'Location'), 'website' => \Yii::t('user', 'Website'), 'bio' => \Yii::t('user', 'Bio'), 'surname' => \Yii::t('user', 'Surname'), 'phone' => \Yii::t('user', 'Phone'), ]; } }
Inoltre, nel file di configurazione config/web.php andiamo a modificare la chiamata al componente per fargli utilizzare il nostro modello
'modules' => [ 'user' => [ 'class' => 'dektrium\user\Module', 'enableRegistration' => false, 'enableConfirmation' => false, 'admins' => ['gio'], 'modelMap' => [ 'Profile' => 'app\models\Profile', ], ], ],
Infine effettuo l’override della view.
Per tenere tutto ben organizzato creo la cartella yii2-user/settings dentro alla cartella principale views.
Qui creo i files profile.php e _menu.php copiando quelli di partenza del modulo. Apro il file di configurazione ed inserisco il seguente codice
'components' => [ 'view' => [ 'theme' => [ 'pathMap' => [ '@dektrium/user/views' => '@app/views/yii2-user' ], ], ], ]
In questo modo Yii controllerà, per richiamare le view associate a yii2-user, se il file esiste nella nostra cartella. Se esiste utilizza il file custom, altrimenti va a prendere quello di default.
Bene, adesso posso aggiungere a profile.php i miei due nuovi campi
<?= $form->field($model, 'surname') ?> <?= $form->field($model, 'phone') ?>
ed il sistema funziona in automatico salvando i nuovi campi!
Prossima puntata, gestione delle news!