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!