Оператор Foreach в smarty php

#php #laravel #smarty

#php #laravel #smarty

Вопрос:

У меня есть следующее:

     {foreach key=num item=invoice from=$invoices}
    <tr>
        <td class="text-center"><a href="viewinvoice.php?id={$invoice.id}">#{$invoice.invoicenum}</a></td>
        <td>{$invoice.datecreated}</td>
        <td>{$invoice.datedue}</td>
        <td data-order="{$invoice.totalnum}">{$invoice.total}</td>
        <td class="text-center">{include file="$template/includes/status-pages/status-faturas.tpl"}</td>
        <td class="text-center">
            {if $invoice.rawstatus eq 'paid'}
                {foreach from=$nfseData item=items}
                    {if $items.title|substr:16:4 eq $invoice.id amp;amp; in_array($items.status, ['Answered', 'Closed'])}
                            <a href="{$WEB_ROOT}/dl.php?type=aamp;id={$items.id}amp;i=0" class="btn-sm rounded p-2 btn-success has-ripple"><i class="feather mr-1 icon-download"></i> Download NFS-e</a>
                        {elseif !in_array($items.status, ['Answered', 'Closed'])}
                            <a href="#!" class="btn-sm rounded p-2 btn-secondary has-ripple disabled"><i class="feather icon-refresh-cw mr-1"></i> Em processamento</a>
                            
                        {else}
                            <a href="{$WEB_ROOT}/submitticket.php?step=2amp;deptid=27amp;subject=NFS-e | Fatura #xxx | Valor R$xxxx" class="btn-sm rounded p-2 btn-primary has-ripple"><i class="feather icon-layout mr-1"></i> Solicitar NFS-e</a>
                        {/if}
                {/foreach}
            {else}
                <strong>N/D</strong>
            {/if}
        </td>
        <td class="text-center"><a href="viewinvoice.php?id={$invoice.id}" class="btn-sm rounded p-2 btn-info has-ripple"><i class="feather mr-1 icon-eye"></i> Ver fatura</a></td>
    </tr>
{/foreach}
  

Возврат html:

 <div>
    <span>No - 1030</span>
    <span>Yes - 1020</span>
</div>
<div>
    <span>No - 1030</span>
    <span>No - 1020</span>
</div>
  

Мне нужно, чтобы он возвращался следующим образом:

 <div>
    <span>Yes - 1020</span>
</div>
<div>
    <span>No - 1030</span>
</div>
  

Массив для: $invoices

 Array (4)
0 => Array (13)
  id => 1020
  rawstatus => "paid"
1 => Array (13)
  id => 1030
  rawstatus => "unpaid"
  

Массив для: $nfseData

 Array (2)
0 => Array (27)
  id => 6446
  title => "NFS-e | Fatura #1020 | Valor R$59,90"
1 => Array (27)
  id => 6445
  title => "NFS-e | Fatura #1030 | Valor R$39,90"
  

Проблема в том, что возврат from=$nfseData имеет более одной записи, и в этом случае он дублирует строки, не следуя этому правилу: {if $items.title|substr:16:4 eq $invoice.id}

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

Есть ли возможность поместить это правило непосредственно в foreach , чтобы оно возвращало только строки, которые подчиняются правилу? Или есть какой-то другой способ?

Комментарии:

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

2. @r_a_f Это было действительно запутанно, я не знаю, как лучше это объяснить. Мне нужно, чтобы он возвращал только один результат в первом if и только один результат во втором if , следуя первоначальному правилу. Короче говоря, мне нужно, чтобы он возвращал только одно значение в каждом div.

3. @r_a_f Я обновил свой вопрос.

4. пожалуйста, добавьте примеры данных для $invoices и $nfseData

5. @JitendraYadav Хорошо, я обновил вопрос, пожалуйста, проверьте.

Ответ №1:

Вы перебираете все элементы для каждого счета. Вы показываете им, принадлежат ли они этому invoice или нет. Вы можете вложить свой status фильтр внутрь if , который проверяет invoice id и не показывает их, если они не совпадают.

 {foreach key=num item=invoice from=$invoices}
    <tr>
        <td class="text-center"><a href="viewinvoice.php?id={$invoice.id}">#{$invoice.invoicenum}</a></td>
        <td>{$invoice.datecreated}</td>
        <td>{$invoice.datedue}</td>
        <td data-order="{$invoice.totalnum}">{$invoice.total}</td>
        <td class="text-center">{include file="$template/includes/status-pages/status-faturas.tpl"}</td>
        <td class="text-center">
            {if $invoice.rawstatus eq 'paid'}
                {foreach from=$nfseData item=items}
                    {if $items.title|substr:16:4 eq $invoice.id}
                        {if in_array($items.status, ['Answered', 'Closed'])}
                            <a href="{$WEB_ROOT}/dl.php?type=aamp;id={$items.id}amp;i=0" class="btn-sm rounded p-2 btn-success has-ripple"><i class="feather mr-1 icon-download"></i> Download NFS-e</a>
                        {elseif $items.status eq 'Open'}
                            <a href="#!" class="btn-sm rounded p-2 btn-secondary has-ripple disabled"><i class="feather icon-refresh-cw mr-1"></i> Em processamento</a>
                            
                        {else}
                            <a href="{$WEB_ROOT}/submitticket.php?step=2amp;deptid=27amp;subject=NFS-e | Fatura #xxx | Valor R$xxxx" class="btn-sm rounded p-2 btn-primary has-ripple"><i class="feather icon-layout mr-1"></i> Solicitar NFS-e</a>
                        {/if}
                    {/if}
                {/foreach}
            {else}
                <strong>N/D</strong>
            {/if}
        </td>
        <td class="text-center"><a href="viewinvoice.php?id={$invoice.id}" class="btn-sm rounded p-2 btn-info has-ripple"><i class="feather mr-1 icon-eye"></i> Ver fatura</a></td>
    </tr>
{/foreach}