Leerzeile zum Start im Content (keine Ahnung wo die herkommt)

markherrmann

Guten Morgen,
ich habe bisher nur die Änderungen entsprechend Ticket durchgeführt:

                                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.' -->' : '');
                                    // echo $sContent = $sBeforeContent."\n".$sContent."\n".$sAfterContent."\n";
                                    echo $sContent = \ltrim($sBeforeContent."\n".$sContent."\n".$sAfterContent."\n", "\n");
                                }


Fetten Dank für das Feedback. Ich weiß ja jetzt, wo ich reinschauen muss um noch mal Hand anzulegen. Mittlerweile habt Ihr netter Weise auch ein Ticket erfasst, so dass ich mir bei späteren Updates keine Gedanken machen muss, was noch abzuändern wäre.

EINEN GROSSEN DANK AN ALLE BETEILIGTEN.

sternchen8875

QuoteIch weiß: CSS-Styles im Quellcode sind hässlich, das sind nur Tests
häßlich oder nicht, es ist valides HTML

QuoteDie ominösen 2 Leerzeilen kommen auch dort. Nur eben woanders, wo der Inhalt aus dem CMS geladen wurde.

welche Variante hast du denn jetzt in der frontend.functions.php
Zeig mal die Zeile 294 - 299 bitte

Bei dieser Variante bleiben die beiden hinteren \n ja stehen, wie Manu im Ticket-Post beschrieben hatte. Es entfernt nur das erste \n
echo $sContent = \ltrim($sBeforeContent."\n".$sContent."\n".$sAfterContent."\n", "\n");

mit dieser Zeite werden dann alle \n entfernt
echo $sContent = \trim($sBeforeContent."\n".$sContent."\n".$sAfterContent."\n", "\n");

allerdings brauch ich sie dann ja auch garnicht erst setzen.  :wink:

echo $sContent = $sBeforeContent.$sContent.$sAfterContent;
macht aber auch häßlichen Quellcode


markherrmann

Anmerkung: Die ominösen 2 Leerzeilen kommen auch dort. Nur eben woanders, wo der Inhalt aus dem CMS geladen wurde.


<section id="content">
...
<hr><p style="margin-top: 20px;">Seite ausgeliefert am 09.02.2023 20:56 Uhr - Europe/Berlin (CET)</p>
*** LEERZEILE 1***
*** LEERZEILE 2***
</section>


PS. Ich weiß: CSS-Styles im Quellcode sind hässlich, das sind nur Tests.  :wink:

markherrmann

Bisschen überarbeitet:

Quellcode neu:
function readNewsPosting($in_reverse_count=1) {
// Diese Funktion liest die letzten (in_reverse_count) News aus der Datenbank -> Rückgabe als Array
global $database;
$out = array();
$sql_command = "SELECT title, content_short, link, published_when FROM ".TABLE_PREFIX."mod_news_posts";
$sql_command .= " WHERE active = 1 ORDER BY posted_when DESC";
$sql_command .= " LIMIT ".$in_reverse_count;
$get_db = $database->query($sql_command);
$db_found = $get_db->numRows();
if ($db_found > 0) {
while ($db = $get_db->fetchRow()) {
$temp_array = array();
$temp_array["name"] = $db["title"];
$temp_array["desc"] = $db["content_short"];
$temp_array["link"] = WB_URL.PAGES_DIRECTORY.$db["link"].'.php';
$temp_array["time"] = $db["published_when"];
$out[] = $temp_array;
} // end while
} // end if db_found
return $out;
} // end function

// *** MAIN *************************************************************
date_default_timezone_set('Europe/Berlin');
$time_now = time();
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";

