verschachtelte foreach / if Anweisungen

kazuhisa

Grünschnabel
Hi zusammen,

ich habe ein Problem mit folgender Situation: Ich möchte in einem dreispaltigen Grid Artikel aufbauen. Bei manchen Artikeln brauche ich eine Überschrift, die dann natürlich oberhalb des wrappers stehen muss, damit die volle Breite und der Fluss korrekt ist.

Da die items in einem CMS hinzugefügt werden, wird manchen eine passende Überschrift, wie eine Kategorie, über ein select Feld hinzugefügt ($item->header). Problem hierbei ist, dass das foreach um den gesamten Komplex liegen sollte, damit die gefunden Artikel unter $item zu finden sind.

Ich habe den code stark gestutzt, damit das ganze übersichtlich bleibt. Ist es technisch möglich, ein verschachteltes foreach zu haben, und gleichzeitig eine Ausgabe des ersten foreach nicht allen anderen items anzuhängen.

Hier mein code, der ohne, aber mit header nicht korrekt funktioniert. Ich denke meine if- und foreach sind völliger Humbug?

<?php foreach($pages->find('template=article') as $header): ?>
<?php if ($header->headline): ?>
<div class='header' >
<h3><?=$item->header?></h3>
</div>
<?php endif; ?>
<div uk-grid>
<!-- wenn es keinen 'header' für ein item gibt, wird foreach im wrapper mit items bzw. einzelnen Spalten (uk-width-1-3) gefüllt -->
<div class="wrapper" uk-grid>
<?php foreach($pages->find('template=article') as $item): ?>
<div class="uk-width-1-3@m">
1/3 columns
</div>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
 
Ohne das getestet zu haben besteht das Problem darin, dass Du, wenn Du erst die innere Schleife begonnen hast, nicht mehr in den oberen Zweig für den Header hinein kommst.
Ich würde das mit nur einer Schleife erledigen:
<?php
// Merker, der angibt, dass wir am Start der Ausgabe sind:
$start = true;
foreach ($pages->find('template=article') as $item):
// Hat das aktuelle Element eine Headline?
if ($item->headline):
if (!$start):
// Wenn wir nicht am Start der Ausgabe sind
// müssen wir den letzten Wrapper abschließen:
echo '</div>';
endif;
// Jetzt geben wir die Überschrift aus:
echo '<div class="header">';
echo '<h3>' . $item->header . '</h3>';
echo '</div>';
// Und öffnen den Wrapper für die übrigen Elemente:
echo '<div class="wrapper" uk-grid>';
endif;
// Hier geben wir die 3 Spalten aus:
echo '<div class="uk-width-1-3@m">';
echo '</div>';
endforeach;
// Jetzt müssen wir noch den letzten Wrapper abschließen:
echo '</div>';
Um einen besseren Überblick über die Struktur des PHP zu haben, war ich so frei, das Geflecht mit den öffnenden und schließenden PHP-Klammern weg zu lassen.

brauche ich eine Überschrift, die dann natürlich oberhalb des wrappers stehen muss, damit die volle Breite und der Fluss korrekt ist.
Nicht unbedingt, Du kannst in deinem Grid die drei Spalten verbinden und dort die Überschrift hinein schreiben. Dann wird das PHP ein ganzes Stück einfacher und übersichtlicher:
Code:
<div class="wrapper" uk-grid>';
    <?php
        foreach ($pages->find('template=article') as $header):
            // Hat das aktuelle Element eine Headline
            // geben wir diese aus:
            if ($header->headline):
                echo '<h3>' . $item->header . '</h3>';
            endif;
            // Hier geben wir das aktuelle Item aus
            // Ein Wrapper ist nicht erforderlich:
            echo '<div class="uk-width-1-3@m">';
            echo '</div>
        endforeach;
    ?>
</div>
CSS:
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}

.wrapper h3 {
grid-column: 1/4;
}
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück