🔃 Uma dica para quando você estiver fazendo um FOR

A minha dor

Numa listagem geralmente existe a necessidade de ter layouts diferentes para um item ou itens específicos, e lógico existe sempre a possibilidade de fazer isso via CSS, entretanto existem casos onde vai haver conteúdos diferentes, por exp. classes, textos, imagens, etc, em determinados itens. Para tanto eu fazia coisas como essa:

{% for post in posts %}
	<article class="{% if loop.first %}active{% endif %}">
		...
	</article>
{% endfor %}

O que isso faz? Coloca a classe active no primeiro post.

Isso funciona? Sim. Está errado? De forma alguma, se você também faz não está errado mais essa if "encaixado" no meio da class nunca agradou-me.

Uma inspiração

Foi isso:

{% for post in posts %}
	<article class="{{ ['active'][not loop.first] }}">
		...
	</article>
{% endfor %}

Só isso? Sim.

Eu sei que mais experientes vão dizer: isso é óbvio. Concordo, entretanto observe quantas camadas de conceito existem neste pedacinho de código.

  • Criar e usar;
  • Ordem de array;
  • Inversão do primeiro;
  • Suprimir sequência;

Criar e usar

Usando [][] cria e usa o array, cria nas primeiras [] (chaves), e usa nas segundas. Note códigos que fazem a mesma coisa.

{{ ['false', 'true'][true] }}
let test = true? "true": "false";
echo true? "true": "false";

A ideia é usar conversão de tipo e transformar boolean em index do array, assim sendo equivalente a usar ternary como no js e php.

Ordem do array

A ordem que os itens são colocados no array é importante, porque se não observar ela, esse truque não vai funcionar corretamente, veja exemplo errado;

{{ ['true', 'false'][loop.first] }}

Esse código twig vai mostrar o valor inverso do status de loop.first, isto é, quando a variável for true mostra false e vice versa, se for esse seu objetivo OK, mas se quiser que mostre true no quando a variável for true não vai funcionar.

Inversão do primeiro

Logo, para resolver o problema do item acima podemos inverter o sinal do loop.first. Como? Simples com uma negação. Exp:

{{ ['true', 'false'][not loop.first] }}

Assim o seu código vai mostrar true quando a variável for true e false quando false. Porque true está na chave 0 e false na chave 1, então quando loop.first for true e o seu valor invertido retorna a chave 0 e quando false retorna a chave 1.

Suprimir sequência

Como já vimos a inverter a ordem do array, conseguimos acessar a chave 0 quando a nossa variável conter o valor true. E para finalizar podemos suprimir a chave 1 do array, assim:

{{ ['true'][not loop.first] }}

Desta maneira no nosso for somente no primeiro item que teremos o true aparecendo.

Conclusão

Como vimos essa abordagem envolve vários conceitos de programação como conversão de tipo, ordenação de array, negação do resultado, etc.

Esse é mais um truque que espero ter encina|relembrando vocês, sei que pode parecer algo bobo mas é esse tipo de detalhe que me faz sentir estar evoluindo.

Quero saber de vocês, isso vai ajudar? Já sabiam? Vão usar?

E para quem já conhecia esse truque, mostra para os outros como isso é em outras linguagens de programação.

Cara, parabéns!

Não é algo bobo, leva tempo para termos insights sobre essas coisas e nesse caso que você mostrou ao usar o loop.first é simplesmente fenomenal!

Ano passado escrevi um post em que mostro alguns "truques" para encurtar algumas coisas em Python: https://niumxp.github.io/python/one-line; da uma passadinha lá, vai que mais alguma coisa te inspire :eyes:

Valew @EspancaTeclado. Obigado pelo elogio. Já anotei aqui sei post, ainda não mechi com python, mas quando mecher vou usar com carinho sua esperiencia.