Tutorial: creare un componente per Joomla 1.5
Questo post è un tutorial scritto per introdurre allo sviluppo di componenti per Joomla 1.5.
Il componente creato per l'esempio si chiama com_allarmi, e permette agli utenti registrati al sito di inserire da frontend un allarme nel sistema, memorizzato in una apposita tabella del DB MySQL.
Un allarme è composto da un'ora e da un giorno. Ogni utente inserisce allarmi in modo indipendente dagli altri utenti del sito, e attraverso il componente può vedere tutti gli allarmi che ha impostato.
Il backend mostra tutti gli allarmi impostati, classificati per utente.
Notare che allo scoccare degli allarmi non succede niente, è solo un esempio di applicazione
Essendo un tutorial introduttivo non ho preso in considerazione l'architettura MVC.
Prima di partire, potete scaricare il codice del componente finito.
Iniziamo
Creare un'installazione di Joomla in locale e testare che funzioni correttamente.
Se non avete un editor di codice preferito, prendete in considerazione EasyEclipse, una versione di Eclipse preconfigurato per lo sviluppo di Web Application in PHP, quindi perfetto per Joomla.
Aprire EasyEclipse e creare due progetti PHP: uno chiamato com_allarmi con location Joomla/components/com_allarmi (frontend), l'altro com_allarmi_admin con location Joomla/administrator/components/com_allarmi (backend).
All'interno della cartella frontend creare un file allarmi.php e una cartella di nome 'views'. Al suo interno creare una cartella chiamata 'all'.
All'interno della cartella backend creare un file admin.allami.php
FRONTEND
Aprire il file allarmi.php ed inserire le seguenti linee di codice
< ?php //no direct access defined('_JEXEC') or die('Restricted access'); echo ' <div class="componentheading">Allarmi' ?>
La riga
defined('_JEXEC') or die('Restricted access');
indica che il codice deve essere eseguito all'interno di Joomla e non può essere richiamato dall'esterno.
echo ' <div class="componentheading">Allarmi</div> '
inserisce il div nella pagina HTML.
Puntare ora il browser all'indirizzo joomla/index.php?option=com_allarmi.
Verrà visualizzata una pagina riportante il titolo del componente, così come lo abbiamo dichiarato usando la classe CSS componentheading.

