Blog

Neuigkeiten, Interessantes und Informatives

Januar 3, 2011

Smarty Modifier CloseTagsPro

Eventuell seid ihr auch schon einmal über die Herausforderung gestolpert, dass Ihr für einen Vorschautext diesen mit der Smarty-Template-Engine kürzen müsst/wollt. Natürlich geht das recht einfach mit dem Truncate-Modifier. Leider zerschießt dass eventuell das Markup, weil der Modifier strikt nach x-Zeichen den String abschneidet. Eventuell ist in dem String aber noch HTML-Markup wie Listen oder Ähnliches enthalten. Möchte man die Formatierung beibehalten und nicht per strip_tags entfernen, hilft der CloseTagsPro-Modifier.

Zuerst habe ich diesen Modifier bei Gunnart gefunden. Leider stieß dieser aber bereits bei verschachtelten Listen an seine Grenzen. Die Lösung gab es dann bei Smarty-Blog.

< ?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type:    modifier
* Name:    Close Tags Pro
* Version: 0.1
* Date:    2008-01-03
* Author:  Axel Kimmel, http://www.smarty-blog.de
* Purpose: close open tags
* Usage:   In the template, use {$string|CloseTagsPro}
* Install: Drop into the plugin directory
* -------------------------------------------------------------
*/
 
function smarty_modifier_CloseTagsPro( $html )
{
    $single = array(
        'base',
        'meta',
        'link',
        'hr',
        'br',
        'param',
        'img',
        'area',
        'input',
        'col',
        'frame'
    );
    preg_match_all( "#<([a-z]+.*)>#iU", $html, $result );
    $openedtags = $result[1];
 
    $openedtags_new = array();
    if ( is_array( $openedtags ) )
    {
        foreach ( $openedtags as $key => $value )
        {
            if ( substr( $value, -1) == '/' || in_array( strtolower( $value ), $single ) ) {}
            else if ( strpos( $value, ' ' ) !== FALSE )
            {
                $parts = explode( ' ', $value );
                $openedtags_new[] = trim( $parts[0] );
            }
            else $openedtags_new[] = $value;
        }
    }
    preg_match_all( "##iU", $html, $result );
    $closedtags = $result[1];
    $len_opened = count( $openedtags_new );
    if ( count( $closedtags ) == $len_opened ) return $html;
 
    $openedtags = array_reverse( $openedtags_new );
    for( $i=0; $i < $len_opened; $i++ )
    {
        if ( !in_array( $openedtags[$i], $closedtags) && !in_array( strtolower( $openedtags[$i] ), $single ) )
        {
            $html .= '</' . $openedtags[$i] . '>';
        }
        else
        {
            if ( array_search( $openedtags[$i], $closedtags ) !== FALSE)
                unset( $closedtags[array_search( $openedtags[$i] , $closedtags )] );
        }
    }
    return $html;
}
?>

Diesen Code einfach als modifier.CloseTagsPro.php in das Verzeichnis /plugins/ speichern. Danach kann der der entsprechende String im Template gekürzt werden.

{$string|truncate:150|CloseTagsPro}

keine Kommentare geposted in: Smarty
Tags:
, ,