SMARTY Как передать функцию с дальнейшим изменением

219
24 сентября 2017, 00:19

Как передать в SMARTY через $smarty->assign(); Данную функцию и использовать её дальше :

$sign = md5(MERCHANT_ID.':'.$key['price'].':'.MERCHANT_SECRET.':'.$key['id']);

Суть в том, что туда передаются данные из foreach поэтому каждая функция $sign уникальна в своём роде. Потом значение из $sign заносится в форму и дальше идёт переход на сайт оплаты.

<input type='hidden' name='s' value='<?php print_r($sign); ?>'>

Примерно таким образом.

По просьбе, выкладываю весь код :

<div id="all"><?php foreach ($GetProductAll as $key) {
$sign = md5(MERCHANT_ID.':'.$key['price'].':'.MERCHANT_SECRET.':'.$key['id']);
                    ?>
<div id="product"><div class="p-text"><?php print_r($key['name']);   ?></div><div class="p-image"><img src="/www/images/products/<?php print_r($key['image']);?>"></div><img src="/www/images/products/rub.png"><div class="p-price"><?php print_r($key['price']);?></div><div class="p-buy">
    <form method='get' action='http://www.free-kassa.ru/merchant/cash.php'>
        <input type='hidden' name='m' value='<?php print_r(MERCHANT_ID); ?>'>
        <input type='hidden' name='oa' value='<?php print_r($key['price']); ?>'>
        <input type='hidden' name='o' value='<?php print_r($key['id']); ?>'>
        <input type='hidden' name='s' value='<?php print_r($sign); ?>'>
        <input type='hidden' name='us_product_id' value='<?php print_r($key['id']); ?>'>
        <input type='hidden' name='us_login' value='<?php print_r($_COOKIE['login']); ?>'>
        <input type='submit' id="pay" name='pay' value='КУПИТЬ'>
    </form>
Answer 1

Вы пишите (ну или писали ранее) об использовании паттерна mvc. Поэтому будем считать, что у вас есть неких пхп код, где вы обрабатываете логику и подготавливаете данные, затем передаете их в tpl-шаблон смарти и показываете его пользователю.
в пхп-коде вы, видимо, получаете некоторым образом данные GetProductAll, предположим, что это выглядит примерно так:

class MyController extends BaseController {
    public function someAction(){
        $products = ...... ;        // получение данных
        $this->smarty->assign('GetProductAll', $products);            
    }
}

далее управление передается в шаблон (где-то в недрах вашего mvc происходит вызов $smarty->render('template_name.tpl')). В шаблоне (ну или уже видимо шаблон не используется) вы выводите циклом инпуты. При этом каждый раз вы считаете md5-хэш, а также используете данные куки. Два последних действия не корректны с точки зрения mvc-подхода. Данные должны быть подготовлены и переданы в шаблон на уровне контроллера.

В связи с этим, предлагаю расширить ваш метод контроллера следующим образом:

    public function someAction(){
        $products = ...... ;        // получение данных
        foreach($products as &$p){
            $p['sign'] = md5(MERCHANT_ID.':'.$p['price'].':'.MERCHANT_SECRET.':'.$p['id']);
        }
        $this->smarty->assign('GetProductAll', $products);     
        $this->smarty->assign('login', $_COOKIE['login']);
        $this->smarty->assign('merchantId', MERCHANT_ID);
    }

То есть хэш считаем в контроллере и записывает в тот же самый массив продуктов. Данные логина тоже передаем в шаблон.

Тогда tpl-шаблон представления будет иметь следующий вид:

<div id="all">
{foreach $GetProductAll as $p}
    <div id="product">
        <div class="p-text">{$p.name}</div>
        <div class="p-image">
            <img src="/www/images/products/{$p.image}">
        </div>
        <img src="/www/images/products/rub.png">
        <div class="p-price">{$p.price}</div>
        <div class="p-buy">
            <form method='get' action='http://www.free-kassa.ru/merchant/cash.php'>
                <input type='hidden' name='m' value='{$merchantId}'>
                <input type='hidden' name='oa' value='{$p.price}'>
                <input type='hidden' name='o' value='{$p.id}'>
                <input type='hidden' name='s' value='{$p.sign}'>
                <input type='hidden' name='us_product_id' value='{$p.id}'>
                <input type='hidden' name='us_login' value='{$login}'>
                <input type='submit' id="pay" name='pay' value='КУПИТЬ'>
            </form>
        </div>
    </div>
{/foreach}

Вот собственно и все, что вам необходимо сделать. Можно не изменять контроллер и шаблон, никто не мешает вызывать функцию непосредственно в смарти следующим образом:

 {foreach $products as $p}
     {$sign = md5(.....)}
     <input value="{$sign}"/>
 {/foreach}

зы: А что касается "передачи функции в смарти", то вообще это может выглядеть примерно так:

$smarty->assign('func', function(){ return "hello world"; })
// шаблон
<input value="{$func()}"/>
READ ALSO
Почему куки устанавливаются как Session?

Почему куки устанавливаются как Session?

Устанавливаю Куки через phpИспользую данную запись: setCookie('usname', $_POST['name'], 2553454800, '/'); При этом в отладчике Chrome они отображаются как Session

152
Как вставить в html 5 плеер директиву php кода

Как вставить в html 5 плеер директиву php кода

php код генерит адрес потока с защищенным ключом и отдаёт плееру ссылку, при таком методе плеер пропадает, есть конфликт php с js, подскажите как...

206
Ошибка в php файле. В условии if

Ошибка в php файле. В условии if

Parse error: syntax error, unexpected 'if' (T_IF) in /opt/lampp/htdocs/transport/components/Routerphp on line 63

241
Как авторизоваться на target.com с PHP?

Как авторизоваться на target.com с PHP?

Что только не перепробовал что-бы авторизоваться на targetcom

562