0

您将如何 a) 在 PHP 中修复 Smarty 数组并 b) 将结果粘贴回 Smarty 数组变量中?

您是否曾经解决过一个问题,并且您认为您已经非常接近解决它,但目标却越来越远?我花了半天时间,查找文档,搜索示例……但我一定遗漏了一些非常基本的东西。

前提:我有一个包含重复条目的 Smarty 数组(现在我无法更改它的创建方式,因为 Smarty 代码是在模板中编码的)。这会导致问题,因为现在我在购物车中获得了同一产品的多个条目。现在,老实说,我无法改变组合方式的逻辑。

这是我得到的:

Smarty:
         {$products}

在我的场景中,{$products} 包含四个条目,如下所示:

array(1) { [0]=> array(12) { ["pid"]=> string(2) "13" ["domain"]=> NULL
["billingcycle"]=> string(4) "free" ["configoptions"]=> string(0) "" 
["customfields"]=> array(0) { } ["addons"]=> array(0) { } ["server"]=> string(0) ""
["productinfo"]=> array(9) { ["pid"]=> string(2) "13" ["gid"]=> string(1) "2" 
["type"]=> string(5) "other" ["groupname"]=> string(13) "Beta Products" ["name"]=>
string(44) "BetterStuff "Free Until 2014" Beta" ["description"]=> string(21) 
"BetterStuff installer" ["freedomain"]=> string(0) "" ["freedomainpaymentterms"]=> 
array(1) { [0]=> string(0) "" } ["freedomaintlds"]=> array(1) {[0]=> string(0) ""}}
["allowqty"]=> string(1) "0" ["qty"]=> int(1) ["pricing"]=> array(4) { ["baseprice"]=>
string(9) "$0.00 USD" ["setup"]=> string(9) "$0.00 USD" ["recurring"]=> array(0){}
["totaltoday"]=> string(9) "$0.00 USD" } ["pricingtext"]=> string(5) "FREE!" } }    

在 PHP 中,我可以轻松地使用 array-unique 来删除该数组中的 3 个精确副本,而只留下一个(如我刚刚在上面展示的那个)。

{php}
    $var = $this->get_template_vars('products');
    $var = array_unique($var);
    $smarty = new Smarty();
    $smarty->assign('newproducts', $var = array_unique($var));
    var_dump($var);
{/php}

这在 PHP 中完美运行,并且 var_dump($var) 包含一个数组项(就像我在上面展示的一样)。在 PHP 中,当我用 is_array 检查 $var 时,结果为真。

然而,回到 Smarty,{$newproducts} 为 NULL。

  • 当我尝试重新分配原始 Smarty 数组 {$products} 时,我收到一条关于不允许将字符串值添加到数组的错误消息。

  • 当我尝试打印 {$newproducts|@count} 时,我得到 0。这对我来说有点混乱,因为我相信智能数组从 1 开始,而 PHP 数组是从零开始的。

  • 因此,尽管 PHP 将我分配的变量视为数组的新变量的值,但它不会作为数组进入 Smarty。

我在这里做错了什么?我是否需要以某种方式分解或拆分我的 PHP 数组,以便将其转换为 Smarty 变量?

以及如何将 Smarty 中的原始 {$products} 数组“重置”为新的唯一数组值?

任何人?

4

2 回答 2

1

由于没有真正的答案,而且我遇到了同样的问题,也就是说,由于我无法访问生成它的代码,因此无法从 php 端调用 array_unique。

这是在 Smarty 中对我有用的代码:

    {foreach from=$items item=item}
        {if !in_array($item, $array)} 
            <li>{$item}</li>
            {append var='array' value=$item}                       
        {/if}
    {/foreach} 

它使用 smarty append命令,将项目添加到数组中。此外,我还使用了in_array(向下滚动到关于php_functions的项目符号),这是 Smarty 中可用的其他一些 php 函数之一。

我希望这可以帮助别人!

于 2015-05-07T17:00:36.220 回答
0
{php}
    // read data from CURRENT INSTANCE
    $var = $this->get_template_vars('products');
    $var = array_unique($var);
    // create NEW INSTANCE
    $smarty = new Smarty();
    // assign to NEW INSTANCE
    $smarty->assign('newproducts', $var = array_unique($var));
    var_dump($var);
{/php}

因此,您正在创建一个新的 smarty 实例并为其分配数据。您是否有理由相信上述数据在当前情况下可用?

尝试这个:

{php}
    // read data from CURRENT INSTANCE
    $var = $this->get_template_vars('products');
    $var = array_unique($var);
    // assign to CURRENT INSTANCE
    $this->assign('newproducts', $var = array_unique($var));
{/php}

并且 {php} 已被弃用。您可能想查看使用插件扩展 Smarty

于 2012-07-17T16:28:18.440 回答