XF 2.3 Avoiding multiple foreach loops in this template code?

Joe Link

Well-known member
We place new members in a trial group until they hit criteria for full membership. Within conversations, we want to show a small single line notice to full members if there's a single participant in the trial group, or a larger notice with a list of members in this group if there's multiple members in the trial group.

I trial-and-error'd my way to working code, but it seems inefficient to use one foreach just for counting (to determine which notice to display) and another for displaying the list (when applicable). Is there a better way?

Code:
<xf:foreach loop="$recipients" value="$recipient" i="$exampleRecipientCount" if="($recipient.User.user_id != $xf.visitor.user_id) && $recipient.User.isMemberOf(<trial group ID>) && !$recipient.User.isMemberOf(<full member group ID>)"></xf:foreach>
<xf:if is="$exampleRecipientCount > 1">
    Large List Notice
    <ul>
        <xf:foreach loop="$recipients" value="$recipient" if="($recipient.User.user_id != $xf.visitor.user_id) && $recipient.User.isMemberOf(<trial group ID>) && !$recipient.User.isMemberOf(<full member group ID>)">
            <li>{$recipient.User.username}</li>
        </xf:foreach>
    </ul>
<xf:elseif is="$exampleRecipientCount == 1" />
    Small Single Notice
</xf:if>
 
Code:
<xf:set var="$trialGroupId" value="<!-- trial group ID here -->" />
<xf:set var="$fullGroupId" value="<!-- full member group ID here -->" />

<xf:set var="$trialCount" value="0" />
<xf:set var="$trialListHtml" value="" />

<xf:foreach loop="$recipients" value="$recipient">
    <xf:if is="$recipient.User
        && $recipient.User.user_id != $xf.visitor.user_id
        && $recipient.User.isMemberOf($trialGroupId)
        && !$recipient.User.isMemberOf($fullGroupId)">
        
        <xf:set var="$trialCount" value="{{ $trialCount + 1 }}" />
        <xf:set var="$trialListHtml" value="{$trialListHtml}<li><a href='{{ link('members', $recipient.User) }}'>{$recipient.User.username}</a></li>" />
    </xf:if>
</xf:foreach>

<xf:if is="$trialCount > 1">
    <!-- Large List Notice -->
    <div class="blockMessage blockMessage--important">
        <strong>Heads up:</strong> Multiple trial members are in this conversation.
        <ul class="listInline listInline--comma">
            {$trialListHtml|raw}
        </ul>
    </div>
<xf:elseif is="$trialCount == 1" />
    <!-- Small Single Notice -->
    <div class="blockMessage blockMessage--highlight">
        A trial member is in this conversation.
    </div>
</xf:if>

How about this?
 
Back
Top Bottom