-
Notifications
You must be signed in to change notification settings - Fork 0
/
View.php
244 lines (222 loc) · 10.7 KB
/
View.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
<?php
namespace mauriziocingolani\yii2fmwkphp;
use Yii;
use yii\helpers\Url;
use mauriziocingolani\yii2fmwkphp\Html;
/**
* Estende la classe View aggiungendo alcune funzionalità.
* @author Maurizio Cingolani <mauriziocingolani74@gmail.com>
* @license http://opensource.org/licenses/BSD-3-Clause BSD-3-Clause
* @version 1.0.21
*/
class View extends \yii\web\View {
/** Titolo della pagina. */
public $pageTitle;
/** Descrizione della pagina. */
public $pageDescription;
/** Keywords della pagina. */
public $pageKeywords;
/** Proprietà per impedire la visualizzazione di banner. */
public $noBanner = false;
/** Proprietà utilizzabile per assegnare una classe al tag body */
public $bodyClass;
/**
* Imposta il titolo della pagina secondo i seguenti criteri:
* <ul>
* <li>Se la proprietà <code>$pageTitle</code> non è impostata viene utilizzato il parametro
* <code>'title'</code> dell'applicazione. Se nemmeno quest'ultimo è impostato viene sollevata
* un'eccezione.</li>
* <li>Se la proprietà <code>$pageTitle</code> è assegnata, allora viene utilizzato il parametro
* <code>'title'</code> dell'applicazione come prefisso, sempre che sia stato impostato. Il separatore
* tra il prefisso e il titolo della pagina può essere specificato tramite il parametro <code>'titleSeparator'</code>
* dell'applicazione. Altrimenti viene utilizzato di default il carattere '-'.</li>
* </ul>
* Quindi imposta la descrizione della pagina secondo i seguenti criteri:
* <ul>
* <li>Se la proprietà <code>$pageDescription</code> non è assegnata esplicitamente viene utilizzato
* il parametro <code>'description'</code> dell'applicazione.</li>
* <li>Se nemmeno il parametro <code>'description'</code> è assegnato viene sollevata un'eccezione</li>
* </ul>
* Le impostazioni vengono fatte in questo metodo per consentire l'assegnazione del valore
* alla proprietà <code>$pageTitle</code> e <code>$pageDescription</code> nella view invece che nel controller.
* @throws \yii\base\InvalidConfigException Se nessun titolo o nessuna descrizione sono stati impostati
*/
public function afterRender($viewFile, $params, &$output) {
parent::afterRender($viewFile, $params, $output);
# titolo
if ($this->pageTitle) :
if (isset(Yii::$app->params['title'])) :
$this->title = Yii::$app->params['title'] . ' ' . (isset(Yii::$app->params['titleSeparator']) ? Yii::$app->params['titleSeparator'] : '-') . ' ' . $this->pageTitle;
endif;
else :
if (isset(Yii::$app->params['title'])) :
$this->title = Yii::$app->params['title'];
else :
throw new \yii\base\InvalidConfigException('Il parametro \'title\' non è stato impostato.');
endif;
endif;
# descrizione
if (!$this->pageDescription) :
if (isset(Yii::$app->params['description'])) :
$this->pageDescription = Yii::$app->params['description'];
else :
throw new \yii\base\InvalidConfigException('Il parametro \'description\' non è stato impostato.');
endif;
else :
endif;
}
/**
* Aggiunge un breadcrumb alla catena, con i senza link (in base al parametro {@link $url}.
* Se il parametro {@link $text} non è assegnato viene utilizzata la proprietà {@link View::title}.
* Restituisce il testo del breadcrumb.
* @param string $text Testo del breadcrumb
* @param string $url Url del breadcrumb (senza slash iniziale)
* @return string Description Testo del breadcrumb
*/
public function addBreadcrumb($text = null, $url = null) {
if ($url) :
$bc = ['label' => $text ? $text : $this->title, 'url' => [Url::to('/' . $url)]];
else :
$bc = $text ? $text : $this->title;
endif;
$this->params['breadcrumbs'][] = $bc;
return $text ? $text : $this->title;
}
/**
* Restituisce il tag HTML per aggiungere la favicon.
* Di default il percorso è <code>'/images/favicon.ico'</code>.
* @param string $path Immagine (percorso assoluto)
* @return sting Tag HTML della favicon
*/
public function addFavicon($path = '/images/favicon.ico') {
return '<link href="' . $path . '" rel="icon" type="image/x-icon" />';
}
/**
* Crea un alert Bootstrap per ogni messaggio flash presente.
* Si presuppone che il nome del flash da mostrare sia 'success', 'danger', oppure una stringa del tipo
* 'success_...' o 'danger_...'. In questo caso, segnalato dalla presenza dell'underscore, viene utilizzata
* come classe dell'alert il testo antecedente il primo underscore.
* Il parametro (opzionale) permette di specificare i nomi dei flash che verranno mostrati, in modo da poter
* utilizzare il metodo per due diversi blocchi di messaggi nella stessa pagina.
* @param string[] $allowedTypes Nomi dei flash consentiti
*/
public function addFlashDivs(array $allowedTypes = null) {
# analizzo i messaggi flash uno a uno
foreach (Yii::$app->session->allFlashes as $type => $messages) :
if (isset($allowedTypes) && array_search($type, $allowedTypes) === false)
continue;# non visualizzo il flash se non è compreso tra quelli consentiti
if (($i = strpos($type, '_')) !== false)
$type = substr($type, 0, $i);
if (is_array($messages)) :
foreach ($messages as $message) :
echo Html::tag('div', $message, ['class' => 'alert alert-' . $type]);
endforeach;
else :
echo Html::tag('div', $messages, ['class' => 'alert alert-' . $type]);
endif;
endforeach;
}
/**
* Registra lo script per rispondere al click sulla checkbox mostrando o nascondendo
* i caratteri del campo password (tramite attributo 'type' del campo).
* @param string $checkboxId Id della checkbox (default 'reveal-password')
* @param string $passwordFieldId Id del campo password (default 'loginform-password')
*/
public function registerShowPasswordScript($checkboxId = 'reveal-password', $passwordFieldId = 'loginform-password') {
$this->registerJs("jQuery('#$checkboxId').change(function(){jQuery('#$passwordFieldId').attr('type',this.checked?'text':'password');})");
}
/**
* Restituisce l'array di configurazione per il pager di default della Gridview, con i quattro pulsanti (<<,<,>,>>) e
* l'allineamento a destra.
* @return array Pager per la Gridview
*/
public function getGridviewPager() {
return [
'firstPageLabel' => '<<',
'prevPageLabel' => 'Prec.',
'nextPageLabel' => 'Succ.',
'lastPageLabel' => '>>',
'options' => ['class' => 'pagination'],
];
}
/**
* Restituisce il tag <div> con il sommario della Gridview nel formato "{$objsName} {begin}-{end} di {totalCount}".
* @param string $objsName Nome degli oggetti contenuti
* @return string Sommario per la Gridview
*/
public function getGridviewSummary($objsName) {
return Html::tag('div', $objsName . ' <strong>{begin}-{end}</strong> di <strong>{totalCount}</strong>', ['style' => 'text-align: right']);
}
/**
* Restituisce la stringa di layout per posizionare il pager sulla destra.
* @return string Layout per la gridview
*/
public function getGridviewLayout() {
return "{summary}\n{items}\n<div class='text-right'>{pager}</div>";
}
/**
* Corregge l'errore di visualizzazione dei pulsanti in Bootstrap4.
* @return array Opzioni per visualizzazione
*/
public function getGridviewCssOptions() {
return [
'linkOptions' => [
'class' => 'page-link',
],
'linkContainerOptions' => [
'class' => 'paginate_button page-item',
],
'disabledPageCssClass' => 'page-link',
];
}
/**
* Fornisce la stringa template da utilizzare per un singolo campo su una riga.
* Il campo viene racchiuso in una riga con classe "col-sm-x" se il parametro fornito
* è di tipo intero, altrimenti con la classe specificata se è una stringa.
* @param mixed $nColumns Numero di colonne (sm) oppure classe per la diov esterna
* @return string Template per il campo */
public function getFormFieldColumnTemplate($nColumns) {
if (is_string($nColumns)) :
return '{label} <div class="row"><div class="' . $nColumns . '">{input}{error}{hint}</div></div>';
elseif (is_integer($nColumns)) :
return '{label} <div class="row"><div class="col-sm-' . $nColumns . '">{input}{error}{hint}</div></div>';
endif;
}
/**
* Esegue il render della view indicata, cercandola nella cartella 'views-include' anziché in 'views'.
* @param string $viewFile Il file della view
* @param array $params Parametri
* @param object $context Controller (attuale se nullo)
* @return string Il risultato da visualizzare
* @throws ViewNotFoundException Se il file della view non esiste
*/
public function renderInclude($view, $params = [], $context = null) {
if (strtoupper(substr(PHP_OS, 0, 3) === 'WIN')) :
$viewFile = preg_replace('/\\\views\\\/', '\views-include\\', $this->findViewFile($view, $context));
else :
$viewFile = preg_replace('/\/views\//', '/views-include/', $this->findViewFile($view, $context));
endif;
return $this->renderFile($viewFile, $params, $context);
}
/**
* Registra un tag <link> per la favicon.
* @param string $href Percorso immagine (default: '/img/favicon.png')
* @param string $type MIME type dell'immagine (default: 'image/png')
* @param string $key Key per il tag
*/
public function registerFavicon($href = '/img/favicon.png', $type = 'image/png', $key = null) {
$this->registerLinkTag(['rel' => 'icon', 'type' => 'image/png', 'href' => $href], $key);
}
/**
* Registra quattro tag <link> per le icone Apple.
* Le dimensioni predefinite sono 57x57, 72x72, 114x114, 144x144.
* @param string $extension Estensione delle icone (default: 'png')
* @param string $key Key per il tag
*/
public function registerAppleIcons($extension = 'png', $key = null) {
$sizes = ['57x57', '72x72', '114x114', '144x144'];
foreach ($sizes as $size) :
$this->registerLinkTag(['rel' => 'apple-touch-icon-precomposed', 'sizes' => $size, 'href' => "/img/apple-icon-$size-precomposed.$extension"], $key);
endforeach;
}
}