Smarty 3 tpl:如何执行php插件函数,将一个smarty变量调用到.tpl文件中?

时间:2011-07-12 01:06:00

标签: php task-parallel-library smarty

在.tpl:

里面
{assign var="datasheet" value=$product->reference|escape:'htmlall':'UTF-8'}
... ...
{testsk}

function.testsk.php:

<?php
function smarty_function_testsk(){
$ch = curl_init ("http://www.domain.com/path/to/".$smarty->get_template_vars('datasheet')."/name.html");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$page = curl_exec($ch);

preg_match("/\s<div id=\"divname\">(.*)<\/div>/siU", $page, $matches);
    foreach ($matches as &$match) {
    $match = $match;
}
echo '<table>';
    echo $matches[1];
echo '</table>';
}
?>

显然它不起作用但是给定的已知变量函数是好的并经过测试 我也试图让php标签进入聪明的类,它允许,但我无法访问smarty变量。

IT工作:

{php}
        $ch = curl_init ("http://www.domain.com/path/to/3345674/name.html");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $page = curl_exec($ch);

        preg_match("/\s<div id=\"divname\">(.*)<\/div>/siU", $page, $matches);
        foreach ($matches as &$match) {
        $match = $match;
       }
        echo '<table>';
        echo $matches[1];
        echo '</table>';
       {/php}

它不工作:

{assign var="datasheet" value=$product->reference|escape:'htmlall':'UTF-8'}
           {php}
            $v1 = $this->get_template_vars('datasheet');
            $ch = curl_init ("http://www.domain.com/path/to/".$v1."/name.html");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $page = curl_exec($ch);

            preg_match("/\s<div id=\"divname\">(.*)<\/div>/siU", $page, $matches);
            foreach ($matches as &$match) {
            $match = $match;
           }
            echo '<table>';
            echo $matches[1];
            echo '</table>';
           {/php}

ERROR:

Fatal error: Using $this when not in object context in /var/www/vhosts/domain.com/httpdocs/folder/tools/smarty/plugins/block.php.php(23) : eval()'d code on line 2

1 个答案:

答案 0 :(得分:2)

我不知道为什么$ smarty-&gt; get_template_vars('datasheet')在这里失败,但您可以通过显式传递参数并使用$ inParam []读取来解决它:

your.tpl文件

{assign var="datasheet" value=$product->reference|escape:'htmlall':'UTF-8'}
... ...
{testsk datasheet=$datasheet}

function.testsk.php

<?php
function smarty_function_testsk($inParam, $inSmarty){
$ch = curl_init ("http://www.domain.com/path/to/".$inParam['datasheet']."/name.html");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$page = curl_exec($ch);

preg_match("/\s<div id=\"divname\">(.*)<\/div>/siU", $page, $matches);
    foreach ($matches as &$match) {
    $match = $match;
}
echo '<table>';
    echo $matches[1];
echo '</table>';
}
?>

[未经过测试的代码]

http://www.smarty.net/docs/en/plugins.functions.tpl

(上面编辑分开文件内容。下面是新的)

我认为聪明的v3。应该与v2.x类似地工作。

在{php} ... {/ php}内的一个聪明的.tpl文件中,你处于全局范围并使用$ smarty-&gt; get_template_vars('var_name');而不是$ this-&gt; get_template_vars('var_name');。

第二次查看原始代码时,$ smarty-&gt; get_template_vars()失败,因为$ smarty未在函数作用域中定义,因此您得到null(以及关于未定义变量的通知)。把“全球$ smarty;”作为插件函数体的第一行,或者更好地更改函数的参数声明“function smarty_function_testsk($ param,$ smarty)”,它将$ smarty定义为当前模板对象的实例。