Joomla.it Forum
Non solo Joomla... => Sviluppo => : memo2014 07 May 2014, 15:10:49
-
Buongiorno a tutti.
Il mio scenario è questo:
ho un modulo che esegue un compito molto semplice, ovvero di generare un file xml.
Io vorrei fare in modo che questo modulo, venga chiamato quando si esegue il save o si edita un record da un determinato componente.
il codice del modulo è il seguente:
<?php defined('_JEXEC') or die('Restricted access');
$categoriaID = $params->get('categorie', 0);
?>
<?php
mysql_connect('192.168.1.1', 'TESTDB', 'TESTDB');
mysql_select_db('TESTSITE');
$ssql = "SELECT titolo, autore, brano, copertina FROM #__songs WHERE published = '1' AND categoriaID='" .$categoriaID."' ORDER BY id DESC";
$getCategoryNameSql = "SELECT titolo FROM #__categories WHERE published = '1' AND id='" .$categoriaID."'";
$categoryResult = mysql_query($getCategoryNameSql);
$categoryTitle = mysql_fetch_row($categoryResult);
$xml = new XMLWriter();
$xml->openURI('modules/mod_songs/'.$categoryTitle['0'].'.xml');
$xml->startDocument('1.0', 'UTF-8');
$xml->setIndent(true);
$xml->startElement('rss');
$xml->writeAttribute('version', '2.0');
$xml->writeAttribute('xmlns:jwplayer', 'http://developer.longtailvideo.com/');
$xml->startElement('channel');
$res = mysql_query($ssql);
$path = JURI::base()."media/canzoni/";
while($row = mysql_fetch_assoc($res)) {
$xml->startElement("item");
$xml->writeElement('titolo', $row['autore'].' - '.$row['titolo']);
$xml->writeElement('jwplayer:file', $path.$row['brano']);
$xml->writeElement('jwplayer:image', $path.$row['copertina']);
$xml->endElement();
}
$xml->endElement();
$xml->endElement();
$xml->flush();
?>
Vi ringrazio in anticipo per qualsiasi indicazione mi darete .
-
non puoi: i moduli non possono essere richiamati all'accadere di un evento. al limite devi scrivere un plugin che, se il componente lo supporta, può essere agganciato ad uno specifico evento del componente.
comunque non è buona cosa accedere al db senza usare JDatabase, e, se non la usi, non puoi scrivere #__songs ma devi usare il nome reale.
ciao,
marco
-
Innanzitutto grazie per la risposta.
Tutto chiaro ciò che hai detto. Ma non potrei nemmeno scrivere direttamente all'interno del model del componente, adattandola opportunamente, la funzione di quel modulo ? una sorta di:
public function writeXml() {
//blabla
}
e chiamarla quindi direttamente dall'interno del componente ?
Dico questo perché la scrittura del file xml è un evento che avviene solo lato admin.
-
e chiamarla quindi direttamente dall'interno del componente ?
certo, ma visto come hai posto la domanda immaginavo che non potessi/volessi modificare il componente.
ciao,
marco
-
Eh :) Il fatto è che pensavo di poter utilizzare quel modulo :(
Per quanto riguarda invece il componente, immagino di dover lavorare in administrator/components/com_miocomponente.
Visto che questo file xml dev'essere aggiornato ad ogni cambiamento nel db, suppongo di dover
agire all'interno di un metodo "save/edit" oppure "delete".
Non ne trovo traccia però ne nei controllers ne nei models... :(
-
se verifichi il codice del pulsante di salvataggio troverai controller e task richiamato, tipicamente joomla.submitbutton('controller.task').
ciao
-
Non ne trovo traccia
-------------------------------
vuol dire che non ce n'è bisogno, usi quelli delle classi che estendi che ne estenderanno altre...
-
Ok, ho rifatto il modulo utilizzando i metodi "jdatabase":
$db =& JFactory::getDBO();
$queryDB = "SELECT titolo, autore, brano, copertina FROM #__songs WHERE published = '1' AND catid = '".categoryID."' ORDER BY id DESC";
$db->setQuery($queryDB);
$results = $db->loadObjectList();
//il nome della categoria sarà il nome del file xml da generare
$queryCategories = "SELECT title FROM #__categories WHERE published = '1' AND id = '" .$categoryID."'";
$resultsCategories = $db->setQuery($queryCategories);
$fileNameXML = $db->loadResult();
//predispongo la creazione e la scrittura del file xml
$xml = new XMLWriter();
$xml->operURI('playlists/'.$fileNameXML.'.xml');
$xml->startDocument('1.0', 'UTF-8');
$xml->setIndent(true);
$xml->startElement('rss');
$xml->writeAttribute('version', '2.0');
$xml->writeAttribute('xmlns:jwplayer', 'http://developer.longtailvideo.com/');
$xml->startElement('channel');
$path = JURI::base()."media/songs/";
foreach($results as $res) {
$xml->startElement("item");
$xml->writeElement('titolo', $res->artista.' - '.$res->titolo');$
//blablabla $xml->endElement();
}
//chiudo i nodi
$xml->endElement();
$xml->endElement();
//blabla
Funziona tutto come mi aspetto: il file viene generato correttamente ed anche il contenuto è corretto.
Ora, oltre al problema iniziale, ho anche un altro problema:
Diciamo che rendo tutto una funzione pubblica:
public function doXmlPlaylist($categoryID)
Ammesso che riesca a capire dove chiamare questa funzione da un componente ( :( ),
il problema in più che mi sono creato è: come gli passo $categoryID ?
Grazie ancora per il supporto.
-
Piccolo aggiornamento...
Ho capito che a me non serve conoscere l'id della categoria quando posso generare i file xml in una volta sola:
$query = "SELECT id, title FROM #__categories WHERE published = '1' AND extension = 'songmanager'";
$titles = $db->setQuery($query);
$results = $db->loadObjectList();
foreach($results as $row) {
$xml = new XMLWriter();
$xml->openURI('path/'.$row->title.'.xml');
//blabla
$querySongs = "SELECT titolo, artista, blabla WHERE published = '1' AND categoryID = '" .$row->id."' ";
$db->setQuery($querySongs);
$brani = $db->loadObjectList();
foreach($brani as $brano) {
//blabla
}
}
In questo modo in un'unica volta ottengo tutto ciò che mi occorre .
Vorrei solo introdurre questa funzione all'interno del componente, dopo un save/edit o delete...
-
mah, se eviti di postare codice inutile te ne saremo grati.
te lo ho già scritto sopra come individuare controller e metodo chiamato.
se poi nel controller non trovi il metodo significa che lo stesso è, ovviamente, definito nel parent.
le azioni di default (apply, save, edit, cancel, ...) non devono essere definite se si seguono gli standard di joomla, in quanto gestite dal framework.
se vuoi aggiungere una azione ad uno di questi metodi devi effettuare un override dello stesso, inserire la tua funzione e richiamare il parent restituendo il valore di ritorno.
consiglierei una lettura della doc di J.
ciao,
marco