Joomla.it Forum
Non solo Joomla... => Sviluppo => : .Andrea S. 06 Oct 2008, 16:57:21
-
Ciao,
Sto svliluppando un modulo per 1.5 ma sto impazzendo perchè vorrei far si che il plug-in loadmodule funzionasse anche nel mio modulo.
Ho trovato questa (http://docs.joomla.org/Tutorial:Using_plugins_in_your_own_extension) pagina in docs.joomla.org che recita:
To activate the plugins for your addon, you just have to use the following line of code:
$result = $mainframe->triggerEvent( 'onSomething', $param );
Ma non riesco proprio a farlo funzionare.
Mi potete dare una mano per favore?
Grazie mille
-
Usi MVC, giusto?
Nella View, nel file view.html.php metti, oltre al resto,
// carica il plugin
$import = JPluginHelper::importPlugin( 'categoria-del-plugin', $row->element );
$dispatcher =& JDispatcher::getInstance();
$title = $dispatcher->trigger( 'onRenderTitle', array() );
$this->assignRef('title', $title);
parent::display($tpl);
Sempre nella view, in tmpl/default.php, hai a disposizione il valore che hai in $title e vi accedi così:
$this->title[$i]
Il plugin deve avere una funzione
function onRenderTitle() {
return "titolo";
}
So che non sono stato chiaro ::)
-
intanto grazie per la risposta!
no non uso MVC, pensavo fosse per i componenti, ad ogni modo non sono a quei livelli di sviluppo :(
domanda:
loadmodule -> categoria "content" -> giusto?
title -> devo sostiturlo con il nome del plug-in?
Mi sa che non ho capito molto :'(
:)
-
Scusa Andrea mi è sfuggito il fatto che è un modulo.. e tra le altre cose ho pure mal capito la domanda ::)
La linea 17 del plugin loadmodule dice
$mainframe->registerEvent( 'onPrepareContent', 'plgContentLoadModule' );
In pratica la funzione plgContentLoadModule, che effettivamente carica il modulo, viene richiamata quando è generato l'evento onPrepareContent, ovvero prima ancora che venga generato alcun output.
Premetto che non ho mai provato a fare quello che ti dico ora, ma potresti creare un plugin duplicando loadmodule, ed al posto di
$mainframe->registerEvent( 'onPrepareContent', 'plgContentLoadModule' );
inserisci
$mainframe->registerEvent( 'onQuandoVoglioIo', 'plgContentLoadModule' );
In questo modo il plugin viene richiamato quando tu emetto l'evento onQuandoVoglioIo:
/*
* Process the prepare content plugins
*/
JPluginHelper::importPlugin('content');
$results = $dispatcher->trigger('onQuandoVoglioIo', array ());
Dovresti però controllare i parametri che passi.. in modo da caricare la posizione che vuoi tu. Oppure settare la posizione da caricare direttamente nel tuo plugin "copia di loadmodule"
..come al solito spiegarlo è complicato!
-
Flavio grazie per la pazienza, ho capito qualcosa di più ma mi sa che ti sto facendo impazzire perchè mi sono spiegato male.
il modulo al quale sto lavorando permette di inserire del testo e visualizzarlo.
Io vorrei far in modo che se si inserisce il classico {loadposition user1}
venissero visualizzati i moduli in quella posizione. Ovvero vorrei far in modo che il/i plug-in fosse disponibili anche nel mio modulo.
Dalla pagina che ho linkato nel primo post mi sembrava estremamente facile, ma evidentemente mi sfugge qualcosa.
Avevo visto che il plug-in per il richiamo dei moduli conteneva
$mainframe->registerEvent( 'onPrepareContent', 'plgContentLoadModule' );
e infatti avevo provato a usare
$result = $mainframe->triggerEvent( 'onPrepareContent');
nel codice del mio modulo, (ho levato $param in quanto diceva che era opzionale), ma il massimo che sono riuscito ad ottenere è un "array".
Spero di essere stato un po più chiaro e scusa ancora per l'incomprensione. ;)
-
Se guardi il codice del plugin loadmodule, vedi che alla linea 34 c'è
$regex = '/{loadposition\s*.*?}/i';
e poi
preg_match_all( $regex, $row->text, $matches );
Ovvero in $row->text dovresti inserire il testo pubblicato dal tuo modulo, così che il plugin loadmodule lo analizzi ed
inserisca i moduli che vuoi visualizzare.
Prova a fare così, nel modulo inserisci il codice
$row->text = $testoGeneratoNelTuoModulo;
$result = $mainframe->triggerEvent( 'onPrepareContent', $row);
Il risultato dovrebbe essere il nuovo testo, comprensivo dei moduli presenti nella posizione user1 che hai indicato di caricare.
-
ottengo un "Array"
Il codice è questo:
// carica il plugin
$row->text = $modulepos;
$result = $mainframe->triggerEvent( 'onPrepareContent', $row);
echo "$result";
dove $modulepos è semplicemente {loadposition user8}
-
prova
$row->text = $output_modulo; //comprensivo di {load ecc}
$result = $mainframe->triggerEvent('onPrepareContent', $row);
L'array dovrebbe contenere l'output del plugin..
$result[0]
-
Preso dalla disperazione ho preso un modulo che faceva questo e ho copiato!
Non chiedetemi quindi come sia esattamente la soluzione ;D
Flavio Grazie grazie grazie per la pazienza :)
-
Preso dalla disperazione ho preso un modulo che faceva questo e ho copiato!
Bene, hai risolto!