// URLS AUS MENU #1
ob_start();
show_menu2(1, SM2_ROOT, SM2_ALL, SM2_ALL|SM2_ALLINFO, '[url];', '', '', '', false, false);
$array_menus = explode(";", ob_get_contents());
$array_menus_removed = array_pop($array_menus); // das letzte Element aus Menus war immer leer (deswegen fliegt es raus)
$array_posts = readNewsPosting(20);
ob_end_clean();
for ($i=0; $i<(count($array_menus)); $i++) {
echo '<url>'."\n";
echo '<loc>'.$array_menus[$i].'</loc>'."\n";
echo '<lastmod>'.date("Y-m-d", $time_now).'</lastmod>'."\n";
echo '<changefreq>'.'weekly'.'</changefreq>'."\n";
echo '</url>'."\n";
} // end for

// URLS AUS NEWS-POSTINGS
for ($i=0; $i<(count($array_posts)); $i++) {
echo '<url>'."\n";
echo '<loc>'.$array_posts[$i]["link"].'</loc>'."\n";
echo '<lastmod>'.date("Y-m-d", $time_now).'</lastmod>'."\n";
echo '<changefreq>'.'weekly'.'</changefreq>'."\n";
echo '</url>'."\n";
} // end for

// URLS AUS MENU #2
ob_start();
show_menu2(2, SM2_ROOT, SM2_ALL, SM2_ALL|SM2_ALLINFO, '[url];', '', '', '', false, false);
$array_menus = explode(";", ob_get_contents());
ob_end_clean();
for ($i=0; $i<(count($array_menus)-1); $i++) {
echo '<url>'."\n";
echo '<loc>'.$array_menus[$i].'</loc>'."\n";
echo '<lastmod>'.date("Y-m-d", $time_now).'</lastmod>'."\n";
echo '<changefreq>'.'weekly'.'</changefreq>'."\n";
echo '</url>'."\n";
} // end for
echo '</urlset>';


Template:
<?php header("Content-type: text/xml");
echo 
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
"."\n"; ?>
<?php page_content(); ?>


Ausgabe XML:

<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://argeforum.de</loc>
<lastmod>2023-02-09</lastmod>
<changefreq>weekly</changefreq>
</url>
...
</urlset>
*** LEERZEILE 1***
*** LEERZEILE 2***


Im Normalen Template endet es regulär mit </footer>
</body>
</html>


:?

markherrmann

Hi, der erste Lösungsansatz von sternchen8875 hatte super funktioniert. Ich hab das Originalfile "frontend.functions.php" zurück gespielt und dann den letzten Code aus dem Ticket an Pos. 299 wie beschrieben abgeändert:

                                    $sAfterContent  = ($bPrintAnchor ? '</div><!-- INFO '.$module.$section_id.' -->' : '');
                                    // echo $sContent = $sBeforeContent."\n".$sContent."\n".$sAfterContent."\n";
echo $sContent = \ltrim($sBeforeContent."\n".$sContent."\n".$sAfterContent."\n", "\n");



Bringt jetzt bei der ersten Ausgabe der HTML Startseite folgende Fehlermeldung:

There was an uncatched exception
Failed opening required '/...../framework/frontend.functions.php' (include_path='.:/opt/RZphp80/includes')
in line (73) of (/index.php):


Der XML-Inhalt dagegen läuft problemlos...
<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://argeforum.de</loc>
<lastmod>2023-02-09</lastmod>
<changefreq>weekly</changefreq>
</url>
...


Nach dem manuellen Aufruf der XML-Seite habe ich die Startseite nochmal geladen und alles wurde fehlerfrei geladen. ?!?
Vielleicht hätte ich den Cache des Chrome nochmal leeren sollen, habe noch einmal im FF (privater Modus) die Startseite (HTML) aufgerufen, keine Fehler, danach die XML https://argeforum.de/pages/sitemap/xml-sitemap.php direkt angesprochen... ebenfalls keine Fehler. Nur 3 Leerzeilen am Ende

Dann test, der RSS Inhalte ist identisch...
läuft aber 3 Leerzeilen am Ende https://argeforum.de/pages/rss.php

Ich schau mal noch schnell in den Quellcode fürs XML ob ich die Leerzeilen nicht selbts produziere (für eine davon bin ich wohl selbst verantwortlich) hier der Code:

