Как использовать динамическую переменную smarty в цикле foreach - PullRequest
1 голос
/ 17 января 2011

Может кто-нибудь сказать мне, как использовать динамические переменные в цикле smarty foreach. Я пытаюсь создать модуль в prestashop, и я очень близок, чтобы сделать это. вот мой код:


//file name index.php
foreach( $subCategories as $s )
{
    $foo  = intval($s['id_category']);
    $k    = new Category($foo);
    $var1 = "subSubCategories.$foo";
    $var1 = $k->getSubCategories(1); 

    $smarty->assign(array('foo'.$foo => $var1)); 
}

//file name:index.tpl

{assign var=foo value=$foo$cat}

//where $cat is a variable that counts the number of categories

{if isset($foo) AND $foo}
    {foreach from=$foo item=subCategories name=homesubCategories}
        <p>{$subCategories.name}</p>
    {/foreach}
{else}
    <p>{l s='test failed'}</p>
{/if}

Я исчерпал все свои ресурсы и знания и чувствую себя совершенно беспомощным в этот момент. так что, пожалуйста, помогите мне.


Я пытаюсь создать динамические переменные ('foo'.$foo, т.е. foo1, foo2 и т. Д.) В зависимости от количества подкатегорий. Я думаю, что я успешен до этого момента. Теперь перейдем к файлу tpl, здесь я хочу получить доступ к динамически создаваемой переменной (foo2, foo3 и т. Д.), Используя foreach. Теперь, если я делаю это: {assign var=foo value=$foo3} Я получаю значения из этой подкатегории, используя тот же цикл foreach. Но когда я делаю это: {assign var=foo value=$foo$catx} (где $catx хранит значения для идентификатора категории), происходит сбой. Пожалуйста, помогите.

Ответы [ 5 ]

2 голосов
/ 11 ноября 2014

Я использую такой код в цикле раздела (для Smarty 2 ):

{section  name=buildings loop=7 start=1 step=1 max=7}
<tr>
      {assign var=part_number value="part`$smarty.section.buildings.index`_number"}
      <td class="number">
        <input class="number xshort" name="part{$smarty.section.buildings.index}_number" value="{$data.$part_number}" type="text">
      </td>
</tr>
{/section}

Как видите, создается динамическая переменная part_number (см. backticks в блоке значений).И затем, вы можете использовать его как value = "{$ data. $ Part_number}".

0 голосов
/ 19 сентября 2014

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

, если, например, $index = 2

{$foo{$index}}

, тогда будет вызвана переменная с именем {$foo2}

0 голосов
/ 17 января 2011

Ваш $smarty->assign() звонок неверный;Вам отправляется только один параметр, но ему нужны два параметра (имя переменной, за которой следует значение).Основываясь на коде вашего шаблона (циклически перебирая переменную $foo), ваш цикл должен выглядеть примерно так в PHP:

//file name index.php
$subcats = array();
foreach($subCategories as $s) {
    $foo = intval($s['id_category']);
    $k = new Category($foo);    
    $subcats[$foo] => $k->getSubCategories(1);
}
$smarty->assign('foo', $subcats);

Тогда, похоже, вы не совсем правильно используете Smarty {foreach}или.Вы объявляете атрибут name цикла foreach, но затем не используете его должным образом.Предполагая, что $k->getSubCategories(1) возвращает строку, код smarty должен был бы просто:

{foreach from=$foo item=subCategories}<p>{$subCategories}</p>{/foreach}

Если $k->getSubCategories(1) возвращает массив с элементом homesubCategories (что, как я думаю, вы пытаетесьсо своим кодом Smarty), вам все еще не нужно значение name в foreach.Тогда вы просто сделаете:

{foreach from=$foo item=subCategories}<p>{$subCategories.homesubCategories}</p>{/foreach}
0 голосов
/ 09 сентября 2013

Переменные с динамическими именами, как правило, являются очень плохим выбором дизайна, делая все намного сложнее, чем нужно.

Если у вас есть набор элементов, которые вам нужно зациклить или проиндексировать, поместите их вмассив;тогда вам не нужно выполнять магические задания, так как вы можете использовать обычные foreach циклы или доступ к ключу массива:

//file name index.php

// Build the array first, then assign it to Smarty at the end
$foo_array = array();
foreach($subCategories as $s)
{
    $foo = intval($s['id_category']);
    $k = new Category($foo);

    // This line is redundant as you over-write on the following line:
    // $var1 = "subSubCategories.$foo";

    $var1 = $k->getSubCategories(1);
    $foo_array[ $foo ] = $var1;
}
// Assigning one variable, so just pass name and value to $smarty->assign()
$smarty->assign('foo_array', $foo_array); 

//file name:index.tpl
{* Look for the entry in the outer array with key "$cat", then loop over it *}
{foreach from=$foo_array[$cat] item=subCategories}
    <p>{$subCategories.name}</p>
{/foreach}
0 голосов
/ 17 января 2011

С $foo = intval($s['id_category']); вы определили $foo как целое число. Затем вы объединяете строку с $smarty->assign(array('foo'.**$foo** => $var1));

Правильно это:

$foo = $s['id_category'];
$smarty->assign(array('foo'.$foo => $var1));
...