1

Smartyテンプレートを作成していました。検証を確認する前は、すべて問題ありませんでした。

説明の切り捨てが含まれていますが、終了タグは追加されません。タグを追加しても効果はありません。

切り捨ては次のように呼ばれます

{$products_data.PRODUCTS_DESCRIPTION|truncate:300}

説明には300を超える文字があり、pタグで開始および終了します。切り捨てがそれをカットした後、私は開始タグだけを持ってい<p>ます。

切り捨てのためにHTMLタグを切り取る方法はありますか?

4

3 に答える 3

5

私はプロジェクト中に同じ問題に遭遇し、Benjamin Lupu /EdwardDaleによって書かれた「html_substr」と呼ばれる素晴らしい賢い修飾子を見つけました。「modifier.html_substr.php」という新しいphpファイルをsmarty/libs/pluginsディレクトリに追加するだけです。

(申し訳ありませんが、ソースを覚えていないので、ここに関数全体を投稿しています):

<?php
/*
* Smarty plugin
*
-------------------------------------------------------------
* File: modifier.html_substr.php
* Type: modifier
* Name: html_substr
* Version: 1.0
* Date: June 19th, 2003
* Purpose: Cut a string preserving any tag nesting and matching.
* Install: Drop into the plugin directory.
* Author: Original Javascript Code: Benjamin Lupu <hide@address.com>
* Translation to PHP & Smarty: Edward Dale <hide@address.com>
* Modification to add a string: Sebastian Kuhlmann <hide@address.com>
* Modification to put the added string before closing <p> or <li> tags by Peter Carter http://www.podhawk.com
-------------------------------------------------------------
*/
function smarty_modifier_html_substr($string, $length, $addstring="")
{

//some nice italics for the add-string
 if (!empty($addstring)) $addstring = "<i> " . $addstring . "</i>";

if (strlen($string) > $length) {
    if( !empty( $string ) && $length>0 ) {
        $isText = true;
        $ret = "";
        $i = 0;

        $currentChar = "";
        $lastSpacePosition = -1;
        $lastChar = "";

        $tagsArray = array();
        $currentTag = "";
        $tagLevel = 0;

        $addstringAdded = false;

        $noTagLength = strlen( strip_tags( $string ) );

        // Parser loop
        for( $j=0; $j<strlen( $string ); $j++ ) {

            $currentChar = substr( $string, $j, 1 );
            $ret .= $currentChar;

            // Lesser than event
            if( $currentChar == "<") $isText = false;

                // Character handler
                if( $isText ) {

                    // Memorize last space position
                    if( $currentChar == " " ) { $lastSpacePosition = $j; }
                    else { $lastChar = $currentChar; }

                    $i++;
                    } else {
                    $currentTag .= $currentChar;
                    }

                    // Greater than event
                    if( $currentChar == ">" ) {
                        $isText = true;

                        // Opening tag handler
                        if( ( strpos( $currentTag, "<" ) !== FALSE ) &&
                        ( strpos( $currentTag, "/>" ) === FALSE ) &&
                        ( strpos( $currentTag, "</") === FALSE ) ) {

                        // Tag has attribute(s)
                        if( strpos( $currentTag, " " ) !== FALSE ) {
                            $currentTag = substr( $currentTag, 1, strpos( $currentTag, " " ) - 1 );
                            } else {
                            // Tag doesn't have attribute(s)
                            $currentTag = substr( $currentTag, 1, -1 );
                            }

                            array_push( $tagsArray, $currentTag );

                            } else if( strpos( $currentTag, "</" ) !== FALSE ) {
                            array_pop( $tagsArray );
                            }

                        $currentTag = "";
                        }

                    if( $i >= $length) {
                    break;
                    }
                }

        // Cut HTML string at last space position
        if( $length < $noTagLength ) {
            if( $lastSpacePosition != -1 ) {
            $ret = substr( $string, 0, $lastSpacePosition );
            } else {
            $ret = substr( $string, $j );
            }
        }

        // Close broken XHTML elements
            while( sizeof( $tagsArray ) != 0 ) {
            $aTag = array_pop( $tagsArray );
                // if a <p> or <li> tag needs to be closed, put the add-string in first
                if (($aTag == "p" || $aTag == "li") && strlen($string) > $length) {
                $ret .= $addstring;
                $addstringAdded = true;
                }
            $ret .= "</" . $aTag . ">\n";
            }

        } else {
        $ret = "";
        }

    // if we have not added the add-string already 
    if ( strlen($string) > $length && $addstringAdded == false) {
        return( $ret.$addstring );
        }
        else {
        return ( $ret );
        }
    }
    else {
    return ( $string );
    }
}
?>

使用法:

{$products_data.PRODUCTS_DESCRIPTION|html_substr:300:' ...'}
于 2013-01-07T12:36:07.780 に答える
3

htmlタグを除外し、テキストを切り捨ててから、htmlタグを元に戻すことはかなり困難です。すべてのhtmlタグをstrip_tagsで削除してから、結果のテキストを切り捨てることをお勧めします。必要に応じて、残っているものを<p>タグに埋め込むことができます。

{$ products_data.PRODUCTS_DESCRIPTION | strip_tags | truncate:300}

于 2013-01-06T13:55:56.467 に答える
0

htmlタグに影響を与えずにテキストを切り捨てる解決策を探しました。簡単な説明のテキストを300文字に切り捨てて、HTMLを保持したかったのです。

だから私は交換しました

{$ product.description nofilter}

{Tools :: truncateString($ product.description、300)nofilter}

このソリューションは、prestashop1.7で非常にうまく機能します

于 2022-02-18T09:29:14.900 に答える