function readNewsPosting($in_reverse_count=1) {
// Diese Funktion liest die letzten (in_reverse_count) News aus der Datenbank
// Rückgabe als Array
global $database;
$out = array();
$cnt = 0;
$sql_command = "SELECT title, content_short, link, published_when FROM ".TABLE_PREFIX."mod_news_posts";
$sql_command .= " WHERE active = 1 ORDER BY posted_when DESC";
$sql_command .= " LIMIT ".$in_reverse_count;
$get_db = $database->query($sql_command);
$db_found = $get_db->numRows();
if ($db_found > 0) {
while ($db = $get_db->fetchRow()) {
$out[$cnt]["name"] = $db["title"];
$out[$cnt]["desc"] = $db["content_short"];
$out[$cnt]["link"] = WB_URL.PAGES_DIRECTORY.$db["link"].'.php';
$out[$cnt]["time"] = $db["published_when"];
$cnt++;
} // end while
} // end if db_found
return $out;
} // end function

// *** MAIN *************************************************************
date_default_timezone_set('Europe/Berlin');
$time_now = time();
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
// MENU1
ob_start();
show_menu2(1, SM2_ROOT, SM2_ALL, SM2_ALL|SM2_ALLINFO, '[url];', '', '', '', false, false);
$array_menus = explode(";", ob_get_contents());
$array_menus_removed = array_pop($array_menus); // das letzte Element aus Menus war immer leer (deswegen fliegt es raus)
$array_posts = readNewsPosting(20);
ob_end_clean();
// Basemenüs
for ($i=0; $i<(count($array_menus)); $i++) {
echo '<url>'."\n";
echo '<loc>'.$array_menus[$i].'</loc>'."\n";
echo '<lastmod>'.date("Y-m-d", $time_now).'</lastmod>'."\n";
echo '<changefreq>'.'weekly'.'</changefreq>'."\n";
echo '</url>'."\n";
} // end for
// News Postings
for ($i=0; $i<(count($array_posts)); $i++) {
echo '<url>'."\n";
echo '<loc>'.$array_posts[$i]["link"].'</loc>'."\n";
echo '<lastmod>'.date("Y-m-d", $time_now).'</lastmod>'."\n";
echo '<changefreq>'.'weekly'.'</changefreq>'."\n";
echo '</url>'."\n";
} // end for

// MENU2
ob_start();
show_menu2(2, SM2_ROOT, SM2_ALL, SM2_ALL|SM2_ALLINFO, '[url];', '', '', '', false, false);
$array_menus = explode(";", ob_get_contents());
ob_end_clean();
for ($i=0; $i<(count($array_menus)-1); $i++) {
echo '<url>'."\n";
echo '<loc>'.$array_menus[$i].'</loc>'."\n";
echo '<lastmod>'.date("Y-m-d", $time_now).'</lastmod>'."\n";
echo '<changefreq>'.'weekly'.'</changefreq>'."\n";
echo '</url>'."\n";
} // end for

echo '</urlset>'."\n";


FETTES DANKE ANS #DEV TEAM !!!




hgs

Die "Endscheider" lesen mit und haben es in das Ticketsystem eingetragen.
Eine Quikfix Lösung steht ja auch da, vielleicht kannst du das mal testen und Feedback geben.
LG Harald

"Fange nie an, aufzuhören - höre nie auf, anzufangen." Marcus Tullius Cicero (106-43 v.Chr.)

sternchen8875

Quote from: markherrmann on February 07, 2023, 07:55:06 PM
Vielleicht sollten WB Entscheider berücksichtigen, dass nicht nur HTML ausgegeben wird.

