Neuigkeiten, Interessantes und Informatives
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}