Funzione che taglia $content ad una data altezza

10 contenuti / 0 new
Ultimo contenuto
Funzione che taglia $content ad una data altezza

Per il tema mobile, ho realizzato questa funzione al fine di troncare la lunghezza del teaser mostrato nel primo nodo della pagina.

Si tratta di una funzione banalissima.

<?php
function truncate_text($text, $max_char = 10) {
   
$maxlen = $max_char;
    if (
$max_char <= 10) {
       
$text_cutted = drupal_substr($text, 0, $maxlen);
       
$last_space = strripos($text_cutted, " ");
        if ( !
$last_space ) {
           
$text = $text_cutted;
        } else {
           
$text = drupal_substr($text_cutted, 0, $last_space) . "...";
        }
    } else {
        if (
drupal_strlen($text) > $max_char) {
            while ( !
$last_p ) {
                   
$text_cutted = drupal_substr($text, 0, $maxlen);
                   
$last_p = strripos($text_cutted, "</p>");
                   
$maxlen = $maxlen + 100;
            }
           
$text = drupal_substr($text_cutted, 0, $last_p) . " ...</p>";
        }
    }
    return
$text;       
}
?>

Mi piacerebbe però renderla più robusta.
e vorrei capire come fare a rimuovere, all'interno del teaser originario eventuale testo racchiuso dentro i tag .

Mi aiutate a migliorare questa funzione con le specifiche che ho indicato ed un migliore check dei possibili errori di esecuzione?

Mi aiuta qualcuno?

non ho capito se devi strippare le tags.
tipo:
<span>testo</span> diventa solo testo.

se è così prova ad utilizzare la funzione php strip_tags

No.
Io devo tagliare il teaser dopo un certo numero di caratteri.
Per fare questo è necessario, come fa drupal stesso (se mi dite come fa, non sarebbe male), tagliare il content sempre alla fine di ogni paragrafo e/o div.

Quindi questa è la prima necessità. E la funzioni che vedi su cerca di fare proprio questo. Però succede che a volte lascia delle tracce di tag.

L'altra cosa che volevo fare è all'interno del $content rimuovere tutto tutto cioè che è racchiuso all'interno dei tag .

Poi, io applico la funzione all'interno di node.tpl.php ...questo vuol dire che mi vengono tagliati anche eventuali blocchi aggiunti in coda a $content e derivati dall'applicazione di alcuni moduli. Quindi, forse, andrebbe applicata altrove.

Mi capitata anche un caso (isolato) in cui quando ha analizzato il testo, praticamente lo script è andato in timeout xkè ha superato i 30s. Per risolvere l'errore per quel caso isolato.. ho solo aumentato il numero di paragrafi () nell'intero testo da tagliare.

Tra l'altro, ho notato che l'insieme di queste 3 righe

$text_cutted = drupal_substr($text, 0, $maxlen);
$last_p = strripos($text_cutted, "</p>");
$text = drupal_substr($text_cutted, 0, $last_p) . " ...</p>";

non fa sempre quello che mi aspetto che faccia e questo mi confonde non poco le idee in merito.

Mi serve aiuto per migliorare questa funzione

E va bene. Se dai un occhiata a node_teaser scopri che non è proprio una banalità troncare il testo di un nodo.

Ma pò darsi che lo consideri troppo complesso. Fatto sta che qualche volta un problema superficialmente semplice, è davvero complesso. Tagliare una stringa dopo un tot di carattere è semplice. Ma se aggiungi l'encoding utf8 diventa più complesso. E se sopra questo aggiungi anche markup HTML, allora buona fortuna.

Per altro codice che tronca il testo vedi il progetto Read More Link. Intendo vedi il codice del progetto - è open source dopo tutto.

Ma se come l'essere umano è (ancora) più intelligente del codice, mettere un <!--break--> è sempre il modo più affidabile. Potresti sempre inventare uno proprio per il mobile <!--mbreak--> per esempio...

Più imparo, più dubito.

Prima di analizzare tutte le cose che mi hai scritto...
ti dico subito una cosa... io ho tentato di capire come fare a far inserire in automatico un drupal break <!--break-->.

Il problema è che deve essere inserito in automatico durante la creazione del nodo partendo da un feed per esempio. Questo xkè se il nodo lo crei da te... non importa più xkè il break lo inserisci a mano dove preferisci.

Mi sa apparentemente che questa funzione così fatta e tutt il lavoro da fare in + per migliorarla NON servono +.
Hanno pensato bene di risolvere il problema quelli di DevelopmentSeed.org

Hanno fatto una gran cosa.

ovvero?

<a href="mailto:[email protected]" rel="nofollow">[email protected]</a> wrote:
ovvero?

Vai a guardate le Note della nuovissima Release del modulo Feeds, la alpha15.

Testala.. e vedi che ti crea i teaser dei nodi e apparentemente li crea usando lo stesso sistema utilizzato drupal stesso, tanto che è soggetto alla stessa configurazione.

Drupal ha la funzione truncate_utf8() per troncare il contenuto di una stringa; per creare il teaser di un nodo, la funzione è node_teaser(), come già riportato da jhl.verona.

Kiam
Kiam la luno renkontas la sunon.