0

CMS 用にスマートなカスタム関数を作成しました。

{$page->title|inter}

したがって、このタグは、解釈されると、カスタム関数を呼び出し、smarty_modifier_interhtml コードを取得し、いくつかのアクションを実行してから返します。

この html では、他の smarty タグを使用できます。しかし、関数 smarty が smarty コードを返す場合、この smarty コードは解釈されません...

だから、私のページに{$page->title|inter}は解釈されないようなタグがあります。

あなたはなにか考えはありますか?ありがとう!

4

2 に答える 2

1

smarty_modifier_inter() が smarty コードを返し、この smarty コードがそれ自体で解析されることを期待していると思いますか? Smarty は修飾子ごとに 1 回だけテンプレートを解析するため、返された smarty タグを解析しません (実際には、元のテンプレート本体ですべての関数を実行すると想定しているため、返された smarty タグは解析しません)。

探しているものを実現する 1 つの方法は、修飾子内に再帰を実装することです。たとえば、修飾子が次のようになっているとします。

function smarty_modifier_inter($string)
{
    $html = some_function($string);  //This may contain a smarty tag, such as {$page->title|inter}
    return $html;
}

次のように変更できます。

function smarty_modifier_inter($string)
{
    $html = some_function($string);  //This may contain a smarty tag, such as {$page->title|inter}
    if (preg_match("/".preg_quote("{$")."/", $html)) {     //A very quick and dirty way to see if there are any smarty variables within your template
        $html = smarty_modifier_inter($html);  //This may contain a smarty tag, such as {$page->title|inter}
    } 

    return $html;
}

これにより、smarty 変数が含まれなくなるまで、文字列に対して smarty_modifier_inter が繰り返し実行されます。明らかに、これは無限ループの影響を非常に受けやすいので、注意して使用してください!

単一レベルの再帰があることが確実な場合は、データに対して関数を最大 1 回だけ実行できます。

于 2013-04-16T05:09:15.400 に答える
0

Smarty 関数は、入力 (Smarty テンプレート) から出力 (通常は HTML) に進む手段です。これらは、再帰的にレンダリングされる Smarty コードをさらに生成する方法ではありません。

Smarty 自体によって処理されるにSmarty テンプレート ソースに対して実行されるpre-filterを使用して、必要なことを実行できる場合がありますが、これはカスタム関数を記述するほど簡単ではありません。

さらに有望なことに、Smarty3 にはstring:resourceが含まれています。これにより、文字列をテンプレートのコンテンツであるかのようにレンダリングできます。

したがって、カスタム関数では、次のようなものを使用できます。

function smarty_function_get_more_smarty($params, $smarty_instance)
{
    $code = get_code_from_somewhere($params['foo'], $params['bar']);
    // $code might be something like '<h1>My Awesome Site - {$title}</h1>'
    return $smarty_instance->fetch('string:' . $code);
}

string:私はこのコードをテストしていないか、この機能を使用したことがないことに注意してください。そのため、オプションのエスケープととの違いについてはマニュアルをお読みくださいeval:

また、これは表面上は明示的に再帰的ではありませんが$code、同じカスタム関数への別の呼び出しで終わる場合、同じ関数に戻ることになるため、何らかの形で無限再帰から保護するようにしてください!

于 2013-04-16T18:14:36.073 に答える