Repetição de Parágrafos - Guia de Loop para Cada Parágrafo
Os documentos frequentemente contêm estruturas de conteúdo repetidas, como listas de itens, múltiplos registros ou seções repetidas com formatação semelhante. PDF4meO mecanismo de modelos do [nome da plataforma] oferece recursos de iteração poderosos para gerar vários parágrafos e seções dinamicamente a partir de coleções de dados.
Entendendo os Loops Foreach
O foreach O loop é o principal mecanismo para iterar por coleções de dados e gerar conteúdo repetido. Cada iteração processa um item da coleção e gera a saída correspondente.
Sintaxe básica do comando foreach
<<foreach [item in collection]>>
Content with <<[item.property]>>
<</foreach>>
Componentes:
item- Variável que representa o elemento atual na iteraçãocollection- O array ou coleção de dados a ser iterado- Bloco de conteúdo - Conteúdo do modelo repetido para cada item
Parágrafos repetidos
Gere vários parágrafos percorrendo uma coleção de dados e criando texto formatado para cada item.
Exemplo: Classificações de aplicativos
Sintaxe do modelo:
<<foreach [app in applications]>><<[app.listAppName]>> in <<[app.listAppType]>> platform is a <<[app.category]>> app and has a <<[app.AppRating]>> rating.
<</foreach>>
Fonte de dados (JSON):
{
"surveyName": "Top-rated Apps",
"applications": [
{
"listAppName": "Instagram",
"listAppType": "iOS",
"category": "Social Media",
"AppRating": "4.9"
},
{
"listAppName": "Whatsapp",
"listAppType": "iOS",
"category": "Chat",
"AppRating": "4.8"
},
{
"listAppName": "Player UG",
"listAppType": "Android",
"category": "Gaming",
"AppRating": "4.75"
}
]
}
Resultado gerado:
Instagram in iOS platform is a Social Media app and has a 4.9 rating.
Whatsapp in iOS platform is a Chat app and has a 4.8 rating.
Player UG in Android platform is a Gaming app and has a 4.75 rating.
Lidando com coleções vazias
Quando uma coleção estiver vazia, use o Any() Método para verificar a existência de dados antes de iterar. Isso evita exceções de valor nulo e permite exibir conteúdo alternativo.
Verificação básica de valores nulos
Modelo com verificação Any():
<<if [applications.Any()]>>
<<foreach [app in applications]>><<[app.listAppName]>> in <<[app.listAppType]>> platform is a <<[app.category]>> app and has a <<[app.AppRating]>> rating.
<</foreach>>
<<else>>No applications listed
<</if>>
Esta abordagem:
- Verifica se a coleção contém algum item.
- Percorre os itens, se disponíveis.
- Exibe uma mensagem alternativa caso a coleção esteja vazia.
Loops foreach aninhados
Crie estruturas hierárquicas aninhando loops foreach uns dentro dos outros. Isso é útil para exibir relações pai-filho ou estruturas de dados multiníveis.
Exemplo: Departamento e Funcionários
Modelo:
<<foreach [dept in departments]>>
Department: <<[dept.name]>>
<<foreach [emp in dept.employees]>>
- <<[emp.name]>> (<<[emp.position]>>)
<</foreach>>
<</foreach>>
Dados:
{
"departments": [
{
"name": "Engineering",
"employees": [
{ "name": "John Smith", "position": "Senior Developer" },
{ "name": "Jane Doe", "position": "Tech Lead" }
]
},
{
"name": "Marketing",
"employees": [
{ "name": "Mike Johnson", "position": "Marketing Manager" }
]
}
]
}
Seções complexas repetidas
Os loops foreach podem repetir seções inteiras de conteúdo, incluindo vários parágrafos, formatação e estruturas aninhadas.
Repetição de múltiplos parágrafos
Modelo:
<<foreach [product in products]>>
Product Name: <<[product.name]>>
Description: <<[product.description]>>
Price: $<<[product.price]>>
Available: <<[product.inStock]>>
<</foreach>>
Este modelo gera um bloco de descrição completo para cada produto, mantendo toda a formatação e quebras de parágrafo.
Iteração Condicional
Combine laços foreach com instruções condicionais para geração seletiva de conteúdo.
Exemplo: Exibição condicional
Modelo:
<<foreach [employee in employees]>>
<<if [employee.age > 50]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</if>>
<</foreach>>
Alternativamente, utilize métodos de enumeração:
Modelo:
<<foreach [employee in employees.Where(e => e.age > 50)]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</foreach>>
Formatação dentro de loops
Aplique formatação aos campos dentro dos loops foreach para obter um estilo de saída consistente.
Modelo:
<<foreach [customer in customers]>>
Customer: <<[customer.name]:caps>>
Last Visit: <<[customer.lastVisit]:"MMMM dd, yyyy">>
Status: <<[customer.status]:upper>>
<</foreach>>
Variáveis de loop e indexação
Acesse informações sobre a posição do loop usando variáveis implícitas (se suportadas pela versão do seu mecanismo de templates).
Variáveis de Loop Comuns
- Índice do item atual (baseado em 0 ou em 1, dependendo da implementação)
- Contagem de iterações do loop
- Indicadores de primeiro/último item
Exemplo de uso (se compatível):
<<foreach [item in items]>>
<<[$index + 1]>>. <<[item.name]>>
<</foreach>>
Considerações sobre o desempenho
Melhores práticas para loops
- Limitar o tamanho da coleção - Filtrar coleções grandes antes do processamento do modelo
- Evite ninhos muito profundos. - Limite os loops aninhados a 2 ou 3 níveis para melhor desempenho.
- Dados de pré-processamento - Realizar cálculos complexos antes de passar os dados para os modelos.
- Utilize consultas eficientes Filtrar e classificar dados no nível da fonte de dados
Exemplo: Dados pré-filtrados
Em vez de:
<<foreach [emp in employees.Where(e => e.age > 30).OrderBy(e => e.name)]>>
Pré-filtre os dados em sua aplicação e passe-os filtrados:
<<foreach [emp in filteredEmployees]>>
Padrões comuns
Padrão 1: Lista Numerada
<<foreach [item in items]>>
<<[$index]>>. <<[item.title]>>
<</foreach>>
Padrão 2: Conteúdo Agrupado
<<foreach [category in categories]>>
## <<[category.name]>>
<<foreach [item in category.items]>>
- <<[item.name]>>
<</foreach>>
<</foreach>>
Padrão 3: Seção de Resumo
<<foreach [report in reports]>>
Report: <<[report.title]>>
Total Records: <<[report.records.Count()]>>
Average Value: <<[report.records.Average(r => r.value)]>>
<</foreach>>
Solução de problemas
Problemas comuns
Emitir: Erros de referência nula
Solução: Usar Any() verificar coleções antes da iteração
Emitir: Quebras de linha ou espaçamento indesejados Solução: Gerencie cuidadosamente o espaço em branco em seu modelo.
Emitir: Problemas de desempenho com coleções grandes Solução: Pré-filtre os dados e limite os tamanhos das coleções.
Emitir: Vinculação de dados incorreta Solução: Verifique se os nomes das propriedades correspondem exatamente à sua estrutura de dados.
Exemplo prático: Itens de linha da fatura
Modelo completo:
Invoice #<<[invoiceNumber]>>
Date: <<[invoiceDate]:"dd.MM.yyyy">>
Items:
<<if [lineItems.Any()]>>
<<foreach [item in lineItems]>>
<<[item.name]:caps>> - Qty: <<[item.quantity]>> - Price: $<<[item.price]:"F2">> - Total: $<<[item.quantity * item.price]:"F2">>
<</foreach>>
Subtotal: $<<[lineItems.Sum(i => i.quantity * i.price)]:"F2">>
<<else>>
No items in this invoice.
<</if>>
:::dica Iterações Complexas Para cenários de iteração complexos, considere pré-processar seus dados na lógica do seu aplicativo antes de passá-los para o modelo. Isso melhora a legibilidade e o desempenho do modelo.
:::