• User Newbie

    Override per posizionare un modulo dopo il secondo paragrafo dell' articolo

    Ciao a tutti, come da titolo io vorrei posizionare un modulo subito dopo il secondo paragrafo dell' articolo, per farlo sto cercando di adottare la tecnica del override, inserendo questa porzione di codice all'inizio nel file default.php riesco a inserire il modulo subito dopo il primo paragrafo "</p>" il che è già un buon risultato, ma se io volessi metterlo non subito il primo ma subito dopo il secondo paragrafo che cosa devo cambiare nel codice?
    Allego il codice che inserisco:

    //*******
    jimport( 'joomla.application.module.helper' );
    $module = JModuleHelper::getModule( 'mod_custom' , 'Nome Del Modulo' );
    $len = strlen($this->item->text);
    $pos = strpos($this->item->text, "</p>");
    $first = substr($this->item->text, 0, $pos);
    $NomeDelModulo = $module->content;
    $end = substr($this->item->text, $pos, $len);
    $this->item->text = $first.$NomeDelModulo.$end;
    //********
    // Fine inserimento modulo in articolo.
    

  • Moderatore

    Ciao danko54 e Benvenuto nel Forum GT.

    Le modifiche da apportare al codice sono davvero poche:

    
    jimport( 'joomla.application.module.helper' );
    $module = JModuleHelper::getModule( 'mod_custom' , 'tuomodulo' );
    $len = strlen($this->item->text); 
    $posp = strpos($this->item->text, "</p>");
    if($len > $posp + 10)
    {
    $pos12 = $posp + 4;
    $pos2 = strpos($this->item->text, "</p>",$pos12);
    if (!($pos2=='false') ) $posp = $pos2;
    }
    $first = substr($this->item->text, 0, $posp);
    $NomeDelModulo = $module->content;
    $end = substr($this->item->text, $posp, $len);
    $this->item->text = $first.$NomeDelModulo.$end;
    
    

    Commento

    Il codice sopra deve essere inserito nel file default.php relativo all'articolo e racchiuso tra:

    
    <?php
    // qui ci va il codice
    ?>
    
    

    Il file default.php si trova solitamente nella cartella dei template cioè seguendo il percorso templates > tuotemplate > html > com_content > article > default.php .
    Se invece si desidera modificare il file del core di Joomla il percorso è: components > com_content > views > article > tmpl > default.php .

    Rispetto alla tua soluzione ho rinominato *posp *(posizione paragrafo) la variabile che tu hai nominato pos, ma non cambia nulla.
    La riga

    
    $posp = strpos($this->item->text, "</p>");
    
    

    ha lo stesso effetto della tua, cioè mette in *posp *la posizione del primo carattere della stringa "</p>" all'interno del testo.

    Dopo un primo paragrafo potrebbe essercene un secondo oppure no. Poiché dopo *posp *abbiamo almeno i 4 caratteri di "</p>" e poi altri 7 del secondo paragrafo "<p></p>", la condizione che ho imposto per proseguire nella ricerca è che la lunghezza complessiva del testo (len) sia maggiore di almeno 11 rispetto a posp; se ciò accade si prosegue con la ricerca a partire da dopo il "</p>" trovato, ovvero da pos12 = posp + 4.
    *pos12 *e *pos2 *sono variabili di comodo.

    La riga:

    
    $pos2 = strpos($this->item->text, "</p>",$pos12); 
    
    

    effettua una ricerca analoga alla precedente, sempre all'interno del testo ma a partire dalla pos12.

    Nota: non è detto che esista un secondo paragrafo: precedentemente abbiamo fatto un controllo sul numero minimo di caratteri, ma non sappiamo se il paragrafo ci sia. La funzione *strpos *restituisce un numero intero solo se la ricerca ha esito positivo, cioè se il paragrafo c'è, altrimenti restituisce false.

    A questo punto ho fatto un'ipotesi: se c'è un secondo paragrafo allora aggiorniamo la posizione *posp *con *pos2 *(posizione del secondo paragrafo), altrimenti ... nulla, cioè in *posp *resterà la posizione del primo paragrafo. In questo modo, se esiste un unico paragrafo allora *tuomodulo *viene stampato alla fine dell'unico paragrafo presente.
    Se serve puoi inserire altre condizioni/eccezioni.

    Spero di esserti stato utile.:)
    F.