Mini How-To per creare un componente Joomla 1.5 conforme alle regole di traduzione SEF di Joomla!
Innanzitutto cominciamo con il costruire la struttura del nostro componente:
andiamo nella cartella components del nostro sito Joomla! e creiamo una nuova cartella: com_nomecomponente.
All'interno di questa cartella facciamo subito 3 files:
- nomecomponente.html.php
- nomecomponente.php
- __router.php
Partiamo con il seguire quanto scritto qui:
blog.joomcode.com
quindi apro il file nomecomponente.php e scrivo:
<?php
//no direct access
defined('_JEXEC') or die('Restricted access');
echo '<div class="componentheading">Componente Joomla! </div>';
?>
e per vedere che tutto sia come deve essere vado sul mio sito ( in locale sperabilmente, altrimenti dove l'ho messo )
e scrivo:
http://nomesito_joomla/index.php?option=com_nomecomponente
dove nomesito_joomla sarà localhost se avete fatto un'installazione locale sulla root, sarà www.nomedito.it se lo state provando online, www.nomesito.it/joomla se lo avete messo in una sottocartella e cosi' via.
Se tutto è andato come deve, avrete una pagina con la scritta "Componente Joomla!" nel vostro joomla.
Al momento si sorvolerà sull'utilità della cosa.
Cominciamo a rendere il tutto un po' piu' complicato:
modifichiamo il nostro file componente.php e rendiamolo così:
<?php
//no direct access
defined('_JEXEC') or die('Restricted access');
require_once(JApplicationHelper::getPath('html'));
echo '<div class="componentheading">Componente Joomla!</div>';
switch($task) {
default:
showMain($option);
break;
}
function showMain($option){
HTML_componente::showMain($option);
}
?>
La riga di require_once va a pigliarsi quello che c'e' scritto nel file componente.html.php, switch($task) serve per analizzare l'eventuale valore
di una variabile ( task appunto ) che viene passata al componente.
showMain è la funzione chiamata mentre HTML_componente::showMain() è la chiamata alla funzione contenuta nella classe HTML_componente,
che al momento non abbiamo ancora fatto e che si andrà a fare in componente.html.php.
Apro il file componente.html.php e scrivo:
<?php
defined('_JEXEC') or die('Restricted access');
class HTML_componente {
function showMain($option) {
echo 'richiamato dalla classe.';
}
}
?>
richiamate la pagina index.php?option=com_componente
e come vedete ora viene aggiunta la scritta richiamata dalla funzione showMain().
Può sembrare cervellotico come metodo, ed in effetti per scrivere "Hello World" a video, lo è.
Se però si comincia a fare i giochini seri, la separazione dei 2 file diventa decisamente utile.
Altro passo: andiamo nel nostro lato amministrazione, menu, aggiungiamo una nuova voce di menu.
Poichè stiam facendo una cosa al volo, non abbiamo ancora fatto un lato amministrazione del componente e via dicendo,
L'unico modo per avere un link che punti al mio nuovo componente è quello di scrivere direttamente l'url.
Aggiungo quindi un external link e lo faccio puntare a index.php?option=com_componente
Ricarico la mia home di Joomla!, clicco sulla voce di menu ed eccoci.
Come si potrà facilmente notare, l'indirizzo di riferimento è incomprensibile.
www.nomesito.it/index.php?option=com_componente è molto meno leggibile di www.nomesito.it/componente.html
Gli sviluppatori di Joomla! lo sapevano, quindi hanno dato la possibilità con 3 click di risolvere il problema.
Lato amministrazione, Site --> Global Configuration --> SEO Settings.
Se le impostate tutte e 3 a yes quello che otterrete è esattamente www.nomesito.it/componente.html
Se non impostate il mod_rewrite quello che otterrete è www.nomesito.it/index.php/componente.html
TUTTO VERO TRANNE PER IL VOSTRO COMPONENTE.
Quello verrà tradotto con www.nomesito.it/index.php/components/componente
che fa schifo, pur essendo comunque piu' comprensibile e digeribile per i motori di ricerca.
Quello che ci serve è definire le funzioni di route per il nostro componente.
come descritto nella
documentazione sul routing di Joomla
Rinomino il mio file __route.php in route.php e dentro scrivo:
<?php
function componenteBuildRoute( &$query ){
$segments = array();
return $segments;
}
function componenteParseRoute( $segments ){
$vars = array();
switch($segments[0]){}
return $vars;
}
?>
cosi' com'e', non fa nulla ma visto che il mio componente non fa nulla, va bene cosi'.
Ricarico la pagina e provo il link.
Ancota niente, perchè ?
Perchè Joomla! fa un controllo sul link e su a cosa punta. Se il link richiama com_componente ma, ad esempio,
punta a com_content ( per uno strano giro ) allora traduce male.
In questo caso il probelma deriva dal non aver mai installato il componente.
Per chiarezza il giro che viene fatto è pressapoco questo:
controllo la voce di menu in #__menu, controllo il link ed in particolare a cosa riferisce l'option.
Controllo se component_id è attivo (>0). Se lo è, vado a vedere in #__components a che componente fa riferimento.
Se option di #__menu.link:option == #__components.option allora traduco bene
Altrimenti traduco male.
Il problema di risolve automaticamente installando il componente come si deve e facendo anche il lato amministrazione.
A quel punto il link lo faccio direttamente da menu verso il componente e non forzando l'url.
Per risolverlo al volo, tramite un qualsiasi tool ( nel mio caso phpmyadmin ) entrare nel DB joomla ed andare nella tabella
#__contents.
Inserire una nuova voce con
name: componente
admin_menu_link: option=com_componente
option: com_componente
e prendere nota dell'ID assegnato a questa nuova entri.
Spostarsi nella tabella #__menu e andare alla riga corrispondente alla voce che avevamo inserito per linkare il componente.
Probabilmente l'ultima inserita.
A questo punto editate l'entry e alla voce componentid mettete il valore che vi siete annotati prima.
Chiudete pure la pagina di amministrazione di MySQL, tornate al sito, ricaricate ed ecco fatto.
www.miosito.it/componente.html