contador de un bucle por condición internar (twig)

2,985 views
Skip to first unread message

Danny alfonzo Viana perez

unread,
Jul 25, 2012, 3:56:23 PM7/25/12
to symfo...@googlegroups.com
Hola amigos, me tiene verde la solución a este problema:

tengo el siguiente bucle

{% for items in secciones %}
<div>
        <table border=0>
    {% for items_medio in atributos %}
        {% set counter = 0 %}
        {% if items.id ~ '-' ~ items_medio.id in attr_checked %}
        <tr>
        <td style="text-align:right;">{{ items_medio.atributo }}&nbsp;&nbsp;</td>
        <td>
        <input id="{{ items.id ~ '-' ~ items_medio.id }}" type="text" />
        </td>
        </tr>
        {% set counter = counter + 1 %}
        {% endif %}
        {{ counter }}
        {% endfor %}
        </table>
    </div>
{% endfor %}

{{ counter }}  me da algo como 00010 cuando solo la cuarta interacción produce contenido

parece que esta tomando como string, algo así como en javascript con el operador +

ahora como declaro int la variable counter??



Jakala

unread,
Jul 26, 2012, 7:39:38 AM7/26/12
to symfo...@googlegroups.com
Buenas:

 tienes la variable COUNTER que la inicializas a 0 TODAS las veces que estas en el bucle. Lo logico seria definir esta inicialización FUERA del FOR.

por eso siempre te da 0, excepto cuando entras en el if, que lo incrementas... :)



{% for items in secciones %}
<div>
        <table border=0>
          {% set counter = 0 %} 
    {% for items_medio in atributos %}
        {% if items.id ~ '-' ~ items_medio.id in attr_checked %}
        <tr>
        <td style="text-align:right;">{{ items_medio.atributo }}&nbsp;&nbsp;</td>
        <td>
        <input id="{{ items.id ~ '-' ~ items_medio.id }}" type="text" />
        </td>
        </tr>
        {% set counter = counter + 1 %}
        {% endif %}
        {{ counter }}
        {% endfor %}
        </table>
    </div>
{% endfor %}


de esta forma te incrementa la variable counter cada vez que estas en el if. 

Danny alfonzo Viana perez

unread,
Jul 26, 2012, 9:56:45 AM7/26/12
to symfo...@googlegroups.com
Gracias amigos por contestar, en realidad el set lo puse dentro porque no se la sintaxis ni en la documentación me dan ejemplos con enteros, solo cadena, y lo que le indico es que la variable no se incremento ni vuelve a valor 0, sino que se concateta l valor anteior (como el + de javascript)
ahora, lo que dices del for, tienes razón, pero si te fijas lo declaro fuera del for interno que es el que quiero contar en realidad

lo que quiero hacer es lo equivalente a esto (php) pero en twig

foreach ($secciones as $items) {
$counter = 0; 
foreach ($atributos as $items_medio) {
if(in_array($items['id']."-".$items_medio['id'], $attr_checked)){
// .... imprimo una informacion .../
$counter++;
}
}
if($counter == 0){
echo "No hay atributos para esta seccion";

Jakala

unread,
Jul 26, 2012, 10:27:36 AM7/26/12
to symfo...@googlegroups.com
Buenas de nuevo:

Ok, entiendo el problema. Aunque no se me ocurre ahora como incrementar la variable (mira que encima tenia que ser cosa facil), se me ocurre que puedes solucionarlo utilizando la condicional dentro del bucle for (es una de las formas que implementa twig con el for, asi unicamente iteras por los elementos que cumplen la condicion)

    {% for items_medio in atributos  if items.id ~ '-' ~ items_medio.id in attr_checked %}
         <tr>
         <td style="text-align:right;">{{ items_medio.atributo }}&nbsp;&nbsp;</td>
         <td>
         <input id="{{ items.id ~ '-' ~ items_medio.id }}" type="text" />
         </td>
         </tr>
         {% endif %}
         {{ loop.length }}
        {% endfor %}

Claro que no se si te interesa... esto deberia mostrarte unicamente los elementos que cumplen la condición, y el total (loop.length).

Lo que no se es si necesitas mostrar también los que no cumplen la condicion... Segun tu bucle no lo necesitas pero...


Danny alfonzo Viana perez

unread,
Jul 26, 2012, 10:45:56 AM7/26/12
to symfo...@googlegroups.com
EXCELENTE! amigo no sabia que se podía combinar el for y el if, de esta manera me quedo:

{% for items_medio in atributos  if items.id ~ '-' ~ items_medio.id in attr_checked %}
<tr>
<td style="text-align:right;">{{ items_medio.atributo }}&nbsp;&nbsp;</td>
<td>
<input id="{{ items.id ~ '-' ~ items_medio.id }}" type="text" />
                        {# ... y otras cosas mas dentro de este td ... #}
</td>
</tr>
{% else %}
<tr>
        <td class="no_result_list">
<img src="{{ asset('bundles/htmlcss/images/no_match.gif') }}" />
<br/>
Esta sección no tiene atributos asociados!
</td>         
    </tr>  
{% endfor %}

y se ve de esta manera:

para las que no tiene pasan por la condicion del for if:

las que si cumplen la condición:

Mil gracias amigo

Reply all
Reply to author
Forward
0 new messages