Ich weiß garnicht, wann das gewesen, ich glaube, WB 2.10, vielleicht auch noch eher. WB 2.10 war in 2017 und du bist jetzt der erste, der dort ein Problem hat. Und mal ehrlich, wenn du das Problem nicht gemeldet hättest, wäre da nie und nimmer jemand drüber gestolpert ;-)
Der Haken an diesem mit "none" auskommentierten Block-Div ist, das eine Leerzeile übrig bleibt, die man im HTML-Quelltext auch nicht hat, von daher kann man niemanden einen Vorwurf machen. Mit heutigem Wissen ist es aber eine Kleinigkeit, auch vom Aufwand her, das bissl Code so umzustellen, das es auch für deine Variante des Outputs ohne Probleme läuft.
Ob das jetzt schon zur nächsten Version oder Patch (PHP 8.2 ready) passiert, will ich nicht versprechen, denn der ist schon fast in den Startlöchern. Aber dann weißt du, wie du das lösen kannst
Ich werde mal ein Ticket aufmachen, dann schauen wir weiter. Rückmeldung erfolgt dann von mir.

markherrmann

Vielen Dank für deine Ausführungen warum WB das so macht (find ich echt gut), ich kannte auch die alten Versionen von WB und irgendwann später mal kam dieses DIV dingens auf.

In meinem Anker steht auch "none". Das aber ein DIV gemacht wird war mir nicht klar, weil ich sehs ja auch nicht im Quellcode der Ausgabe.
Aber hey jetzt funktioniert alles gut.

Das einzig für mich störende, es läuft bis zum nächsten Update. ;-)
Aber der Tip von oben war echt Goldwert.

Vielleicht sollten WB Entscheider berücksichtigen, dass nicht nur HTML ausgegeben wird.

DANKE DANKE DANKE  (Y) (Y) (Y)

sternchen8875

Quote from: markherrmann on February 06, 2023, 08:22:09 PM
Grundsätzliche Frage, mache ich das so falsch? Ich spiel ungern an den Installationsfiles rum.

Nein, es ist nichts falsch daran. Was richtig und falsch ist, bestimmst du als Nutzer ganz allein.
Auf Grund der wachsenden Inhalte und der Thematik oben angeführter Webadresse vermute ich, das dort ein umfangreicheres Webprojekt entstehen soll. Auf Grund der Einfachheit verwendest du dafür ein CMS und bei dem geht es vorrangig um die  Darstellung von Inhalten.
XML ist da eher auf Datentransport ausgelegt, weniger auf ein schönes Design und leichte Bearbeitung, siehe eben eine Sitemap. Sie wird von Suchmaschinen zur Indizierung genutzt, eine Besucheransicht mit obigen Code macht wenig Sinn. Natürlich kann man es nun optisch aufbereiten, aber einen Mehrwert an Informationen bringt es nur für dich und die Suchmaschine. Aber natürlich gibt es auch andere Dinge, die man mit XML machen kann und bei denen es dann sehr wohl um Inhalte geht.
Ich selbst nutze XML nur noch im Rahmen einer Google-Sitemap oder als RSS für meine Projekte, bin da also eher Anfänger.

Quote from: markherrmann on February 06, 2023, 08:22:09 PM
Gibt es eine andere herangehensweise um XML oder RSS auszugeben und dabei die Prüfroutinen von WB nicht zu stressen?

Fragst du mich persönlich,  wäre ein Modul, in das man, wie bei News oder Wysiwyg Daten eingibt, die man dann über XML oder RSS wieder ausgibt, meine erste Wahl. Dabei lassen sich alle Funktionen des CMS nutzen wie Datenbankobjekt, Datenbankverbindung, aber auch alles andere, was sonst nur "unter der Haube" läuft, z.b. das show_menu2(), das du oben ja schon verwendest. Ich persönlich ziehe für die Ausgabe dann die Bordmittel vor, sprich: PHP, HTML, Twig, ich erinnere mich aber, das es früher hier mehr Kollegen gab, die den ganzen Content über XML ausgegeben haben.

Bei einer anderen Möglichkeit würde ich CMS ein CMS sein lassen und das, was ich brauch, separat vom CMS laufen lassen. Also praktisch so, als wäre kein CMS da.

