【问题标题】:PrestaShop: add javascript array elements using smartyPrestaShop:使用 smarty 添加 javascript 数组元素
【发布时间】:2014-09-21 16:24:59
【问题描述】:

我正在尝试从 PrestaShop 中的 *.tpl 文件中添加数组元素的方法。

我有的是js变量:

var combinations = [];

我需要从 *.tpl 文件向这个数组添加元素。 我有可用的 $combinations 项目数组、数组、数组数组等,并分配了键 - 所以内爆没有意义。

我正在尝试类似的东西:

{addJsDef combinations[]=$combinations} but it of course won't work.

由于 PS 文档比差,我猜这只是猜测的一天,但也许有人遇到过类似的问题......

【问题讨论】:

    标签: javascript arrays smarty element prestashop


    【解决方案1】:

    如果我理解你的话,如果在 PHP 中你像这样分配给 Smarty 元素:

    $smarty->assign('combinations', array (1,2,3,20));
    

    您可以在 Smarty 中使用:

    <script>
        var combinations = [];
        {foreach $combinations as $item}
        combinations.push({$item})
        {/foreach}
        console.log(combinations);
    </script>
    

    当我添加console.log(combinations); 登录到 JS 控制台时,在控制台中有

    Array [ 1, 2, 3, 20 ]
    

    所以所有元素都被插入到 JavaScript 数组中。

    如果你有更复杂的 PHP 数组:

    $smarty->assign('combinations', array(
            'a' => 'aval',
            'b' => 'bval',
            'c' => array('c1' => 'c1val', 'c2' => 'c2val'),
            'd' => array(
                'd1' => 'd1val',
                'd2' => array(
                    'd2‌​1' => 'd21val',
                    'd22'   => 'd22val',
                    'd23'   => array('d231', 'd232')
                )
            )
        ));
    

    并且您想创建可以使用的平面 JavaScript 数组:

    {function jsadd}
        {foreach $data as $item}
            {if not $item|@is_array}
                combinations.push('{$item}')
            {else}
                {jsadd data = $item}
            {/if}
        {/foreach}
    {/function}
    
    <script>
        var combinations = [];
        {jsadd data=$combinations}
        console.log(combinations);
    </script>
    

    你会得到:

    Array [ "aval", "bval", "c1val", "c2val", "d1val", "d21val", "d22val", "d231", "d232" ]
    

    EDIT2

    如果您需要使用来自 PHP 的数据在 JavaScript 中创建多维数组,正如您在评论中解释的那样,您可以使用这个 Smarty 模板:

    {function jsadd keypart=''}
        {foreach $data as $key => $item}
            {if not $item|@is_array}
                {if $keypart eq ''}
                    combinations['{$key}'] = '{$item}'
                 {else}
                    combinations{$keypart}['{$key}'] = '{$item}'
                {/if}
            {else}
                combinations{$keypart}['{$key}'] = [];
                {jsadd data = $item keypart = "`$keypart`['`$key`']" }
            {/if}
        {/foreach}
    {/function}
    
    <script>
        var combinations = [];
        {jsadd data=$combinations}
        console.log(combinations['a']);
    </script>
    

    【讨论】:

    • "我有可用的 $combinations 项目数组、数组、数组数组等。"所以,假设在 PHP 中我可以使用: $smarty->assign('combinations', array('a'=>'aval', 'b'=>'bval', 'c'=>array('c1' =>'c1val','c2'=>'c2val'),'d'=>array('d1'=>'d1val','d2'=>array('d21'=>'d21val','d22 '=>'d22val','d23'=>array('d231','d232'))))))
    • @KubaStachu 对于那些 PHP 值,JavaScript 数组应该包含什么?请使用这些示例数据和所需的 JS 数组输出来编辑您的问题。
    • 不幸的是,我不需要展平数组,我需要为 javascript 复制它的结构。实际上我正在与 prestashop 模块中的静态变量作斗争,但它们似乎在 PrestaShop 中不起作用......
    • 好的,我用静态变量解决了这个问题,原来是php的array_merge()的问题,我会在几天后让整个模块工作时发布解决方案。
    • @KubaStachu 我已经添加了如何根据您的要求从 PHP 数据创建多维数组的解决方案。我不认为你应该把你的解决方案放在这里,因为你问的是如何在 Smarty 中从 PHP 数据创建 JavaScript 数组,而不是如何使用其他方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多