CnC: Cache&Compress für CMSimple_XH

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
frase
Posts: 5085
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: CnC: Cache&Compress für CMSimple_XH

Post by frase » Fri Jul 06, 2018 9:41 am

Habe gerade ein Problem, was ich mir nicht so recht erklären kann.
Wahrscheinlich mache ich nur wieder mal etwas falsch.

Ich habe ein (Test-)Template, in dem ich einen Teil der Seite (Hero) per Javascript ausgeben muss (Thread dazu).
Der Hero-Text wird über "morepagedata" festgelegt.
Im Test-Template auf der Seite Datenschutz tritt ein eigenartiges Phänomen auf, sobald ich CnC aktiviere.

Der morepagedata-Eintrag für die zweite Textzeile im Hero lautet:

Code: Select all

Der Datenschutz ist uns <em>seeeehr</em> wichtig!
Ab "seeeehr" wird die Schrift auch wirklich kursiv - hört aber gar nicht mehr damit auf.
Der gesamte Rest der Seite, bis in den Footer, bleibt kursiv.

Schalte ich CnC auf inaktiv, dann ist alles wieder in Ordnung.
In der CnC-Konfiguration habe ich morepagedata unter Ignore bei JS und CSS eingetragen. Ich glaube aber, das hat gar nichts mit morepagedata zu tun, sondern mit dem Script-Aufruf im Template. Möglicherweise ist die Maskierung der Slashes falsch?
Die betreffende Zeile sieht im Template so aus:

Code: Select all

document.write('... <p class="container"><?php if(isset($heroText)){echo $heroText;}else{echo '';}?><\/p> ...');
Irgendetwas passiert da bei der Minifizierung.
Aber was?
Ich lasse mal die "kaputte" Demo so stehen. Später, bei der Veröffentlichung des Templates, werde ich CnC deaktivieren müssen.
Oder, wir finden eine Lösung.

Nachtrag:
Im Quelltext der gerenderten Seite sieht der JS-Aufruf so aus:

Code: Select all

document.write(' ... <p class="container">Der Datenschutz ist uns <em>seeeehr wichtig!<\/p> ... ');
Das schließende </em> ist also verschwunden.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: CnC: Cache&Compress für CMSimple_XH

Post by cmb » Fri Jul 06, 2018 11:02 am

frase wrote:
Fri Jul 06, 2018 9:41 am
Möglicherweise ist die Maskierung der Slashes falsch?
Ich denke, das ist das Problem. Probier doch mal folgenden Morepagedata-Eintrag:

Code: Select all

Der Datenschutz ist uns <em>seeeehr<\/em> wichtig!
Oder allgemeiner im Template:

Code: Select all

document.write('... <p class="container"><?php if(isset($heroText)){echo str_replace('</', '<\/', $heroText);}?><\/p> ...');
(das überflüssige else habe ich auch gleich entfernt)

