Autore Topic: [2.5]Chiamata a funzione di un modulo dal save/edit di un componente  (Letto 2733 volte)

Offline memo2014

  • Nuovo arrivato
  • *
  • Post: 18
    • Mostra profilo
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:
Codice: [Seleziona]
<?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 .



Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
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

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline memo2014

  • Nuovo arrivato
  • *
  • Post: 18
    • Mostra profilo
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:


Codice: [Seleziona]
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.

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
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

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline memo2014

  • Nuovo arrivato
  • *
  • Post: 18
    • Mostra profilo
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... :(

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
se verifichi il codice del pulsante di salvataggio troverai controller e task richiamato, tipicamente joomla.submitbutton('controller.task').

ciao

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

mau_develop

  • Visitatore
Non ne trovo traccia
-------------------------------
vuol dire che non ce n'è bisogno, usi quelli delle classi che estendi che ne estenderanno altre...

Offline memo2014

  • Nuovo arrivato
  • *
  • Post: 18
    • Mostra profilo
Ok, ho rifatto il modulo utilizzando i metodi "jdatabase":


Codice: [Seleziona]
$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.

Offline memo2014

  • Nuovo arrivato
  • *
  • Post: 18
    • Mostra profilo
Piccolo aggiornamento...


Ho capito che a me non serve conoscere l'id della categoria quando posso generare i file xml in una volta sola:


Codice: [Seleziona]
$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...

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
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

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

 

Host

Torna su