"Gli Jatravartid di Viltvodle VI credono invece che il cosmo sia nato dallo starnuto di un essere chiamato il Grande Ciaparche Verde."

Towel Day - Non fatevi prendere dal Panico

Guida Galattica per gli Autostoppisti

Personalizzare il modulo di login in Joomla 3 - seconda parte

AGGIORNAMENTO: considerato che questo è l'articolo più consultato del sito, ho deciso di aggiornarlo affinchè la procedura descritta sia compatibile anche con versioni di Joomla successive alla 3.3.x. Va da sè che la procedura stessa non è applicabile a versioni di Joomla precedenti la 3.4.0.
Logo Joomla
Immagine da Joomla

(Vai alla prima parte dell'articolo.)

Prima di modificare il codice, è il caso di impostare alcune opzioni per il modulo con il layout alternativo. Considerato che si tratta di campi visualizzati sulla stessa riga, in modo compatto, non ha senso mostrare un messaggio primo o dopo i campi di testo, per cui lasciamo vuoti Testo prima del form e Testo dopo il form nelle opzioni del modulo di login. Una volta compreso il meccanismo per modificare il layout, potrete intervenire sul codice e sul CSS per impostare una visualizzazione adeguata dell'eventuale testo, se preferite.

Bene, ora passiamo finalmente alla modifica del codice. Ricordo che il file che modifichiamo ora è horizontal.php, che si trova nella cartella <%cartella Joomla 3%>\templates\protostar\html\mod_login.

Il primo passo è portare sulla stessa riga i campi di testo e il pulsante di invio del form.

Riporto di seguito il codice modificato. Sostituire tutto il codice tra <form action="<?php echo JRoute::_(htmlspecialchars(JUri::getInstance()->toString()), true, $params->get('usesecure')); ?>"
method="post" id="login-form" class="form-inline"> (riga 18) e il relativo </form> di chiusura a fine file, compresi i tag form stessi, con quanto segue:

	<form action="<?php echo JRoute::_(htmlspecialchars(JUri::getInstance()->toString()), true, $params->get('usesecure')); ?>" method="post" id="login-form" class="form-inline hidden-phone">
		<?php if ($params->get('pretext')) : ?>
			<div class="pretext">
				<p><?php echo $params->get('pretext'); ?></p>
			</div>
		<?php endif; ?>
		<div class="userdata text-right">
			<span id="form-login-username" class="control-group">
				<span class="controls">
					<?php if (!$params->get('usetext')) : ?>
						<span class="input-prepend">
							<span class="add-on">
								<span class="icon-user hasTooltip" title="<?php echo JText::_('MOD_LOGIN_VALUE_USERNAME') ?>"></span>
								<label for="modlgn-username" class="element-invisible"><?php echo JText::_('MOD_LOGIN_VALUE_USERNAME'); ?></label>
							</span>
							<input id="modlgn-username" type="text" name="username" class="input-small" tabindex="0" size="18" placeholder="<?php echo JText::_('MOD_LOGIN_VALUE_USERNAME') ?>" />
						</span>
					<?php else: ?>
						<label for="modlgn-username"><?php echo JText::_('MOD_LOGIN_VALUE_USERNAME') ?></label>
						<input id="modlgn-username" type="text" name="username" class="input-small" tabindex="0" size="18" placeholder="<?php echo JText::_('MOD_LOGIN_VALUE_USERNAME') ?>" />
					<?php endif; ?>
				</span>
			</span>
			<span id="form-login-password" class="control-group">
				<span class="controls">
					<?php if (!$params->get('usetext')) : ?>
						<span class="input-prepend">
							<span class="add-on">
								<span class="icon-lock hasTooltip" title="<?php echo JText::_('JGLOBAL_PASSWORD') ?>"></span>
								<label for="modlgn-passwd" class="element-invisible"><?php echo JText::_('JGLOBAL_PASSWORD'); ?></label>
							</span>
							<input id="modlgn-passwd" type="password" name="password" class="input-small" tabindex="0" size="18" placeholder="<?php echo JText::_('JGLOBAL_PASSWORD') ?>" />
						</span>
					<?php else: ?>
						<label for="modlgn-passwd"><?php echo JText::_('JGLOBAL_PASSWORD') ?></label>
						<input id="modlgn-passwd" type="password" name="password" class="input-small" tabindex="0" size="18" placeholder="<?php echo JText::_('JGLOBAL_PASSWORD') ?>" />
					<?php endif; ?>
				</span>
			</span>
			<?php if (count($twofactormethods) > 1): ?>
				<span id="form-login-secretkey" class="control-group">
					<span class="controls">
						<?php if (!$params->get('usetext')) : ?>
							<span class="input-prepend input-append">
								<span class="add-on">
									<span class="icon-star hasTooltip" title="<?php echo JText::_('JGLOBAL_SECRETKEY'); ?>"></span>
									<label for="modlgn-secretkey" class="element-invisible"><?php echo JText::_('JGLOBAL_SECRETKEY'); ?></label>
								</span>
								<input id="modlgn-secretkey" autocomplete="off" type="text" name="secretkey" class="input-small mr3" tabindex="0" size="18" placeholder="<?php echo JText::_('JGLOBAL_SECRETKEY') ?>" />
								<span class="btn width-auto hasTooltip" title="<?php echo JText::_('JGLOBAL_SECRETKEY_HELP'); ?>">
									<span class="icon-help"></span>
								</span>
						</span>
						<?php else: ?>
							<label for="modlgn-secretkey"><?php echo JText::_('JGLOBAL_SECRETKEY') ?></label>
							<input id="modlgn-secretkey" autocomplete="off" type="text" name="secretkey" class="input-small mr3" tabindex="0" size="18" placeholder="<?php echo JText::_('JGLOBAL_SECRETKEY') ?>" />
							<span class="btn width-auto hasTooltip" title="<?php echo JText::_('JGLOBAL_SECRETKEY_HELP'); ?>">
								<span class="icon-help"></span>
							</span>
						<?php endif; ?>
					</span>
				</span>
			<?php endif; ?>
			<span id="form-login-submit" class="control-group">
				<span class="controls">
					<button type="submit" tabindex="0" name="Submit" class="btn btn-primary"><?php echo JText::_('JLOGIN') ?></button>
				</span>
			</span>
		</div>
		<div class="text-right">
			<?php
				$usersConfig = JComponentHelper::getParams('com_users'); ?>
			<ul class="inline mt3">
			<?php if (JPluginHelper::isEnabled('system', 'remember')) : ?>
				<li id="form-login-remember" class="control-group checkbox vbottom">
					<label for="modlgn-remember" class="control-label"><?php echo JText::_('MOD_LOGIN_REMEMBER_ME') ?></label> <input id="modlgn-remember" type="checkbox" name="remember" class="inputbox" value="yes"/>
				</li>
			<?php endif; ?>
			<?php if ($usersConfig->get('allowUserRegistration')) : ?>
				<li>
					<a href="/<?php echo JRoute::_('index.php?option=com_users&view=registration&Itemid=' . UsersHelperRoute::getRegistrationRoute()); ?>">
					<?php echo JText::_('MOD_LOGIN_REGISTER'); ?> <span class="icon-arrow-right"></span></a>
				</li>
			<?php endif; ?>
				<li>
					<a href="/<?php echo JRoute::_('index.php?option=com_users&view=remind&Itemid=' . UsersHelperRoute::getRemindRoute()); ?>">
					<?php echo JText::_('MOD_LOGIN_FORGOT_YOUR_USERNAME'); ?></a>
				</li>
				<li>
					<a href="/<?php echo JRoute::_('index.php?option=com_users&view=reset&Itemid=' . UsersHelperRoute::getResetRoute()); ?>">
					<?php echo JText::_('MOD_LOGIN_FORGOT_YOUR_PASSWORD'); ?></a>
				</li>
			</ul>
			<input type="hidden" name="option" value="com_users" />
			<input type="hidden" name="task" value="user.login" />
			<input type="hidden" name="return" value="<?php echo $return; ?>" />
			<?php echo JHtml::_('form.token'); ?>
		</div>
		<?php if ($params->get('posttext')) : ?>
			<div class="posttext">
				<p><?php echo $params->get('posttext'); ?></p>
			</div>
		<?php endif; ?>
	</form>

Come vedete, il grosso delle modifiche sta nel raggruppare all'interno dello stesso <div> etichette, campi di testo e pulsante per l'invio del form, in modo che questi elementi siano organizzati su una stessa riga separati da <span>, e su una seconda riga i link Ricordami, Password dimenticata, etc.

Nella prima riga abbiamo quindi etichetta e campo per nome utente, password, password per autenticazione a due fattori se questa opzione è abilitata (la condizione per l'abilitazione è <?php if (count($twofactormethods) > 1): ?>, con la relativa chiusura <?php endif; ?>).

Il pulsante per l'help relativo all'autenticazione a due fattori quando presente è spaziato dal campo di input precedente aggiungendo a quest'ultimo la classe mr3, inserita modificando il file CSS del template protostar.

Ho inoltre modificato la classe del <div> iniziale dei controlli del form (<div class="userdata text-right">) per allineare a destra il gruppo dei pulsanti; la stessa classe text-right è stata aggiunta al gruppo link/casella di controllo "Ricordami" (<div class="text-right">).

Infine ho aggiunto all'elenco dei vari link la classe mt3 per aggiungere un po' di spazio tra tale riga e quella superiore (<ul class="inline mt3">).

Più oltre spiego brevemente come e dove aggiungere queste classi. Notare che la classe text-right è nativa del sistema.

Quando si abilita la vista delle etichette come testo (codice tra le righe <?php else: ?> ed il relativo <?php endif; ?>) ho di nuovo raggruppato quanto serviva, semplicemente affiancando etichette e campi.

Personalmente, preferisco non visualizzare il campo Ricordami nè i link per recuperare password e/o nome utente. Questi ultimi si possono visualizzare nella pagina cui si accede in caso di dati errati, mostrandoli così solo se necessario. L'unico link che è il caso di lasciare è quello per la registrazione, se consentita (su questo sito NON è consentita).

Comunque, in questo esempio ho lasciato tutto visibile per completezza.

Invece di proporre un testo per i link di recupero password e/o nome utente, potreste proporre un'immagine o un'icona, con un effetto meno invadente ed un aspetto grafico più invitante. Una buona occasione per iniziare ad applicare qualche modifica in modo autonomo...

Se avete fatto tutto correttamente, il risultato finale è quello visibile nell'immagine:

Home Page Joomla 3 dopo modifica modulo Login
Intestazione Home Page Joomla 3 dopo modifica modulo Login

Nella figura è visibile il modulo di login con il nuovo layout; sono abilitate l'autenticazione a due fattori, il Ricordami, la registrazione di nuovi utenti e la visualizzazione dei link per nome utente/password dimenticati.

Logout

Ho tralasciato fino ad ora il modulo di logout. Senza alcuna modifica, la situazione attuale è quella in figura:

Decisamente meglio visualizzare il testo Ciao Test alla sinistra del pulsante.

Home Page Joomla 3, pulsante Logout

La modifica è semplice. Si deve aprire il file horizontal_logout.php, che si trova nella cartella <%cartella Joomla 3%>\templates\protostar\html\mod_login, e modificarlo come di seguito:

<form action="<?php echo JRoute::_(htmlspecialchars(JUri::getInstance()->toString()), true, $params->get('usesecure')); ?>" method="post" id="login-form" class="form-vertical">
<?php if ($params->get('greeting')) : ?>
	<span class="login-greeting">
	<?php if ($params->get('name') == 0) : {
		echo JText::sprintf('MOD_LOGIN_HINAME', htmlspecialchars($user->get('name')));
	} else : {
		echo JText::sprintf('MOD_LOGIN_HINAME', htmlspecialchars($user->get('username')));
	} endif; ?>
	</span>
<?php endif; ?>
	<span class="logout-button">
		<input type="submit" name="Submit" class="btn btn-primary" value="<?php echo JText::_('JLOGOUT'); ?>" />
		<input type="hidden" name="option" value="com_users" />
		<input type="hidden" name="task" value="user.logout" />
		<input type="hidden" name="return" value="<?php echo $return; ?>" />
		<?php echo JHtml::_('form.token'); ?>
	</span>
</form>

Fatto. Ora il testo, visibile se Mostra saluto nel modulo è abilitato, è allineato al pulsante.

CSS

Per aggiungere le classi CSS cui ho fatto riferimento, si deve modificare il file template.css che si trova in

<%cartella Joomla 3%>\templates\protostar\css

Aprirlo con un editor di testo e aggiungere al termine le seguenti righe:

.mt3 {
	margin-top: 3px;
}

.mr3 { 
	margin-right: 3px; 
}

Come vedete, ho modificato il CSS nativo del template protostar, cosa che sarebbe bene evitare: in caso di aggiornamento del template la modifica va persa. L'ho fatto per semplicità visto che l'override degli stili CSS nel template protostar si basa su una tecnica non immediata, che richiede di usare LESS, per ora preferisco evitarlo per non appesantire eccessivamente l'articolo.

Dispositivi mobili

Non vi sarà sfuggita la strana classe aggiunta alla riga iniziale del form: hidden-phone. Se provate a ridimensionare orizzontalmente la finestra del browser nel vostro sito con il login modificato, vedrete che ad un certo punto i campi di input spariscono. Eliminate questa classe dal codice e riprovate: i campi di input rimangono visibili e soprattutto restano orizzontali, rovinando il layout.

La classe hidden-phone, come avete intuito, serve proprio a evitare questo comportamento, nascondendo il modulo di login su dispositivi mobili.

La domanda successiva è: da dove salta fuori? Beh date un'occhiata al file

<%cartella Joomla 3%>\templates\protostar\css\template.css

(fate una ricerca del testo hidden-phone). Troverete questa ed altre utili classi che gestiscono il comportamento del layout a seconda delle dimensioni dello schermo.

Vi suggerisco di consultare sempre attentamente il file CSS del template che usate nel vostro sito. Con ogni probabilità troverete parecchie classi a disposizione che vi torneranno spesso utili. È quello che ho fatto io: ed ho trovato tutto quanto mi serviva per gestire il layout a seconda delle dimensioni dello schermo, senza dover reinventare la ruota...

Rimane ancora un piccolo problema. Il modulo di login non è più visibile sugli smartphone. La soluzione è semplice: dobbiamo aggiungere un secondo modulo di login che visualizzeremo solo sui dispositivi mobili. Considerato il tipo di schermo, dobbiamo mantenere un layout verticale per i campi di input ed il pulsante. Procediamo in questo modo:

  • Clic su Estensioni - Moduli, quindi clic su Nuovo;
  • Selezionare Login e assegnare un nome al modulo appena creato, impostando le opzioni desiderate;
  • Assegnare una posizione al modulo; selezionare ad esempio la posizione Navigation [position-1] tra quelle disponibili sotto Protostar. In questo modo il modulo di login sarà visibile solo quando si espande il pulsante corrispondente al menu principale.
  • Clic su Avanzate: in Suffisso classe CSS modulo scriviamo 'hidden-desktop hidden-tablet', senza virgolette.

    Sappiamo già dove si trovano queste classi, il cui scopo è abbastanza ovvio: nascondere questo modulo su desktop e tablet.

  • Clic su Stile del modulo: selezioniamo well
  • Salviamo il modulo

Ora proviamo a ridimensionare orizzontalmente la finestra del browser. Se tutto è stato fatto correttamente, il modulo di login orizzontale dovrebbe scomparire quando la finestra ha il corretto rapporto altezza-larghezza; in questa configurazione il menu principale scompare allo stesso modo, per aprirsi con un pulsante. Facendo clic su questo, appare anche il modulo di login con i campi disposti verticalmente.

Una nota. I più attenti si chiederanno perchè non ho usato la stessa tecnica del Suffisso classe CSS modulo anche sul modulo di login personalizzato, invece di aggiungere la classe hidden-phone nel codice. Tra l'altro, sarebbe formalmente preferibile. Semplice: ho voluto mostrare due modi differenti per ottenere lo stesso risultato, cosa che ritengo sempre utile per approfondire la conoscenza del sistema.

Altro

Ho volutamente tralasciato la personalizzazione del testo introduttivo e conclusivo che è possibile aggiungere prima e dopo i campi del modulo: si tratta dei parametri Testo prima del form e Testo dopo il form. Non mi pare molto elegante aggiungerlo quando la visualizzazione dei campi è orizzontale, come ho anticipato all'inizio dell'articolo. Ma i gusti sono gusti: se volete aggiungerlo, nessun problema. Nell'esempio di questo articolo, troverete che il testo introduttivo e finale occupa due righe, prima e dopo i campi. A voi il piacere di modificare il codice per portarlo in linea.

Conclusione

Provate il template dopo queste modifiche, cambiandone i parametri a piacimento: visualizzate etichette di testo o icone a fianco dei campi di input, passate da layout statico a fluido, etc.

Provate tutto, tranne una cosa: NON ABILITATE L'AUTENTICAZIONE A DUE FATTORI SE NON LA CONOSCETE A FONDO.. Correte il rischio di non potere più accedere all'amministrazione del sito.

Infine, concludo ricordando che non posso escludere imprecisioni ed errori: non si tratta di un argomento così banale, e qualcosa può essermi sfuggito, per imprecisione o ignoranza. Spero in questo caso che vorrete segnalarmi gli uni e gli altri.

Ricordo nuovamente che queste modifiche sono valide per la versione 3.4.8 di Joomla e la versione 1.0.0 del template protostar. In ogni caso, la tecnica di base non cambia e si possono facilmente adattare ad altri template.

Tags: Joomla, Override, Personalizzare template, PHP

Contattami, ma pensaci bene

  • Scrivimi, affinchè possa ignorarti con calma
  • Pubblico questa roba dalla Bassa Modenese. Sì, la zona del terremoto di maggio 2012...

    ... tromba d'aria nel 2013...

    ... alluvione nel 2014...

    ... nuova tromba d'aria nel 2014

Cominciamo ad essere un po' scocciati

E questo Ciaparche, cos'è?

Se ti punge vaghezza di conoscere la risposta e dimostrare così la tua ignoranza, non temere: nessuno dal monitor ti osserva (sicuro? Meglio essere attenti... controlla le impostazioni di privacy della fotocamera), per cui corri ad informarti facendo clic sul link sotto.

Se sei tra quegli eletti che hanno colto la citazione, hai tutta la mia approvazione.

Soddisfa la tua curiosità

Riassunto per pigri

Se i titoli dei menu non ti sono chiari, al tuo posto mi preoccuperei. Vabbè oggi mi sento magnanimo e ammetto che alcuni sono criptici o ambigui, per cui ho deciso di metterti a disposizione un riassunto che ti spiega in breve cosa troverai in questo sito.

Dissipa i tuoi dubbi