перебрать массив в smarty

У меня есть многомерный массив, который я отправляю в шаблон, где я использую smarty.

Массив выглядит так:

array (size=2)
 'gender' => 
   array (size=2)
    0 => string 'male' (length=4)
    1 => string 'female' (length=6)
 'states' => 
   array (size=11)
    0 => string 'Ciudad Autonoma de Buenos Aires' (length=31)
    1 => string 'Buenos Aires' (length=12)
    2 => string 'Catamarca' (length=9)
    3 => string 'Chaco' (length=5)
    4 => string 'Chubut' (length=6)
    5 => string 'Cordoba' (length=7)
    6 => string 'Corrientes' (length=10)
    7 => string 'Entre Rios' (length=10)
    8 => string 'Formosa' (length=7)
    9 => string 'Jujuy' (length=5)
    10 => string 'La Pampa' (length=8)

чего я хочу добиться, так это: я могу показать только 4 или меньше элементов из каждого массива в зависимости от того, сколько элементов у него есть. Например, для подмассива «пол» я показываю как мужской, так и женский пол. Но для подмассива «состояния» мне нужно показать только первые 4 элемента, а затем добавить легенду со ссылкой «показать больше».

Это пока то, что я закодировал:

{if $ns eq 'states'}
<dt>Provincia</dt>
{assign var="n" value="0"}
{counter start=0 print=false assign=n}
{foreach from=$r key=k item=v}
   {counter print=false}                            
   {if counter lt 3}
    <dd>{$v}</dd>
   {elseif counter eq 3}
    <dd>Ver más<dd>
   {/if}

{/foreach}
n = {$n}
{/if}

Это не дает мне результатов, которые я хочу. Я не знаю, как «скрыть» элементы, когда их больше 4. Я мог выполнить итерацию только 4 раза, но в таком случае как мне манипулировать подмассивом, если у меня нет foreach?

Вывод должен выглядеть так:

Gender
  Male
  Female

States
  Ciudad Autonoma de Buenos Aires
  Buenos Aires
  Catamarca
  Chaco
  See More>>

person Limon    schedule 12.11.2013    source источник


Ответы (1)


В Smarty 3.x вы можете использовать свойство @iteration или свойство @index для подсчета «цикла».

{if $ns eq 'states'}
<dt>Provincia</dt>
{foreach $r AS $k=>$v}                          
   {if $v@iteration lt 3}
    <dd>{$v}</dd>
   {else}
    <dd>Ver más<dd>
   {break}
   {/if}

{/foreach}
n = {$n}
{/if}

Smarty Doc

<style type="text/css">
{literal}
.el-tohide {display:none;}
{/literal}
</style>

    {if $ns eq 'states'}
    <dt>Provincia</dt>
    {foreach $r AS $k=>$v}                          
        <dd class="{if $v@iteration gt 3}el-states el-tohide{/if}">{$v}</dd>
       {if $v@last && $v@iteration gt 3}
        <dd class="el-click">Ver más<dd>
       {/if}
    
    {/foreach}
    n = {$n}
   {/if}
<script type="text/javascript">
{literal}
$('.el-click').on('click', function (){
if ($('.el-states').hasClass('el-tohide'))
    $('.el-states').removeClass('el-tohide');
else
$('.el-states').addClass('el-tohide');
});
{/literal}
</script>

Просто КАК ЕСТЬ, не уверен, что он функционален, но я даю вам общее представление. Я предполагаю, что вы используете Jquery.

person Foobar    schedule 12.11.2013
comment
Отличный способ упрощения. Но как насчет того, чтобы скрыть или не показать другие элементы? - person Limon; 12.11.2013
comment
@Jimena, чтобы динамически отображать/скрывать другие «состояния», вы должны использовать немного JS. - person Foobar; 12.11.2013
comment
@Jimena Я сделал обновление с примером решения Показать/Скрыть. - person Foobar; 12.11.2013