/FRONTEND
BACKEND
In admin.allarmi.php inseriamo il codice
< ?php //no direct access defined('_JEXEC') or die('Restricted access'); echo 'Allarmi'; ?>
Apriamo la pagina joomla/administrator/index.php?option=com_allarmi, dove vedremo la scritta 'Allarmi' che campeggia all'interno di una pagina vuota.
/BACKEND
Come abbiamo potuto notare Joomla divide nettamente il codice inerente la parte di amministrazione (backend) e la parte visualizzata all'interno del sito (frontend).
Per poter inserire il componente all'interno del workflow di Joomla è necessario registrarlo nel database, nella tabella jos_components.
Aprite il vostro tool preferito per accedere al database (CocoaMySQL o phpMyAdmin sono perfetti, oppure direttamente la console di MySQL) e create una nuova voce nella tabella usando il codice
INSERT INTO `jos_components` VALUES (42, 'Allarmi', 'option=com_allarmi', 0, 0, 'option=com_allarmi', 'Allarmi', 'com_allarmi', 0, '', 0, '', 1);
Se viene generato un errore, cambiare il primo valore per modificare il numero univoco che identifica il componente (l'ID).
A questo punto accedendo al backend selezionare il menu Components: dovrebbe essere visibile la voce 'Allarmi', e selezionandola dovrebbe aprirsi la pagina che abbiamo visto poco fa.

Possiamo anche aggiungere un collegamento al frontend inserendo una voce nel main menu: selezionare Menus, Main Menu, premere il pulsante New, selezionare la voce Internal Link -> Allarmi. Selezionare All e dare un titolo alla voce di menu: "Allarmi", quindi premere Save.
In frontend sarà visibile la voce "Allarmi" nel menu principale, e premendola verrà visualizzata la pagina vista in precedenza.
Bene! Lo scheletro base del componente è stato creato. Ma da bravo scheletro, questo componente non fa ancora nulla.
Costuiamo intorno allo scheletro
Creiamo una tabella nel DB per memorizzare gli allarmi che gli utenti inseriscono.
CREATE TABLE `jos_allarmi` (
`id` int(11) DEFAULT NULL auto_increment,
`user` int(11) DEFAULT NULL,
`orario` time DEFAULT NULL,
`giorno` date DEFAULT NULL,
primary key(id)
);
BACKEND
Creiamo la cartella tables ed un file chiamato allarme.php.
< ?php //no direct access defined('_JEXEC') or die('Restricted access'); class TableAllarme extends JTable { var $id = null; var $user = null; var $orario = null; var $giorno = null; function __construct(&$db) { parent::__construct( '#__allarmi', 'id', $db); } } ?>
Questo file viene creato per gestire la tabella del database in modo che non dobbiamo scrivere il codice per interagire direttamente con l'SQL, ma astraiamo il concetto, usando la classe JTable - da cui tra l'altro ereditiamo i metodi bind(), store(), load() e delete(), che useremo più tardi.
/BACKEND
FRONTEND
Torniamo ad agire sul file allarmi.php, inserendo il codice
< ?php //no direct access defined('_JEXEC') or die('Restricted access'); echo ' <div class="componentheading">Allarmi'; jimport('joomla.application.helper'); require_once(JApplicationHelper::getPath('html')); JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.'components'.DS.$option.DS.'tables'); switch($task) { default: showAllarmi($option); break; } function showAllarmi($option) { $user =& JFactory::getUser(); $db =& JFactory::getDBO(); $query = "SELECT * FROM #__allarmi WHERE user=".$user->id." ORDER BY giorno DESC"; $db->setQuery($query); $rows = $db->loadObjectList(); if ($db->getErrorNum()) { echo $db->stderr(); return false; } HTML_allarmi::showAllarmi($rows, $option); } ?>
Questo codice importa la classe helper che ci servirà per includere il file allarmi.html.php e la classe che abbiamo definito per usare la tabella jos_allarme.
Il codice è molto semplice e in ogni caso viene lanciata la funzione showAllarmi, che si collega al database e recupera tutte le voci presenti nella tabella jos_allarmi, quindi passa il comando ad allarmi.html.php.
Provando a ricaricare nel browser la pagina joomla/index.php?option=com_allarmi verrà mostrato un messaggio di errore: Joomla non trova il file che abbiamo indicato di includere. Lo creiamo ora, allarmi.html.php.
< ?php //no direct access defined('_JEXEC') or die('Restricted access'); class HTML_allarmi { function showAllarmi($rows, $option) { ?> <table>< ?php echo " <tr> <th>ID</th> <th>Utente</th> <th>Ora</th> <th>Giorno</th> "; foreach ($rows as $row) { echo ' <tr> <td>'.$row->id.'</td> <td>'.$row->user.'</td> <td>'.$row->orario.'</td> <td>'.$row->giorno.'</td> </tr> '; } ?></table> < ?php } } ?>
Questo file organizza una semplice tabella mostrando i valori degli allarmi.
Inseriamo un valore di esempio nel database
INSERT INTO `jos_allarmi`
VALUES (
'1', '62', NOW( ) , '2008-08-21'
);
Dove 62 è l'id dell'utente amministratore.
Se apriamo la pagina di frontend come utente non registrato, non vedremo nessun allarme. Facendo il login come amministratore vedremo invece una riga con i valori appena inseriti nel database.

In effetti è più indicato aggiungere la voce che componente nel menu User, che compare soltanto quando un utente effettua il login.
/FRONTEND
BACKEND
Apriamo l'interfaccia di amministrazione ed eliminiamo la voce Allarmi nel Main Menu, ed inseriamola nello User Menu.
Il backend per ora non svolge alcuna operazione. Vediamo di elencare tutti gli allarmi impostati.
In admin.allarmi.php inseriamo
< ?php //no direct access defined('_JEXEC') or die('Restricted access'); jimport('joomla.application.helper'); require_once(JApplicationHelper::getPath('admin_html')); JTable::addIncludePath(JPATH_COMPONENT.DS.'tables'); switch($task) { default: showAllarmi($option); break; } function showAllarmi($option) { $db =& JFactory::getDBO(); $query = "SELECT * FROM #__allarmi ORDER BY giorno DESC"; $db->setQuery($query); $rows = $db->loadObjectList(); if ($db->getErrorNum()) { echo $db->stderr(); return false; } HTML_allarmi::showAllarmi($rows, $option); } ?>
Ed in admin.allarmi.html.php
< ?php //no direct access defined('_JEXEC') or die('Restricted access'); class HTML_allarmi { function showAllarmi($rows, $option) { ?> <table>< ?php echo " <tr> <th>ID</th> <th>Utente</th> <th>Ora</th> <th>Giorno</th> "; foreach ($rows as $row) { echo ' <tr> <td>'.$row->id.'</td> <td>'.$row->user.'</td> <td>'.$row->orario.'</td> <td>'.$row->giorno.'</td> </tr> '; } ?></table> < ?php } } ?>
Questo codice ricalca quasi fedelmente quello usato per il frontend, le differenze risiedono nel file admin.allarmi.php, dove il path per la cartella tables è diverso e non ci interessano le informazioni sull'utente, in quanto carichiamo tutti gli allarmi inseriti.

/BACKEND
Creiamo una form per inserire nuovi allarmi
Non vi è ancora modo di inserire un nuovo allarme, per cui ora modifichiamo il frontend.
FRONTEND
Prendiamo il file allarmi.html.php e modifichiamo la funzione showAllarmi, in modo che inserisca un link alla fine della tabella, che rimandi al componente, con task newAlarm. Inoltre aggiungiamo la funzione newAlarm, che ha il compito di mostrare la form per l'inserimento di un nuovo allarme.
function showAllarmi($rows, $option) { ?> <table>< ?php echo " <tr> <th>ID</th> <th>Utente</th> <th>Ora</th> <th>Giorno</th> "; foreach ($rows as $row) { echo ' <tr> <td>'.$row->id.'</td> <td>'.$row->user.'</td> <td>'.$row->orario.'</td> <td>'.$row->giorno.'</td> </tr> '; } ?></table> < ?php echo '<a href="index.php?option=com_allarmi&task=newAlarm">Crea nuovo allarme'; } function newAlarm($id, $option) { JHTML::_('behavior.calendar'); ?> <form action="index.php?option=com_allarmi&task=salvaAllarme" method="post" name="formNuovoAllarme" id="formNuovoAllarme"> <table> <tr> <td> Orario: <input type="text" name="orario" id="orario" /> </td> </tr> <tr> <td> Giorno: <input type="text" name="giorno" id="giorno" /> <input type="reset" class="button" value="..." onclick="return showCalendar('giorno', '%d-%m-%Y');" /> </td> </tr> <tr> </tr> </table> <input type="hidden" name="user" value="<?php echo $id; ?/>" /> <input type="submit" class="button" value="crea" /> </form> < ? }
Inseriamo il task newAlarm in allarmi.php
switch($task) { case newAlarm: newAlarm($option); break; default: showAllarmi($option); break; }
Quindi, sempre in allarmi.php, creiamo la funzione newAlarm.
function newAlarm($option) { $id = null; $user =& JFactory::getUser(); if($user->id) { $id = $user->id; } $row =& JTable::getInstance('allarme', 'Table'); if (!$row->bind(JRequest::get('post'))) { echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n"; exit(); } HTML_allarmi::newAlarm($id, $option); }
Infine creiamo la funzione salvaAllarme, chiamata dalla form.
function salvaAllarme ($option) { global $mainframe; $row =& JTable::getInstance('allarme', 'Table'); if (!$row->bind(JRequest::get('post'))) { echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n"; exit(); } if (!$row->store()) { echo "<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n"; exit(); } $mainframe->redirect('index.php?option='.$option, 'Allarme salvato'); }
Dobbiamo ulteriormente modificare lo switch
switch($task) { case newAlarm: newAlarm($option); break; case salvaAllarme: salvaAllarme($option); break; default: showAllarmi($option); break; }
Facciamo una nuova modifica a showAllarmi, in modo che non sia visibile agli utenti non registrati.
function showAllarmi($option) { $user =& JFactory::getUser(); if($user->id == 0) { echo "Occorre il login per visualizzare questa pagina"; } else { $db =& JFactory::getDBO(); $query = "SELECT * FROM #__allarmi WHERE user=".$user->id." ORDER BY giorno DESC"; $db->setQuery($query); $rows = $db->loadObjectList(); if ($db->getErrorNum()) { echo $db->stderr(); return false; } HTML_allarmi::showAllarmi($rows, $option); } }
Siamo a buon punto
A questo punto il componente funziona come dovrebbe: provate ad effettuare il login come utente e premete il pulsante "Crea nuovo allarme".

Inserite l'ora nel formato di MySQL, ovvero 17:34:37 e selezionate una data dal calendario premendo il pulsante "...".
Cliccando 'Crea' verrà inserito l'allarme nel database, e mostrato insieme agli altri che avete creato.

Effettuando il logout e collegandosi come un altro utente, non verranno visualizzati gli allarmi degli altri utenti, mentre da admin sarà possibile vedere tutto.

Conclusioni
Questo componente è un primo esempio di sviluppo per Joomla 1.5. Prima di poter usare un componente di questo tipo occorre come minimo introdurre una protezione contro SQL injection, andando a controllare bene i valori che vengono digitati nella form.
In caso contrario il componente potrebbe essere soggetto a problemi di sicurezza.
E' possibile scaricare il codice del componente.
August 22nd, 2008 at 16:00
Bravo Flavio ma…
eheh un paio di critiche non te le risparmio! >D
1° – sarebbe stato più scorrevole suddividere il post in più pagine
2° – dato che credo che questa guida vada incontro a neofiti della creazione estensioni in Joomla!, secondo me l’hai fatta poco basilare, de tipo frasi come:
“Inseriamo un valore di esempio nel database
INSERT INTO `jos_allarmi`
VALUES (
‘1′, ‘62′, NOW( ) , ‘2008-08-21′
);
Dove 62 è l’id dell’utente amministratore.”
…un utente medio non saprebbe nemmeno COME inserire tale dato XD
Ciò non toglie che come al solito ti vengono le idee prima di me! Bravo!
August 22nd, 2008 at 17:19
Grazie Odino, in effetti ho dato per scontate alcune cose.. come hai fatto notare tu, l’uso di un database e la conoscenza di PHP.
Se uno decide di avventurarsi nella realizzazione di estensioni per Joomla.. credo che queste cose siano da conoscere
Però hai fatto bene a farmelo notare!
Hai ragione riguardo alla paginazione, probabilmente sarebbe stato meglio scrivere due post diversi, parte 1 e parte 2.
Mi sono accorto di quant’era lunga soltanto dopo averla pubblicata
Non vorrei iniziare a prendere il brutto vizio di scrivere post-papiri
August 22nd, 2008 at 17:24
Bah, non prendertela eh, anzi se scrivi papiri li leggo comunque! ![]()
Il fatto era che più dai per scontato delle cose meno gente avrai qui a leggere, e siccome per me tante delle cose che scrivi sono risorse che MOLTI dovrebbero apprendere…tutto qui.
P.S. Hai 2 mail
August 25th, 2008 at 18:42
ciao
complimenti per il tuo tutorial davvero chiaro..ma se avessi voluto avere una pagina in cui da normale utente potevo vedere tutti gli allarmi inseriti dagli altri utenti come avrei dovuto fare??
ciao e grazie
August 25th, 2008 at 19:13
Ciao smokingOro
Innanzitutto bisognerebbe creare una nuova View ed associarla al Main menu, accessibile a tutti, con il compito di mostrare
index.php?option=’.$option.’&task=showTuttiAllarmi
Quindi nel file allarmi.php avresti un nuovo case nello switch($task), chiamato ad esempio showTuttiAllarmi, con relativa funzione.
Nel file allarmi.html.php ci sarebbe la rispettiva funzione usata per generare effettivamente l’elenco degli allarmi.
Spero di essere stato (un po’) chiaro
Ciao
August 26th, 2008 at 13:13
ciao, anche io trovo molto utile questo tutorial.. è esattamente quello che cercavo!
Purtroppo però sono fermo di fronte ad un ostacolo che da solo non riesco a superare:
Nel FrontEnd e nel BackEnd creo i file e le cartelle necessarie, li compilo con il codice descritto nella procedura. Ho anche aggiunto la riga di dati nella tabella jos_components.. fin quì tutto ok credo.
Il risultato è che se faccio puntare il browser sul componente mi da errore 404 ‘componente non trovato’.
Nel BackEnd trovo la voce relativa al componente nell’apposito menu di amministrazione, ma l’errore è lo stesso.
Dove sbaglio? Grazie in anticipo.
August 27th, 2008 at 11:51
Grande, veramnte interessante.
Ma visto la tua competenza, perchè non crei un tutorial
dove viene illustrata l’architettura di Joomla, per intenderci
il progetto Joomla rapresentato tramite il suo diagramma di classi,sarebbe interessante riuscire a capire le vaire funzionalità
delle classi.
Sai indicarmi qualcorsa che si trovi in rete?
Coplimenti per l’articolo su Html.it
Buon lavoro.
August 27th, 2008 at 12:27
@cristian: Ciao, forse hai gli URL SEF abilitati? Altrimenti non saprei dirti. Ho pubblicato il codice del componente finito, così puoi confrontarlo e vedere se c’è qualcosa di sbagliato. http://www.copesflavio.com/download/com_allarmi.zip
@cosb2002: Grazie per i complimenti, quello che suggerisci sarebbe davvero una cosa interessante.. magari un’esplorazione di Joomla a puntate
Oltre al Development Wiki http://dev.joomla.org/component/option,com_jd-wiki/Itemid,32/ non saprei cosa suggerirti
August 29th, 2008 at 02:23
ciao flavio.. gli URL SEF sono disabilitati. E anche caricando il tuo componente mi da lo stesso errore. Ho confrontato i codici, sono uguali.
Avrò qualche magagna nella struttura delle directory! E’ un peccato, mi piaceva l’idea di imparare a sviluppare un po’. Va beh.. mi darò ai contenuti nel frattempo.
August 29th, 2008 at 17:04
@cristian: il nome del componente della view non è lo stesso riportato in altri file, vero?
L’errore in questione è una cavolata, vai nella view di default e trova dove il nominativo non corrisponde.
Se invece l’errore si presenta con altri componenti: “ahi, ahi…”
August 29th, 2008 at 18:18
@odiono: i componenti hanno nomi univoci. Fortunatamente l’errore mi si presenta solo con quello che ho creato io e quello che ha postato flavio. I nativi e quelli che installo e disinstallo regolarmente vanno benissimo! Non so che dire…. non può essere un problema di directory anzichè di nome? Il mio sito sta sotto root/Joomla/
August 30th, 2008 at 11:51
@cristian:nono allora il problema è proprio l’architettura del tuo componente, o meglio, il nome che la view interpreta.
Come si chiama la view di default del back-end?
E qual’è l’URL che ti restituisce l’errore 400 ( scrivi pure l’URL )?
@flavio: figurati, i’m waiting for your mail. Intanto sto scrivendo la mia
October 3rd, 2008 at 22:19
Ciao!!grazie veramente per la guida!!
Volevo chiederti un grosso favore!!mi potresti aiutare con il mio componente mi serve per il mio tirocinio e non so piu che fare!!non riesco ad andare avanti!!
Fammi saxe grazie mille
October 11th, 2008 at 14:51
Allora io ho cominciato a sviluppare il componente che consiste della gestione del prestito di risorse del nostro centro di calcolo!!
FRONTEND:
l’utente del componente deve poter chiedere in prestito un risorsa di quelle inserite dall’amministratore e se la risorsa non e’ libera mettersi in lista di attesa, in piu deve poter fare l’upload di un file associata a una precisa risorsa e prima della scadenza della risorsa di 2 giorni il sistema dovrebbe mandare un email di avviso all’utente ricordandogli di restituirla in tempo. L’amministratore cmq deve poter richiedere un risorsa che gli interessa anche prima della scadenza sempre mandando un email all’utente che l’aveva presa in prestito.
BACKEND:
l’amministratore dovrebbe poter
- visualizzare le info sugli utenti
- aggiungere, visualizzare e modificare un risorsa
- fare l’upload dei file e associarli ad una determinata risorsa
- poter effettuare una ricerca di risorse (vale anche per l’utente nel front end) e di un utente con determinati criteri
- visualizzare le scadenze dei prestiti
- mandare un email di comunicazione agli utente
io ho fatto i vari form per inserire..e veramente non riesco ad organizzare le mie idee e come sviluppare le cose!! … in poche parole mi serve una guida che mi illumini la strada! ;p
se per te non e’ un problema ti mando quello che ho fatto per email!
October 30th, 2008 at 10:23
Ottima guida, Direi “complicata” al punto giusto…se uno è arrivato qui e vuole sviluppare un componente per Joomla si suppone che abbia come minimo un po’ di familiarità con MySql, php, phMyAdmin
…(magari un po’ meno con le classi, concetti di astrazione ed ereditarietà)
Non ho porvato il componente che hai scritto tu ma mi è abbastanza chiaro cosa fa e quali sono i passi per arrivarci. Adesso allo studio dell’architettura MVC!!! (hint: dai, scrivi qualcosa anche su quella)
November 13th, 2008 at 16:58
Comlimenti per il tutorial!Davvero utile.
Ho però una domanda…dopo essere arrivati a questo punto (che è già una grande soddisfazione per un neofita) come posso inserire nuovamente le icone di creazione pdf e stampa?
è obbligatorio usare l’architettura MVC?
Grazie e ancora complimenti!
November 23rd, 2008 at 17:31
Grande Flavio!!!! ![]()
Mi viene in mente la pubblicità del caffè… non ricordo quale
“Se me lo dicevi prima!… Ormai!”
Ci ho messo un sacco di tempo a capire come funzionavano i componenti di Joomla. Se avessi letto prima la tua guida avrei risparmiato metà del tempo ;-D
Ormai!
Quoto le osservazioni di Odino ma forse potrebbe bastare anche una postilla nell’introduzione del tipo: per comprendere questo tutorial bisogna avere nozioni minime di…
Ottimo tutorial comunque. Ben fatto!
Ciao
November 23rd, 2008 at 18:39
Ciao bigham, ti ringrazio per i complimenti! Per il discorso del caffè.. diciamo meglio tardi che mai
December 10th, 2008 at 18:45
Ciao, grazie per il tutorial!
Ho visto che hai usato un’unica tabella.
Dovendone usare invece di piu, ad esempio 3, cosa dovrei fare? Dovrei creare dentro la dir “tables” altrettanti file con le classi per gestire le tabelle? Oppure una sola?
December 10th, 2008 at 19:16
Ciao Claudio, si dovresti creare un file per ogni tabella che usi.
Es.
file tables/elementi.php class TableElementi -> jos_elementi
file tables/categorie.php class TableCategorie -> jos_categorie_elementi
December 16th, 2008 at 18:22
Ciao Flavio,
ho fatto anche questo ed è tutto ok! Grazie mille!
Una sola cosa non ho capito: su molte pagine di Joomla vedo le classiche iconcine di intestazione contenuto (stampa, esporta pdf ecc).
Per metterle nelle pagine dei nostri moduli basta richiamare una funzione di Joomla o bisogna sviluppare qualcosa nel nostro codice?
December 16th, 2008 at 18:39
Ciao Claudio, bene sono contento che tu abbia risolto!
Per quanto riguarda le icone di intestazione, vengono visualizzate dal componente com_content.. e sono specifiche per quel componente. Certo puoi modificare i file per realizzare questa funzione anche nella tua estensione, prova a guardare il file
components/com_content/views/article/tmpl/default.php, linee 25-41
e
components/com_content/helpers/icon.php
December 18th, 2008 at 13:06
Ciao,
complimenti per la guida!!!
avrei la necessita di cambiare il nome dei componenti sul menu del back-end, mi potresti spiegare come dovrei fare???
esempio vorrei che il componente joomlapack nel menu di amministrazione si chiamasse BACKUP
grazie anticipatamente
December 18th, 2008 at 14:15
Ciao Lorenzo, devi agire sul database.
Usando phpMyAdmin o un programma per accedere al database, apri la tabella jos_components e modifichi il valore della colonna admin_menu_alt corrispondente alla linea del componente joomlapack.
December 18th, 2008 at 16:53
Ciao Flavio ti chiedo di controllare che per modificare il nome di un componente in backend bisogni modificare “admin_menu_alt” e non direttamente “name”
@lorenzo: prova o altrimenti aspetta il fine settimana che esce il componente COMNAME, realizzato appositamente per questo
December 18th, 2008 at 17:00
Aaah grande Odino, hai proprio ragione
grazie per la correzione! ..ma a che serve allora admin_menu_alt?
December 18th, 2008 at 17:07
Allora seguendo la logica dell’aternative text si può pensare che sia un testo che vada ad ampliare la descrizione del mero nome del componente.
Occhio a una cosa: i componenti di default, quelli con iscore = 1 sul DB, anche agendo su “name”, “admin_menu_alt” o altri campi sembrano non ricevere cambiamenti
December 21st, 2008 at 14:12
Ciao, complimenti per la guida.
Volevo chiederti una cosa. Sto modificando il componente, cioè sto aggiungendo dei dati, però vorrei anche creare la possibilità dal lato amministrativo di cancellare gli allarmi scaduti, oppure cambiare lo stato di esso, cioè da stato in attesa a stato scaduto. Come posso inserire in alto la barra per cancellare o cambiare lo stato?
January 6th, 2009 at 20:51
il formato del parametro &format della funzione showCalendar per funzionare deve essere questo:
showCalendar(‘giorno’, ‘%d-%m-%Y’)
January 24th, 2009 at 11:39
Mi aggrego agli altri facendoti i complimenti per il tutorial.
Solo una piccola osservazione/errore: nel tutorial, poco sotto al titolo “Costruiamo intorno allo scheletro”, successivamente a FRONTEND, descrivi la creazione del file allarme.php nella tabella tables che però deve essere inserito nel BACKEND (come dimostrato anche nel tuo stesso file zip del componente).
February 3rd, 2009 at 10:51
Salve, sono un neofita di joomla e mi sto cimentando nella creazione di componenti, però mi sono bloccato in quanto non riesco a visualizzare l’output del componente da me creato in una sezione specifica della home page.
In attesa di un cortese riscontro invio un cordiale saluto e i miei complimenti per le chiare ed esaustive dritte
February 26th, 2009 at 15:24
Innanzitutto Flavio volevo ringraziarti di cuore per l’ottima guida, davvero utile per chi come me si avvicina a joomla per la prima volta. Ho commentato pesantemente il tuo codice, per facilitare ulteriormente la vita a quelli che vogliono capire il significato dei metodi delle classi di Joomla usate nel tuo esempio. Se vuoi ti passo questi file, cosi li puoi pubblicare sul tuo sito se lo ritieni opportuno.
Inoltre una osservazione: la funzione newAlarm presente in allarmi.php non è ridondante? io ho tolto tutto ciò che sta tra l’if che setta la variabile $id e la chiamata della funzione HTML_allarmi::newAlarm($id, $option), e sembra andare tutto (anche perchè non c’è nessun form che punta alla task newAlarm). Fammi sapere, e complimenti ancora!
February 27th, 2009 at 18:36
Grazie mille Ruben, come ti ho scritto in privato il tuo contributo è molto ben accetto
newAlarm serve ad inserire nuovi allarmi.. viene chiamata da un link nella funzione showAllarmi.
Se la togli non puoi inserire nuovi allarmi
February 27th, 2009 at 18:38
@Enzo: scusa per il ritardo nella risposta, ma essendo questo un componente, non puoi normalmente inserirlo all’interno di un altro componente (com_content per la frontpage)
Prova a guardare questa estensione, potrebbe esserti utile
http://blog.joocode.com/cms/joomla/come-inserire-piu-componenti-in-una-pagina/
March 8th, 2009 at 11:42
Ottimo questo tutorial. Grazie flavio!
Avrei però un paio di dubbi.
Collegandomi a quanto chiesto da Claudio.. per l’utilizzo di più tabelle.
E’ chiaro il concetto di utilizzare una classe figlia di JTable per ognuna delle nuove tabelle; ma devo sempre ereditare (#__miatabella, id, e $db) da JTable?
A supporto di queste nuove classi dovrei creare il rispettivo file miatabella.html.php giusto?
March 9th, 2009 at 13:45
Ciao Cristian, si devi sempre ereditare da JTable.
Devo scrivere un tutorial che tenga conto dell’architettura MVC perchè non riesco più a vivere senza di essa
Le informazioni contenute in questo tutorial sono ancora valide, ma usando MVC cambiano diverse cose.
March 9th, 2009 at 20:30
E’ vero.. hai proprio ragione! Infatti io sono partito proprio dal tuo spunto (utilissimo) e sto cercando di capire come funzione il MVC di Joomla!
A supporto ho un libro grazie al quale mi faccio un po’ di cultura sulle classi.. ma a volte ho l’impressione che quelli di Joomla! siano davvero avantissimo rispetto all’accademia del OOP.
Con la documentazione online di Joomla! riesco ad apprendere qualche concetto di base sull’architettura del CMS.. e sono anche riuscito ad implementare un backend con add-edit e delete delle items su tabelle personalizzate.
Ma mi sento davvero agli antipodi. Se scrivi un tutorial su questa cosa sei un grande! In rete non c’è moltissimo.
March 9th, 2009 at 20:54
Ti consiglio di dare un’occhiata a questo libro, per 17€ ne vale davvero la pena! http://www.packtpub.com/learning-joomla-1.5-extension-development/book
March 25th, 2009 at 23:27
Grande!! Ottimo tutorial..
Mi chiedvo una cosa..
per creare un zip d’installazione corretto del componente basta rispettare il tuo zip oppure bisogna anche abbinare un file xml con le varie direttive ecc ecc.. ???
March 26th, 2009 at 09:42
Ciao Mattia, si ci vuole anche il file XML che indichi a Joomla le caratteristiche del componente.
March 27th, 2009 at 00:06
Ciao Flavio,
anche se già te l’hanno detto in tanti, complimenti per questo tutorial, mi stà facendo luce su molte cose. Però ho riscontrato un problema all’inizio quando dici di puntare il browser ad un determinato indirizzo sia per il front end che per il back end. Io stò cercando di costruire un componente di ricerca, ed ho sostituito “allarmi” con “search”. Quando punto all’indirzzo
http://localhost/joomla/index.php?option=com_search_new, non appare nulla, anzi il browser mi dice che non trova la pagina.
Perchè questo comportamento?
Ciao e grazie 1000…
March 27th, 2009 at 09:52
Ciao Francesco, hai inserito la voce relativa al componente nella tabella jos_components?
March 27th, 2009 at 17:32
Ciao Flavio,
ho inserito il componente sulla tabella jos_components, ed ho anche ricominciato nuovamente il progetto, ma non ne vuole sapere. L’errore con cui risponde Apache è il famoso “404″, col quale non torva il componente…. Ti viene in mente qualche altra ipotesi?
Grazie 1000
March 27th, 2009 at 17:58
Ciao Flavio,
ho trovato l’errore……
Per ora tutto risolto, continuo con il tuo tutorial e spero di non darti più fastidio…
Grazie ancora…..
March 30th, 2009 at 11:24
Ciao, sono appena approdato alla tua bellissima guida e ti ringrazio per aver messo a disposizione del net il tuo tempo. Vedo che è abbastanza datato l’articolo ma devo riesumarlo per necessità e quindi arrivo alla fatidica domanda:
in un nuovo allarme, se oltre all’id, l’ora, ecc., volessi aggiungere altri dati come ad esempio il nome dell’utente e anche l’inidirizzo email come dovrei fare? Sto facendo prove da un paio di giorni ma non riesco proprio a venirne fuori anche perché non capisco qual’è la parte dello script che invia i dati al db. Ciao e grazie in anticipo.
March 30th, 2009 at 12:53
Aggiorno: Praticamente riesco a fare funzionare tutto, le variabili e tutto il resto sono ok. L’unica cosa e che non capisco come fare ad inviare i dati al db. Invia soltanto quelli di default dello script (id, data, ora). Forse bisogna andare a modificare anche i file sotto admin?
March 30th, 2009 at 13:11
Ciao, i dati sono inseriti autonomamente usando le funzioni $row->bind e $row->store
nella cartella di amministrazione vi è il file tables/allarme.php.
Hai aggiornato i campi in esso contenuti?
March 30th, 2009 at 13:57
Wow che tempismo! Grazie per l’attenzione che mi dai. Devi sapere che non sto proprio terra terra col php anzi, me la cavo abbastanza bene. Il problema è con joomla, finché si tratta di usare moduli altrui è tutto facile. Quando invece decidi di fare qualcosa di tuo, ecco che sorgono montagne di problemi. Tornando alla questione. Grazie al tuo tutorial ed analizzando per benino lo script, in effetti avevo sistemato tutto a dovere ma essendomi sfuggito il file table/allarme.php e non avendo dichiarato alcuna variabile “username” era ovvio che il dato non veniva memorizzato nel db. Fino qui problema risolto e ti ringrazio infinitamente anche per essere stato disponibile a rispondermi ad un articolo piuttosto datato. Spero tu continui a produrre altri tutorial che non mancherò di seguire volentieri.
April 7th, 2009 at 15:50
Ciao Flavio,
preso dal lavoro non avevo più visto il forum, in pratica avevo scritto in modo diverso il file che viene gestito nella parte di amministrazione. In pratica un banale errore di scrittura…..
May 4th, 2009 at 17:02
Ciao Flavio,
avrei bisogno di un consiglio, riguardo a ciò che stò sviluppando che è cominciato da poco più di un mese. Oltre alle mie difficoltà, ci sono stati anche alcuni cambi di requisiti che ne hanno rallentato notevolmente lo sviluppo. Devo personalizzare la ricerca di Joomla, ed il mio dubbio riguarda se devo sviluppare un componente, un modulo, oppure un plug-in.
Puoi indicarmi qualcosa?
Ciao e grazie 1000….
May 4th, 2009 at 21:58
Scusatemi… ho seguito la guida… quando clicco su crea nuovo allarme dal backend mi viene mostrato il seguente messaggio di errore:
Fatal error: Call to a member function bind() on a non-object in X:\Projects\PHP\Joomla\components\com_allarmi\allarmi.php on line 54
che corrisponde alla seguente riga:
if (!$row->bind(JRequest::get(‘post’))) …
qualche consiglio?
Ho seguito il tutorial alla lettera…
gli allarmi si vedono… ho problemi solo quando clicco su crea nuovo allarme…
Hlp me please
May 4th, 2009 at 22:06
Risolto… scusatemi… piccolo errore di distrazione… minimo ma fondamentale
May 26th, 2009 at 12:25
>>Risolto… scusatemi… piccolo errore di distrazione… minimo ma fondamentale
Ho lo stesso problema anch’io… qual’era il “piccolo errore di distrazione”?
Grazie!
May 27th, 2009 at 09:14
Ok, ho trovato il problema: non avevo messo il file di definizione della tabella (classe) sotto la directory “/table” del mio componente…
Grazie del tutorial, un primo passo, ma il primo passo è sempre quello più importante.
May 29th, 2009 at 12:06
Ragazzi,
il tutorial è fantastico, ma farne uno da solo è un casino. QUalcuno mi sa consigliare un tutorial che spieghi PHP ad oggetti e il core di Joomla?
Grazie. Ciao!
June 3rd, 2009 at 23:46
Ciao, complimenti per la guida.
Sto modificando questo componente per creare un’agenda, però non riesco a creare il codice per eliminare un record sia dal FRONTEND che dal BACKEND. Come posso fare?
July 11th, 2009 at 16:45
Ciao,
complimenti per il tutorial anche se non proprio base, due commenti sulle classi e i metodi non avrebbero guastato
Volevo chiederti come poter implementare una modifica.
Come sarebbe possibile creare un modulo da inserire a lato nel menù con l’elenco di tutti gli utenti che hanno inserito allarmi e, una volta cliccato sul nome, mostrasse gli elenchi di quell’utente ?
L’elenco degli utenti lo recuperiamo con una distinct sulla tabella, ma quello che non so fare costruire un l’ulteriore modulo e “collegarlo” al componente
Grazie mille …
July 14th, 2009 at 17:28
Ciao Bruce, per chiarimenti su classi e metodi cerca su Google, introdurre la programmazione ad oggetti è fuori dallo scopo di questo tutorial, altrimenti sarebbe stato decisamente più lungo
I moduli funzionano in modo diverso, come puoi vedere nel codice di quelli forniti con Joomla.. in pratica ti basta fare una query che estragga i dati che cerchi, quindi presentare i nomi degli utenti scorrendo i risultati provenienti dal database.
July 14th, 2009 at 18:08
Ciao e grazie della risposta …
Non intendevo un trattato generale su metodi e classi
ma un veloce commento su quelli usati …
Quello che hai scritto sul modulo da implementare era la parte che sapevo già fare
mi mancava il dopo … cioè come fare in modo che cliccando sull’utente con id 62 il componente mi mostri solo gli allarmi di tale utente … alla fine l’ho risolta passando tramite parametri GET l’id … non so se è il modo più ortodosso ma funziona
cioè una cosa del tipo index.php?option=com_allarmi&userid=[valore letto da db]
Ho modificato opportunamente il componente per leggere quel valore e metterlo nella where della select
Ciao
August 3rd, 2009 at 08:28
Ciao Flavio, su un componente già esistente dovrei aggiungere un controllo sulla lingua usata dall’amministratore nel backend, in pratica quella scelta al momento della login del pannello di controllo.
Dove posso trovare questa informazione? C’è una variabile che me la restituisce?
Grazie per il tuo lavoro!
August 3rd, 2009 at 08:36
Ciao Pippozzo, lo trovi nei parametri dell’utente
$user =& JFactory::getUser();
$user->getParam(‘admin_language’);
August 3rd, 2009 at 09:23
ops! Non mi ritorna nulla!
Mi faccio stampare in una pagina del back end la lingua ma non c’è niente, dove sbaglio?
$user =& JFactory::getUser();
$lingua = $user->getParam(’admin_language’);
echo $lingua;
Grazie x la tempestività!
August 3rd, 2009 at 10:07
In tal caso l’utente non ha scelto nessuna lingua, e viene usata quella di default. Puoi usare
$defaultLanguage =& JFactory::getLanguage();
$user =& JFactory::getUser();
echo $lingua = $user->getParam(‘admin_language’, $defaultLanguage->_lang );
October 27th, 2009 at 14:38
Trovo l’articolo ben fatto.
Sarebbe molto utile che il file allegato fosse già strutturato per l’installazione di Joomla! con l’XML e la creazione della tabella.
November 27th, 2009 at 23:35
Ottimo tutorial, e fortunatamente non il solito Hello Word!
February 26th, 2010 at 11:52
Ciao,
fin quì tutto ok!!
se io volessi aggiungere nel mio modulo una cartella language, con dentro tutti i file di lingua con estenzione .ini, e tradurre il contenuto con JText::_(‘da tradurre’);
dove e come devo inserire nel modulo il file della lingua??
Grazie.
March 1st, 2010 at 11:33
Ciao Ciccio, il file della lingua lo inserisci nella cartella language/it-IT (en-GB e così via) di Joomla.
March 1st, 2010 at 11:52
Ciao Flavio,
non devo indicare il nome che ho usato al framework con una load? oppure devo utilizzare un nome prestabilito, tipo it-IT.nomecomponente.ini?
March 1st, 2010 at 12:02
Si, devi usare le convenzioni di nomi utilizzate per i file di lingua, es.
en-GB.com_content.ini
en-GB.mod_feed.ini
en-GB.plg_search_contacts.ini
en-GB.tpl_rhuk_milkyway.ini
Nel tuo caso userai
en-GB.mod_nomemodulo.ini
March 2nd, 2010 at 11:21
Ciao, bel tutorial.
Se voglio estrarre i dati da un altro database (non Joomla)
e visualizzare i dati in Joomla, come posso cambiare il nome del database per eseguire le query?
grazie
March 2nd, 2010 at 11:39
Ciao, puoi usare una normale struttura PHP per l’interrogazione del db esterno.
March 16th, 2010 at 16:49
Ciao Luca! Stupenda guida!
Ma a livello di codice come posso fare in modo che l’utente torni alla pagina del form e trovi negli input i valori degli allarmi potendoli modificare e quindi aggiornare i campi nel database?
Grazie!
Ancora complimenti =)
April 8th, 2010 at 10:16
Salve mi da un problema quando va a fare il bind su $row all’interno di new allarmi.
Ecco l’errore:
Fatal error: Call to a member function bind() on a non-object in C:\Programmi\Apache Software Foundation\Apache2.2\htdocs\joomla\components\com_allarmi\allarmi.php on line 56
la linea 56 eccola: if (!$row->bind(JRequest::get(‘post’))) {
AIUTOOOOOOOOOO!!!!
April 8th, 2010 at 10:48
o messo la tabella allarme.php in tutti i posti possibili ma mi da ancora l’errore!
April 8th, 2010 at 10:49
risolto sbagliavo a chiamare la cartella Table era da chiamare tables
May 12th, 2010 at 16:36
Un sincero complimento a questa guida che mi ha fatto avvicinare al mio primo componente. Volevo chiederVi se esiste qualche modo per poter paginare i risultati degli allarmi nel frontend.
I risultati dopo poco diventano troppi.
Ho dato un sguardo a questa guida
http://docs.joomla.org/Using_JPagination_in_your_component
ma speravo ci fosse qualcosa di più semplice.
Qualcuno sa aiutarmi ??? Grazie anticipatamente
____ Se può essere di aiuto ho creato nel pannello amministrativo un link elimina.
#############
admin.allarmi.php
#############
//no direct access
defined(‘_JEXEC’) or die(‘Restricted access’);
jimport(‘joomla.application.helper’);
require_once(JApplicationHelper::getPath(‘admin_html’));
JTable::addIncludePath(JPATH_COMPONENT.DS.’tables’);
$task = JRequest::getCmd(‘task’);
$aid = JRequest::getVar(‘aid’, ‘get’);
switch($task) {
case remove:
removeAllarmi($aid);
break;
default:
showAllarmi($option);
break;
}
function showAllarmi($option) {
$db =& JFactory::getDBO();
$query = “SELECT * FROM #__allarmi ORDER BY giorno DESC”;
$db->setQuery($query);
$rows = $db->loadObjectList();
if ($db->getErrorNum()) {
echo $db->stderr();
return false;
}
HTML_allarmi::showAllarmi($rows, $option);
}
function removeAllarmi($aid)
{
global $mainframe;
$db =& JFactory::getDBO();
$query = “DELETE FROM #__allarmi WHERE id = $aid”;
$db->setQuery( $query );
if (!$db->query()) {
echo ” alert(‘”.$db->getErrorMsg(true).”‘); window.history.go(-1); \n”;
}
$mainframe->redirect( “index.php?option=com_allarmi” );
return true;
}
#########
a questo punto nella pagina nella pagina admin.allarmi.html.php
ho creato un altra colonna e inserito un link
id.’”>elimina
Vi prego aiutatemi nella paginazione front-end
June 5th, 2010 at 14:43
Mi interessa molto questo tipo di attivita’, dovrei sviluppare una cosa abbastanza complicata, ma non credo sia possibile parlarne su un forum, ovvero non basterebbe una semplice spiegazione, ho notato che qui ci sono eprsone che sviluppano con joomla ed io ero orientato a creare un componente per gestire il software che devo fare; ma da solo non posso farcela, ci sarebbe qualcuno che si sente in grado di aiutarmi ?
August 26th, 2010 at 14:22
Salve,
OTTIMO TUTORIAL,GRAZIE.
Volevo chiedere un cosa dato che non e’ molto che lavoro con joomla.
Ma che differenza ce’ tra l’usare la classe JTable e la classe mosDBTable?
Si usava in una differente versione di joomla?
Io trovo interessante questo discorso dei componenti,visto che per il mio sito
fatto per gestire un torneo di fantacalcio tra amici che va avanti da anni ho usato il plugin jumy per creare le varie pagine, inoltre poi riuscirei a sfruttare
il framework di joomla anche per quanto riguarda l’interfacciamento con il database.
Grazie molte.
Saluti
Daniele
Lascia un commento
-
Feeds
Segui il feed RSS e Twitter per restare sempre aggiornato!
Ricevi gli aggiornamenti via email: -
-
Ultimi commenti
- strumenti musicali chitarra: IL SITO DI JOOMLA
- giulio: È una potenza.
- Fabio: Avete risolto il problema di inserire due moduli nella stessa pagina? Se si come?
- lobo: …è solo una sola come tutti gli altri template “vuoti” di J. come i tutorial per costruirli,...
- Daniele: Salve, OTTIMO TUTORIAL,GRAZIE. Volevo chiedere un cosa dato che non e’ molto che lavoro con joomla. Ma...
-
Ultimi post

85 Commenti al post “Tutorial: creare un componente per Joomla 1.5”