2012-07-17 61 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函數。

我希望這可能會幫助別人!