Zu meinen im letzten Post gezeigten Code-Ausschnitt aus der frontend.functions.php noch eine Erläuterung:
Der da von mir auskommentierte Code war ein Community-Wunsch. Dabei ging es darum, jeden Block im Frontend  separat ansprechen zu können, z.b. um ein One-Page-Projekt umzusetzen oder JS-Menüs. Im Prinzip also ein dynamischer Anker. WB hat zwar die Möglichkeit, solchen Anker in den WB-Optionen anzugeben, der wäre aber statisch. WB hat auch die Möglichkeit, solchen Anker mit dem Wort none in den WB-Optionen -> Erweiterte Optionen -> Servereinstellungen -> Abschnitts-Anker-Text zu deaktivieren, aber im Quellcode bleibt dann diese Leerzeile übrig, die in HTML nicht stört, aber dein XML ungültig macht. Meine gezeigte Änderung ist das, was es früher in den WB-Versionen bis WB 2.8.3 gab.

Das nur zur Erklärung, was dieses Stück auskommentierter Code gemacht hätte und was die Änderung für "Folgen" hätte

markherrmann

Danke Dir für die ausführliche Beschreibung. Ich werde kurzfristig mal schauen, dass ich die Files anpasse.

Du schreibst:
Quoteeine normale Reaktion, wenn man vom Standard abweicht. WB prüft mit genanntem Filter die HTML-Kompatibilität, in der es z.b. heißt: die Struktur ist
...
QuoteAllein dieses Schema passt nicht, von Rest red ich garnicht.

Ich gebe nicht immer HTML aus, manchmal produziere ich auch RSS Feeds, hier jetzt XML als Sitemap, manchmal initiiere ich so auch einen Download.
Grundsätzliche Frage, mache ich das so falsch? Ich spiel ungern an den Installationsfiles rum.

Gibt es eine andere herangehensweise um XML oder RSS auszugeben und dabei die Prüfroutinen von WB nicht zu stressen?

Gruß und schönen Abend.


sternchen8875

#4
Quote from: markherrmann on February 04, 2023, 09:48:40 AM
die Leerzeile ist noch da (steht nur woanders).
die erzeugst du selbst mit dem \n am Ende der Zeile, das benötigst du aber wiederum für dem XML-konformen Output
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"; ?>

Das Problem ist aber ein anderes. WB erzeugt um jeden Block page_content() ein DIV. Dieses DIV enthält Namen des Moduls, eine CSS-Klasse dazu usw Das ist der Inhalt deiner Zeile 1 im alten, XML-konformen Code. Das wären diese auskommentierten Zeilen auf der frontend.functions.php, Zeilennummern im Bild

Wenn du deinen Spaß so auskommentierst wie in meinem Bild und die letzte Zeile einfügst, erhälst du eine XML-konforme Ausgabe, aber das schließende
echo '</urlset>'."\n";
nicht vergessen. (sicher Kopierfehler)


P.S.: aktuell verstehe ich dein Vorhaben noch nicht. Obige Lösungswege würden wohl eine XML-konforme Sitemap erzeugen, das CMS als solches aber für alles andere unbrauchbar machen, aber du hast da sicher einen Plan.
Geht es nur um die Sitemap, gäbe es auch andere Lösungen

Quote from: markherrmann on February 04, 2023, 09:48:40 AM
Ich erinnere mich, ich musste in der WB Installationsdatei eine Zeile auskommentieren. Sonst bricht die Ausgabe von XML mit Fehlermeldung ab.

Ich habe in der Datei: /modules/output_filter/Filters/filterCssToHead.php die Zeile: #67 throw new \Exception('malformed document created, missing head area'); mit // auskommentiert. WB prüft die Ausgabe, das war meine einzige Möglichkeit selbst zu bestimmen was ausgeliefert wird.

