Creiamo il blog – parte 2

In questa puntata andremo ad apportare alcune modifiche al codice generato da Gii per rendere l’interfaccia di amministrazione più adatta alle nostre esigenze. Ovviamente quanto riporto per i post può essere fatto anche per le categorie e tutte le altre aree che andremo a sviluppare successivamente.

Modifica delle label del modello

Apriamo il file backend/models/Post.php ed andiamo a personalizzare i testi presenti in public function attributeLabels() come meglio crediamo. Queste modifiche si vedranno nelle label dei campi in edit, update e view e nei titoli dei campi nella tabella di riepilogo.

Modifica dei testi e della struttura nella schermata di elenco

Se andiamo all’indirizzo backend/post vedremo che ci viene presentata una schermata con una tabella che riepiloga gli articoli inseriti. Molti termini sono però in inglese. Inoltre, ci sono delle colonne che non vogliamo mostrare agli utenti (si, neppure agli amministratori!)

Apriamo quindi il file backend/views/post/index.php ed andiamo a sostituire il titolo per il bottone di creazione dei nuovi articoli.

Inoltre, nel GridView::widget andiamo a commentare o cancellare i campi che non vogliamo mostrare e a decommentare quelli da mostrare.

Basta? NO! Sinceramente, non mi piace come vengono formattate le date, ne tanto meno che non vedo il nome dell’autore e della categoria! Che fare? E’ semplicissimo grazie a Yii!!!

Per quanto riguarda la data, è sufficiente cambiare il campo created_at in

[
  'attribute' => 'created_at',
  'format' => ['date', 'php:d-m-Y'],
]

E la categoria? Nel nostro db avevamo definito una relazione tra il post e la categoria. Questa relazione è stata convertita da Gii nel modello con il seguente codice

public function getCategory() {
  return $this->hasOne(PostCategory::className(), ['category_id' => 'category_id']);
}

che associa in automatico la categoria padre unica (hasOne) al nostro post.

Grazie a questa semplicissima (ed autogenerata) istruzione, possiamo sostituire il campo created_by con il codice

[
  'attribute'=>'createdBy.username',
  'label'=>'Autore',
  'format'=>'text',
]

Per lo stesso motivo e nello stesso modo cambiamo category_id in

[
  'attribute'=>'category.category_name',
  'label'=>'Categoria',
  'format'=>'text',
]

ed il gioco è fatto!

Impediamo la cancellazione fisica del post

Non so voi, ma a me non piace particolarmente l’azione standard di delete che è presente in vari CMS. E’ vero, mi viene chiesta la conferma prima di cancellare (e Yii lo fa in automatico), ma se clicco ok per sbaglio ho perso tutto!

Per questo io aggiungo sempre nelle mie tabelle il campo deleted come valore booleano per identificare i contenuti cancellati e quelli disponibili (una sorta di pubblicato, ma che nessuno può vedere…). Anche nella nostra tabella post c’è questo campo, che adesso andremo ad utilizzare..

Come prima operazione limitiamo i nodi estratti a quelli che hanno il valore deleted a 0. Dovremo lavorare su due file

Apriamo il file backend/controllers/PostController.php e nella funzione protected function findModel($id) sostituiamo l’istruzione

if (($model = Post::findOne($id)) !== null) {

con

if (($model = Post::find()->andWhere(['post_id' => $id])->andWhere(['deleted' => 0])->one()) !== null) {

In questo modo oltre che all’id verrà aggiunga la condizione deleted = 0 nella query generata da Yii.

Dopodichè apriamo il file backend/models/PostCategorySearch.php e modifichiamo la funzione public function search($params). Nel punto dove di default Gii ha inserito

$query->andFilterWhere([
  'post_id' => $this->post_id,
  'category_id' => $this->category_id,
  'created_by' => $this->created_by,
  'created_at' => $this->created_at,
  'updated_at' => $this->updated_at,
]);

noi andiamo ad aggiungere la nostra condizione facendo diventare quindi il codice

$query->andFilterWhere([
  'post_id' => $this->post_id,
  'category_id' => $this->category_id,
  'created_by' => $this->created_by,
  'created_at' => $this->created_at,
  'updated_at' => $this->updated_at,
  'deleted' => 0,
]);

Ottimo, non ci rimane che impostare questa variabile quando cancelliamo il post!

In questo caso torna in gioco il file backend/controllers/PostController.php con la sua funzione public function actionDelete($id). Gii ci fornisce il codice standard

public function actionDelete($id) {
  $this->findModel($id)->delete();
  return $this->redirect(['index']);
}

ma noi lo trasformiamo in

public function actionDelete($id) {
  $model = $this->findModel($id);
  $model->deleted = 1;
  $model->save();
  return $this->redirect(['index']);
}

facendo cosi un semplice update sul campo interessato.

Salvate il tutto e provate a cancellare un post. Scomparso dalla vista? Controllate il db!

 

Benissimo, direi che per oggi basta cosi. La prossima volta andremo a vedere come cambiare la pagina di inserimento ed update per rispecchiare le nostre esigenze…