Smarty 3 tpl: как выполнить функцию плагина php, которая вызывает переменную smarty в файл .tpl? - PullRequest
0 голосов
/ 12 июля 2011

внутри .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, но он не может получить доступ к переменной smarty.

ЭТО РАБОТАЕТ:

{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}

ОШИБКА:

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 Ответ

2 голосов
/ 12 июля 2011

Я не знаю, почему здесь происходит сбой $ smarty-> get_template_vars ('datasheet'), но вы можете обойти это, явно передав параметр и читая с помощью $ inParam []:

ваш .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

(отредактировано выше для разделения содержимого файла. Ниже приведено новое)

Я предположил, что smarty v3. Должно работать аналогично для v2.x.

В файле smarty .tpl внутри {php} ... {/ php} вы находитесь в глобальной области видимости и используете $ smarty-> get_template_vars ('var_name'); вместо $ this-> get_template_vars ('var_name');.

При втором взгляде на ваш исходный код, $ smarty-> get_template_vars () завершается ошибкой, потому что $ smarty не определен в области действия функции, поэтому вы получаете null (и уведомление о неопределенной переменной). Поместите "глобальный $ smarty;" в качестве первой строки вашего тела функции плагина или, что лучше, измените объявление параметра функции "function smarty_function_testsk ($ param, $ smarty)", которое определяет $ smarty как экземпляр текущего объекта шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...