eine normale Reaktion, wenn man vom Standard abweicht. WB prüft mit genanntem Filter die HTML-Kompatibilität, in der es z.b. heißt: die Struktur ist
<html>
    <head>
    </head>
    <body>
    </body>
</html>

Allein dieses Schema passt nicht, von Rest red ich garnicht.

markherrmann

In meinem Template stand nur <?php page_content(1); ?> keine Leerzeichen nix.

Zum testen bin ich jetzt mal anderes rangegangen. Ich habe ein neues Template namens xml2 erstellt wir folgt:
in der index.php steht jetzt:

<?php header("Content-type: text/xml");
echo 
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
\n"; ?>
<?php page_content(); ?>


Meinen Quellcode habe ich entsprechend abgeändert:
date_default_timezone_set('Europe/Berlin');
$time_now = time();
ob_start();
show_menu2(1, SM2_ROOT, SM2_ALL, SM2_ALL|SM2_ALLINFO, '[url];', '', '', '', false, false);
$array_menus = explode(";", ob_get_contents());
ob_end_clean();
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
for ($i=0; $i<(count($array_menus)-1); $i++) {
echo '<url>'."\n";
echo '<loc>'.$array_menus[$i].'</loc>'."\n";
echo '<lastmod>'.date("Y-m-d", $time_now).'</lastmod>'."\n";
echo '<changefreq>'.'weekly'.'</changefreq>'."\n";
echo '</url>'."\n";
} // end for
echo '</urlset>'."\n";


Es geht jetzt, weil vor header nix mehr steht, aber sauber ist es nicht... die Leerzeile ist noch da (steht nur woanders).
Ergebnis der Abfrage ist jetzt:
<?xml version="1.0" encoding="UTF-8" ?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://argeforum.de</loc>
<lastmod>2023-02-04</lastmod>
<changefreq>weekly</changefreq>
</url>
...
</urlset>


Was noch gelaufen ist...
Ich erinnere mich, ich musste in der WB Installationsdatei eine Zeile auskommentieren. Sonst bricht die Ausgabe von XML mit Fehlermeldung ab.

Ich habe in der Datei: /modules/output_filter/Filters/filterCssToHead.php die Zeile: #67 throw new \Exception('malformed document created, missing head area'); mit // auskommentiert. WB prüft die Ausgabe, das war meine einzige Möglichkeit selbst zu bestimmen was ausgeliefert wird.

sternchen8875

Zeig mal bitte die Zeilen um diesen Aufruf <?php page_content(1); ?>

Das XML selbst ist in Ordnung und erzeugt keine Leerzeile, wenn ich es an anderer Stelle teste. Von daher kann es nur an deiner Umgebung liegen

markherrmann

Hi Leute,
meine Inhalte beginnen immer mit einer Leerzeile (hier zu sehen: https://argeforum.de/pages/sitemap/xml-sitemap.php).

ich hab keinen Plan wieso. Vielleicht kennt sich jemand damit aus.

Ein paar Daten zur Konfig und Code.

Das Web läuft unter PHP 8.0 (Strato).

Das Template ist denkbar einfach:
<?php page_content(1); ?>

Der Code, der das XML generieren soll:
header('Content-Type: text/xml');
date_default_timezone_set('Europe/Berlin');
$time_now = time();
ob_start();
show_menu2(1, SM2_ROOT, SM2_ALL, SM2_ALL|SM2_ALLINFO, '[url];', '', '', '', false, false);
$array_menus = explode(";", ob_get_contents());
ob_end_clean();
echo '<'.'?xml version="1.0" encoding="UTF-8"'.'?'.'>'."\n";
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
for ($i=0; $i<(count($array_menus)-1); $i++) {
echo '<url>'."\n";
echo '<loc>'.$array_menus[$i].'</loc>'."\n";
echo '<lastmod>'.date("Y-m-d", $time_now).'</lastmod>'."\n";
echo '<changefreq>'.'weekly'.'</changefreq>'."\n";
echo '</url>'."\n";
} // end for
echo '</urlset>'."\n";