2012-07-17 39 views
0

您将如何a)修复PHP中的Smarty数组,并b)将结果返回到Smarty数组变量中?按摩PHP中的Smarty数组并将其发送回Smarty。 。 。?

你有没有研究过一个问题,你认为你接近解决问题,但目标不断滑落得越来越远?我花了半天的时间阅读文档,寻找例子......但我必须错过一些非常基本的东西。

前提条件:我有一个Smarty数组有重复的条目(现在我不能改变创建的方式,因为Smarty代码是在模板中编码的)。这会导致问题,因为现在我为购物车中的同一产品获取多个条目。现在,我真的不能改变这个如何放在一起的逻辑。

这里就是我的了:

Smarty: 
     {$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中,我可以很容易地使用阵列独特,得到摆脱这个数组中的3个精确副本,并且只剩下一个(就像我刚刚在上面展示的那样)。在PHP中,var_dump($ var)包含一个数组项(就像我上面展示的那样),这完美地工作。在PHP中,当我用is_array检查$ var时,结果是真的。

回到Smarty,{$ newproducts}是NULL。

  • 当我试图重新分配原来的Smarty的数组{$}产品,我得到 关于没有被允许为字符串值添加到 阵列的错误消息。

  • 当我试图打印出{$新品推荐| @count},我得到0,这是 轻微; Y混乱给我,因为我相信,智能阵列从1开始 ,而PHP数组是从零开始的。

  • 因此,虽然PHP认为我分配的变量是 的值,但是新变量是一个数组,它不会作为一个数组进入Smarty。

我在做什么错在这里?我是否需要以某种方式爆炸或拆分我的PHP数组,以便我可以将它变成Smarty变量?

我该如何将Smarty中的原始{$ products}数组重置为新的唯一数组值?

有人吗?

+0

也许我错了,但不是这个简单的工作? ''{products | array_unique}' – sofl 2012-07-20 15:15:47

+0

嗯,就“清理”数组中重复/一式三份相同的项目而言,这并不起任何作用。非常感谢您抽出时间。 – Ace 2012-07-20 16:06:21

回答

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不推荐使用。你可能想看看Extending Smarty With Plugins

+0

嘿,谢谢你。要回答你的问题,不,我没有任何理由相信CURRENT INSTANCE会更新。 。 。这就是为什么我使用NEW INSTANCE方法。这个想法是让Smarty接受新变量(新产品)并相应地替换OLD/CURRENT变量(产品)的内容。刚刚测试过您的解决方案,结果如下:致命错误:调用非对象的成员函数assign()。 。 。 – Ace 2012-07-17 17:52:19

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} 

它利用智者append命令,将项目添加到一个数组中。此外,我使用in_array(向下滚动至php_functions),这是Smarty中的一些其他php函数。

我希望这可能会帮助别人!