Selbst wenn obiges nun auch mit CnC funktioniert, gibt es dennoch ein allgemeines Problem, wenn im Morepagedata-Eintrag einfache Anführungszeichen (') vorkommen. Ich verzichte daher lieber ganz auf solche JS/PHP-Mixe, und würde eher folgendes versuchen:

Code: Select all

var heroText = <?=json_encode(isset($heroText) ? $heroText : '')?>;
document.write('... <p class="container">' + heroText + '<\/p> ...');
Christoph M. Becker – Plugins for CMSimple_XH

frase
Posts: 5085
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: CnC: Cache&Compress für CMSimple_XH

Post by frase » Fri Jul 06, 2018 11:08 am

Danke.
Ich werde das alles gleich durchprobieren.

Was ich vorher schon probierte ist:

Code: Select all

Der Datenschutz ist uns <em>seeeehr wichtig!<\/em>
Hier greift aber wieder irgendeine Bereinigungsfunktion von morepagedata (oder vom Core?). Der Backslash ist beim nächsten Aufruf wieder weg.

frase
Posts: 5085
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: CnC: Cache&Compress für CMSimple_XH

Post by frase » Fri Jul 06, 2018 11:59 am

Hu. Ha. Brrrrr.

Das war ja 'n Ding.
Mein Template-Code sieht jetzt so aus:

Code: Select all

<!-- HERO SECTION -->
<script>
var heroHeadline = <?=json_encode(isset($heroHeadline) ? $heroHeadline : $title)?>;
var heroText = <?=json_encode(isset($heroText) ? $heroText : '')?>;
document.write('<section class="hero">');
document.write('<div class="hero-inner">');
document.write('<p class="heroHeadline container">' + heroHeadline + '<\/p>');
document.write('<p class="container">' + heroText + '<\/p>');
document.write('<div class="heroScroll"><div><a href="#start"><span class="chevronBtn fa fa-angle-down fa-3x"><\/span><\/a><\/div><\/div>');
document.write('<\/div><\/section>');
</script>
Und wenn ich jetzt in morepagedata Text mit html-Tags eingebe ...
... na? ...
Es klappt!
MIT und OHNE CnC.
Einfach super!

Vielen, vielen Dank, Christoph!
(Programmierer-Krone on your head.)

(Da kann ich jetzt die Demo aktualisieren. Spätere Leser können das dann nicht mehr nachvollziehen.)

frase
Posts: 5085
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: CnC: Cache&Compress für CMSimple_XH

Post by frase » Tue Jun 11, 2019 7:44 am

cmb wrote:
Fri Jul 06, 2018 11:02 am
Selbst wenn obiges nun auch mit CnC funktioniert, gibt es dennoch ein allgemeines Problem, wenn im Morepagedata-Eintrag einfache Anführungszeichen (') vorkommen. Ich verzichte daher lieber ganz auf solche JS/PHP-Mixe, und würde eher folgendes versuchen:

Code: Select all

var heroText = <?=json_encode(isset($heroText) ? $heroText : '')?>;
document.write('... <p class="container">' + heroText + '<\/p> ...');
Hi,
ich habe jetzt einen ähnlichen Fall wie hier zitiert.
Ich möchte eine Variable (z.B. $heroText) aus Morepagedata ausgeben, würde aber gerne auf das JS (document.write('...) verzichten.
Einfach im html: <?=json_encode(isset($heroText) ? $heroText : '')?>; funktioniert zwar, aber die Anzeige ist dann in doppelte Anführungszeichen eingeschlossen.
Gibt es eine Möglichkeit das ohne die Anführungszeichen und ohn JS hinzubekommen?

Oder ???
Besteht keine weitere Gefahr, wenn man einfach nur "<?=$heroText?>" im html ausgibt?
"$heroText" wird in Morepagedata in einem einfachen Input-Feld erfasst, wo alles mögliche eingegeben werden könnte?

Holger
Site Admin
Posts: 3470
Joined: Mon May 19, 2008 7:10 pm
Location: Hessen, Germany

Re: CnC: Cache&Compress für CMSimple_XH

Post by Holger » Tue Jun 11, 2019 9:06 am

frase wrote:
Tue Jun 11, 2019 7:44 am
Ich möchte eine Variable (z.B. $heroText) aus Morepagedata ausgeben, würde aber gerne auf das JS (document.write('...) verzichten.
Einfach im html: <?=json_encode(isset($heroText) ? $heroText : '')?>; funktioniert zwar, aber die Anzeige ist dann in doppelte Anführungszeichen eingeschlossen.
Sicher, dass das funktioniert? Normalerweise müsste json_encode() ja die Slashes maskieren. Aus </p> würde doch <\/p> werden, was den Code ja zerstören würde. Du müsstet also mindestens JSON_UNESCAPED_SLASHES noch als Option verwenden.
Die doppelten Anführungszeichen, die json_encode() dir mit auswirft, könntest du vielleicht einfach löschen, indem du das erste und letzte Zeichen der Ausgabe einfach entfernst.

Code: Select all

substr($variable, 1, -1);
Ob das so die richtige Lösung zur Übernahme und Ausgabe von html ist? Keine Ahnung :? . Ich hab' das selber so noch nie getestet.

frase wrote:
Tue Jun 11, 2019 7:44 am
Besteht keine weitere Gefahr, wenn man einfach nur "<?=$heroText?>" im html ausgibt?
Wenn der Benutzer mit doppelten und einfachen Anführungszeichen falsch umgeht (und Morepagedata das nicht schon von sich aus beeinigt), wird das unter Umständen in ungültigem html und Ausgabefehlern enden.

frase
Posts: 5085
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: CnC: Cache&Compress für CMSimple_XH

Post by frase » Tue Jun 11, 2019 9:26 am

Holger wrote:
Tue Jun 11, 2019 9:06 am
Wenn der Benutzer mit doppelten und einfachen Anführungszeichen falsch umgeht (und Morepagedata das nicht schon von sich aus beeinigt), wird das unter Umständen in ungültigem html und Ausgabefehlern enden.
Eben, sowas hatte ich befürchtet, und mich an diesen Thread erinnert (oh Wunder).
Trotzdem habe ich jetzt doch mal getestet, einfach mitten im html:

Code: Select all

<?=isset($heroText) ? $heroText : ''?>
Als Text habe ich einfach mal sowas eingegeben:

Code: Select all

<strong>XXX</strong> <em>italic</em> 'xxx' äöüß () "x"
Kommt sauber rüber.
Wahrscheinlich hatte ich mich täuschen lassen, weil ich im ursprünglichen Projekt (in diesem Thread) das JS unbedingt brauchte - jetzt aber nicht mehr, im Gegenteil.
Also: Offensichtlich behandelt Morepagedata die Zeichenketten richtig und gut.
Entwarnung.

Holger
Site Admin
Posts: 3470
Joined: Mon May 19, 2008 7:10 pm
Location: Hessen, Germany

Re: CnC: Cache&Compress für CMSimple_XH

Post by Holger » Tue Jun 11, 2019 9:34 am

frase wrote:
Tue Jun 11, 2019 9:26 am
Also: Offensichtlich behandelt Morepagedata die Zeichenketten richtig und gut.
Das hatte ich gehofft (konnte nur eben nicht testen). Und eigentlich ist das Textfeld in Morepagedata ja auch dafür gedacht, denke ich zumindest.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: CnC: Cache&Compress für CMSimple_XH

Post by cmb » Sat Jun 15, 2019 2:06 pm

frase wrote:
Tue Jun 11, 2019 9:26 am
Trotzdem habe ich jetzt doch mal getestet, einfach mitten im html:

Code: Select all

<?=isset($heroText) ? $heroText : ''?>
Als Text habe ich einfach mal sowas eingegeben:

Code: Select all

<strong>XXX</strong> <em>italic</em> 'xxx' äöüß () "x"
Kommt sauber rüber.
Was meinst du mit "sauber"? Wird der Text so im HTML ausgegeben? Falls ja, dann muss man natürlich aufpassen, was man im Morepagedatafeld eingibt, weil man sonst das HTML "beschädigen" kann.
Christoph M. Becker – Plugins for CMSimple_XH

frase
Posts: 5085
Joined: Thu Apr 21, 2016 6:32 am
Location: Saxony
Contact:

Re: CnC: Cache&Compress für CMSimple_XH

Post by frase » Sat Jun 15, 2019 2:11 pm

cmb wrote:
Sat Jun 15, 2019 2:06 pm
Was meinst du mit "sauber"? Wird der Text so im HTML ausgegeben? Falls ja, dann muss man natürlich aufpassen, was man im Morepagedatafeld eingibt, weil man sonst das HTML "beschädigen" kann.
Der Text wird tatsächlich so wie eingegeben angezeigt.
Aber du hast völlig recht, wird zum Beispiel ein <em>-Tag im Eingabefeld nicht richtig geschlossen, "zerhauts" den Rest der Seite.
Geprüft wird die Eingabe also nicht.

Post Reply