WebsiteBaker Support (2.13.x) > General Help & Support
Content-Blöcke, eine kleine Herausforderung
kuerbis42:
Ich will da erstmal antworten, aber ich prüfe das noch.
Was mir aufgefallen ist, ist folgendes:
Ich mache in den Abschnitten die Reihenfolge wie im 1. Bild zusehen ist,
bei der Ausgabe (2. Bild) erscheinen die "Blöcke Typ 1" (hier 2spalten) direkt nacheinander.
Im WYSIWYG-Abschnitt 1 steht "Block 1, 2 Spalten"Im WYSIWYG-Abschnitt 2 steht "Block 2, Spalte links"Im WYSIWYG-Abschnitt 3 steht "Block 3, Spalte rechts"Im WYSIWYG-Abschnitt 4 steht "Block 4, 2 Spalten"(Impressum, Datenschutz, AGB ... ist ja noch Test :) )
--- Code: --- <!-- CONTENT -->
<main class="content-grid">
<?php if (trim($pageContent2spalten) != '') { ?>
<section class="block block-1"><?= $pageContent2spalten; ?></section>
<?php } ?>
<?php if (trim($pageContentlinkespalte) != '') { ?>
<section class="block block-2"><?= $pageContentlinkespalte; ?></section>
<?php } ?>
<?php if (trim($pageContentrechtespalte) != '') { ?>
<section class="block block-3"><?= $pageContentrechtespalte; ?></section>
<?php } ?>
</main>
....
</div>
<?php /* nur zum Test */
page_content(1);
?>
--- End code ---
Ich habe mir auf die Funktion page_content(x) angesehen und analysiert:
die SQL-Abfrage, die dort gemacht wird läuft via while(fetch_assoc) über alle gefundenen Einträge mit Block x (hier 1 == 2spalten) und gibt die dann aus:
frontend.functions.php (ab Zeile 161, hier stark eingekürzt ink.. "wichtigen" Textmarkern (nicht lauffähig so))
--- Code: ---
if (!is_callable('page_content')) {
...
function page_content(int $block = 1) {
// Get outside objects
global $TEXT,$MENU,$HEADING,$MESSAGE; // backwards compability
// static $iSections=1;
static $i=-1;
..... Zeile 228:
$block = (($block < 1) ? 1 : $block);
if (!\defined('PAGE_CONTENT') || (($block !== 1))){
$page_id = (int)(isset($oApp->page_id) ? $oApp->page_id : PAGE_ID);
$sBackLink = $oApp->default_link;
SQL!!!! $sSqlSet = '
SELECT `s`.*
,`p`.`viewing_groups`
,`p`.`visibility`
,`p`.`menu_title`
,`p`.`link`
,`s`.`block`
FROM `'.TABLE_PREFIX.'sections` `s`
INNER JOIN `'.TABLE_PREFIX.'pages` `p`
ON `p`.`page_id`=`s`.`page_id`
WHERE `s`.`page_id` = '.( int)$page_id.'
AND ('.$iNow.' BETWEEN `s`.`publ_start` AND `s`.`publ_end`)
AND `s`.`active` = 1
AND `p`.`visibility` NOT IN (\'deleted\',\'none\')
AND `s`.`block`='.$block.'
ORDER BY `s`.`position`';
.... Zeile 259
while(!is_null($aSection = $oSections->fetchAssoc())) {
.....Zeile 305
if (!empty($sContent) && $isActive) {
$bPrintAnchor = ($bAnchor && ($sSectionIdPrefix == 'none')||($sSectionIdPrefix != 'none'));
$sAnchor = "\n".'<div id="'.$sSectionIdPrefix.$section_id.'" class="section m-'.$module.' '.$sAttribute.'" >';
$sBeforeContent = ($bPrintAnchor ? $sAnchor : '');
$sAfterContent = ($bPrintAnchor ? '</div><!-- INFO '.$module.$section_id.' -->' : '');
HIER!!!! echo $sContent = ltrim($sBeforeContent."\n".$sContent."\n".$sAfterContent."\n");
}
}
// no more sections found, so break e.g from multiselection
if ($iSections == 0){break;}
} // end while
}
.....
} // end function page_content
}
--- End code ---
Oben bei dem HIER!!!! passiert es! Es wird einfach der Inhalt ausgegeben! Die SQL-Abfrage (228) ergibt je nach Fall 1,2 oder 3 oder mehr Zeilen ( AND `s`.`block`='.$block.').
Durch die While-Schleife werden dann die Inhalte der Blöcke aus der DB geholt und ausgegeben.
Aber ich prüfe Eure Vorschläge noch einmal intensiv.
kuerbis42:
Moin Jacobi, Frage dazu:
--- Quote from: jacobi22 on February 27, 2026, 01:26:13 AM ---
--- End quote ---
Die Einträge direkt hinter wysiwyg: hast Du die da "einmontiert"?Weil, ich habe es wirklich getestet: [Mainblock 1] und [Mainblock 2] werden gesamt ausgegeben, wenn Du das testest, dann müsstest Du den Inhalt dieser beiden Abschnitte auch direkt untereinander haben.
Ich habe mir eine neue Funktion page_content2() gebaut - die gibt mir jetzt alle Blöcke einer Seite zurück - genau wie das Original (page_content()) alles aufbröselt, die Rückgabe
ist aber ein Array:
--- Code: ---Array (
[0] => Array ( [1] =>Block 1, 2 Spalten )
[1] => Array ( [2] =>Block 2 (Spalte links) )
[2] => Array ( [3] =>Block 2 (Spalte rechts) )
[3] => Array ( [1] =>Block 4 (2 Spalten) )
[4] => Array ( [2] =>noch einmal linke spalte ) )
--- End code ---
Damit habe ich die Reihenfolge gesichert und weiß, in welchen Block der Inhalt gehört.
jacobi22:
Bin mir aktuell nicht sicher, worauf du hinaus willst oder ob vielleicht andere Vorstellungen bzw Erwartungen vorhanden sind
ein paar Grundsätze zur Klärung vorab. Mag sein, ist dir bekannt, aber bitte nicht gleich mit den Augen rollen ;-)
- per Definition ist jede Section ein einzelner Block, unabhängig vom Typ und Inhalt. Zum besserem Verständnis gehen wir davon aus, das es sich um einfachen Fließtext in Wysiwyg-Modulen handelt. Wenn wir die Möglichkeiten jedes einzelnen Modul, den jeweiligen Content mehrspaltig darstellen zu können, außer Acht lassen, ist es pro Block nicht möglich, diesen mehrspaltig darstellen zu können.
- in der index.php deines Frontend-Templates wird die Funktion page_content() aufgerufen. Der Aufruf ist mit oder ohne eine Zahl möglich. Wird keine Blocknummer übermittelt, ist es immer Block 1. Das regelt diese Zeile, $Block ist der numerische Wert im Funktionsaufruf, also z.b. page_content(3) )
--- Code: ---$block = (($block < 1) ? 1 : $block);
--- End code ---
Du mußt also sicherstellen, das du nicht page_content() und page_content(1) gemeinsam im Template verwendest, sonst können Abschnitte doppelt dargestellt werden.
Der if-Block in der page_content-Funktion ab z.228 - 318
Er ist zuständig für alle Blöcke (bzw Sectionen) mit Übergabe eines numerischen Wertes. Der else-Block darunter regelt die Blöcke ohne solche numerische Übergabe, also page_content() statt page_content(3) und ordnet alle Blöcke ohne Ziffer den Block #1 zu
Im $sSqlSet an Z. 232 werden die Daten festgelegt, die benötigt werden. Ein JOIN zur pages-Tabelle stellt dann sicher, das nur Blöcke auf sichtbaren Seiten eingelesen werden.
Nach Definition der SQL-Abfrage zuerst ein Fallback für den Fall, das keine Sectionen geunden wurden (Z 248 - 251)
In Z 271 - 275 wird die Sichtbarkeit des jeweiligen Blockes geprüft
ab Z. 281 wird dann die jeweilige view.php des einzubindenen Modul aufgerufen
ab Z 293 erfolgt dann die Einbindung des Search-Templates aus den WB-Option, für den Fall, das die Suche bemüht wurde
--- Quote ---Die Einträge direkt hinter wysiwyg: hast Du die da "einmontiert"?Weil, ich habe es wirklich getestet: [Mainblock 1] und [Mainblock 2
--- End quote ---
P.S.: als Tip noch: nutze die Möglichkeit, jeder Section einen eigenen Titel zu geben. Das macht es später einfacher. Dazu in jeder Section oben rechts auf das Zahnrad klicken. Der dort eingegebene Titel erscheint dann auch in der Section-Übersicht (siehe mein Bild oben)
Und noch etwas: Das hier gezeigt Konzept mit dem Page_Content funktioniert seit über 25 Jahren. Nicht nur im UrVater-CMS WebsiteBaker, sondern auch in allen Forks und in abgewandelter Form auch in jedem anderen CMS wie WP, Typo3 usw
Vielleicht zeigst du mal dein Template, gern auch per Mail, wenn du es nicht öffentlich machen möchtest
entweder privat an uwe@jacobi22.com
oder offiziel an board@WebsiteBaker.org bzw support@WebsiteBaker.org
jacobi22:
Lese ich deinen Text, hab ich meine Vermutung...
--- Quote ---[0] => Array ( [1] =>Block 1, 2 Spalten )
[1] => Array ( [2] =>Block 2 (Spalte links) )
[2] => Array ( [3] =>Block 2 (Spalte rechts) )
[3] => Array ( [1] =>Block 4 (2 Spalten) )
[4] => Array ( [2] =>noch einmal linke spalte ) )
--- End quote ---
das geht nicht, oder besser: es wird nicht das Ergebnis liefern, das du erwartest. Jeder Block bzw jeder Funktionsaufruf (wie auch immer der gestaltet ist, siehe Code von dbs im Vergleich zu meinem Code oben) darf im Template nur einmal erscheinen.
Wenn Zwei-spaltig, dann müssen dies auch zwei Blöcke bzw zwei Sectionen sein, bei 3 -spaltig drei Sektionen usw. Über diverse Schalter im PHP des Templates kann man dann auf Inhalt prüfen und mit if/else schalten, ob auf zwei Spalten auch nur eine wird, wenn da kein Inhalt ist.
dbs und Ruud mach das über die Abfrage, ob der Bezeichner existiert. Ich prüfe auf Inhalt und entferne mögliche Leerzeichen, die man mal schnell im Wysiwyg eingetippt hat und die dann Content erzeugen. Die direkte Benutzung der Bezeichner ohne vorherige Definition wird mit neueren PHP irgendwann zu Warnings führen, wenn mal eine Section nicht vorhanden, nicht definiert wurde. Sicherer wäre da, diese erst mit false zu definieren.
--- Quote ---
$fulltop = false;
ob_start(); page_content(1); $main = ob_get_clean();
if ($fulltop) { ....
--- End quote ---
Ist aber jetzt erstmal nebensächlich und für dein Problem nicht von Bedeutung
jacobi22:
Ich denk, ich verstehe nun, was du meinst....
Meine Sectionübersicht, das Bild, das du eben auch zeigtest, nutzt hier zwei Abschnitte vom Block Main. Diese gleichen Blöcke werden zusammengefaßt zu einem, unabhängig von der Position in der Sectionübersicht. Und dies gilt für jeden Blocktype, der in der info.php definiert wurde. Das war auch Absicht der Urväter und behält trotzdem alle Gestaltungsmöglichk eiten
Wenn du das nicht brauchst oder nicht möchtest, definiere weitere Blöcke und schalte sie über PHP-Abfragen im Template
P.S.: ich habe jetzt kein Limit für die Anzahl möglicher Blöcke gefunden, die oben genannte Zahl von 99 ist wohl falsch. Chio hat in einigen seiner Templates die Definition eines Block 99 drin. Also aufpassen, das jeder Block in der info.php und in der index.php nur einmal genannt wird.
Navigation
[0] Message Index
[#] Next page
[*] Previous page
Go to full version