Joomla.it Forum
Non solo Joomla... => Sviluppo => : came88 11 Dec 2010, 13:07:22
-
Volevo creare un plugin che modifica un articolo quando è visualizzata solo l'introduzione.
In particolare se in un articolo c'è un galleria immagini SIGE ({gallery}percorso,opzioni{/gallery}), volevo aggiungere l'opzione limit_quantity=n per contenere le immagini, lasciandole invece tutte nell'articolo completo.
Quello che mi serve è il modo per capire se dell'articolo viene visualizzata solo l'introduzione oppure se viene visualizzato tutto.
Ho provato a copiare il codice dal plugin pagebreak e quello che ho trovato è
$params->get( 'intro_only' )
ma non mi funziona, l'errore è
Fatal error: Call to a member function get() on a non-object in plugins/content/galleria.php on line 16
Ecco il codice
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.plugin.plugin' );
class plgContentGalleria extends JPlugin
{
function plgContentGalleria( &$subject, $params )
{
parent::__construct( $subject, $params );
}
function onPrepareContent( &$article, &$params, $limitstart ) {
global $mainframe;
if (!$params->get( 'intro_only' ))
return false;
$regex = "#{galleria}(.*?){/galleria}#s";
$article->text = preg_replace_callback($regex,array($this,"sostituisci"), $article->text);
return true;
}
private function sostituisci($matches) {
if (preg_match('#limit_quantity=#', $matches[1]))
return '{gallery}'.$matches[1].'{/gallery}';
else
return '{gallery}'.$matches[1].',limit_quantity=3{/gallery}';
}
}
Qualcuno sa aiutarmi, magari dicendomi dove posso trovare una guida su queste cose? su api.joomla.com non sono riuscito a trovare niente...
Grazie mille
-
devi fare un override, non un plugin
M.
-
Intanto ti ringrazio per l'aiuto, ma non mi sembra che sia così: correggimi se sbaglio.
L'override entra in azione dopo che il "testo" (codice html) dell'articolo è stato generato ma prima che venga visualizzato, quindi dopo che il plugin della galleria di immagini ha già modificato il codice {gallery}percorso,parametri{/gallery} nel contenuto da inviare al browser.
Con un override giustamente posso intercettare e modificare questo contenuto, ma io volevo farlo prima che entrasse in azione il plugin della galleria di immagini...
Da quel che ho capito quindi devo fare un plugin che in base a dove venga visualizzato l'articolo aggiunga un parametro o meno a quanto sopra.
Quello che non ho capito (e non so se si può fare a questo punto...) è se un plugin possa sapere dove e come verrà visualizzato l'articolo che sta processando...
Spiego cosa voglio fare: ho una serie di articoli organizzati in categorie che contengono ognuno un po' di foto (dell'ordine di una trentina - quarantina) in una galleria immagini, quindi nell'articolo ci sono le anteprime e cliccando si vede la foto.
Mi piacerebbe usare una vista categoria blog per vedere gli articoli più recenti, ma ovviamente non possono esserci una trentina di miniature per ogni articolo... sarebbero centinaia di miniature in una sola pagina...
Quindi cercavo un modo per ridurre il numero di miniature per articolo quando visualizzato all'interno della categoria.
Aggiungo che ogni articolo oltre alle foto contiene pochissimo testo...
Una soluzione facile che ho trovato è trasformare ogni articolo da
testo1
{gallery}percorso{/gallery}
testo2
in
testo1
{gallery}percorso,parametro_limitante{/gallery}
testo2
--leggitutto--
testo1
{gallery}percorso{/gallery}
testo2
e non visualizzare il testo introduttivo nell'articolo.
Mi sembra però macchinoso (va fatto in ogni articolo...) e ogni modifica a un articolo sarebbe da fare due volte... comunque meglio che niente
Ricapitolando:
- l'override mi sembra non vada bene
- un plugin può sapere come verrà visualizzato l'articolo?
- soluzione manuale
Qualcuno ha qualche idea o dritta da darmi
Grazie mille
-
- l'override mi sembra non vada bene
----------------------------------------------
vero
M.
-
Grazie mille
Ti chiedo solo ancora una cosa: per un plugin è possibile sapere come verrà visualizzato un articolo (articolo, sezione blog, categoria blog, prima pagina, feed, ...)?
Non voglio modificare il core di Joomla, per cui se la risposta è si se mi sai dire dove guardare poi mi arrangio in qualche modo, se la risposta è no almeno mi metto l'anima in pace :-)
Ancora grazie
-
si ma praticamente tu continui a voler fare un override su un plugin..., come fai ad "infilarti come "ultimo" per poi decidere tu quale sia il content?.
Quì trovi gli eventi, forse quello che ti può venir meglio è il getContent.... ma che evento usa il tuo plugin?
http://blog.joocode.com/cms/joomla/gli-event-handlers-di-joomla/
O fai delle modifiche a quel plugin a seconda che sia richiesta una vista blog o meno o ti prendi il content quando è già bell'e che pronto e cerchi li di fare un parsing e limitare le immagini e quì puoi fare l'override.
-
Io volevo inserirmi nel onPrepareContent... Ho visto che dal lato amministrativo di joomla posso decidere l'ordine di esecuzione dei plugins, quindi mi basta mettere il mio plugin prima di quello che visualizza la galleria immagini per poter modificare i parametri passati.
Volevo una cosa del genere:
codice articolo salvato = {gallery}percorso{/gallery} (o eventualmente un altro tag)
evento PrepareContent:
- mioplugin ->
content = {gallery}percorso,parametro{/gallery} o {gallery}percorso{/gallery} a secondo del caso
- SIGE ->
content = [codice HTML galleria immagini]
...[altri plugins]...
Spero di averti fatto capire come volevo implementare la cosa...
Quello che non ho capito come fare è come capire che tipo di vista l'utente abbia richiesto... Non so che variabile / classe usare per capirlo
Grazie ancora
-
JRequest
M.
-
Grazie mille, ho risolto
Posto il codice che ho usato nel caso a qualcuno potesse servire
class plgContentGalleria extends JPlugin
{
private $limit;
function plgContentGalleria( &$subject, $params )
{
parent::__construct( $subject, $params );
$this->limit = $this->params->get('limit', 3);
if (!is_numeric($limit) || $limit < 0) $limit = 3;
}
function onPrepareContent( &$article, &$params, $limitstart ) {
if (JRequest::getString('view', 'article') == 'article')
return false;
$regex = "#{gallery}(.*?){/gallery}#s";
$article->text = preg_replace_callback($regex,array($this,"sostituisci"), $article->text);
return true;
}
private function sostituisci($matches) {
if (preg_match('#limit_quantity=#', $matches[1]))
return '{gallery}'.$matches[1].'{/gallery}';
else
return '{gallery}'.$matches[1].',limit_quantity='.$this->limit.'{/gallery}';
}
}