MB: HTML-Code Schnipsel in CMS?

moin community,

möchte genauer wissen, wie die aus CMS-Tabellen gewonnenen Daten in HTML integriert werden. Wenns nur um Texte, Headlines, Verweise in Gruppen gehen würde, wäre es easy. Es geht um z.B. typografische erhebungen im Text: lorem <strong>ipsum</strong> säh dann in CMS-Tabellen Eintrag codiert so aus: lorem %3Cstrong%3Eipsum%3C%2Fstrong%3E. Wird bei mir schon unübersichtlich.

Was ist mit Listen, Bildern, Tabellen oder Codeausschnitten in einem einzigen Artikel. Wie kann ich die Trennung der Funktion und Präsentation bewaren? Mein wissensstand ist, das ich diesen gesamten HTML-Artikel codieren muss und dann in die CMS-Tabelle schiebe. Oder mir für jede HTML-Struktur ein eigenes Template baue, das dann mit Daten gefüttert wird und dann kaskadierend von der HTML-Tabelle, zum Artikel, zur gesamten <html>-Datei zum Browser vom Client gesendet wird.

Macht man sowas in der Art oder gibts n schönen Zwischen weg z.B. RegEx mit preg_math?

vlg MB

PS: sorry ich weis kein besseren Weg um den Sachverhalt zu beschreiben 😕, ich hoffe es ist jetzt jedem klar

PSS: Ich hatte das Thema im Thread schonmal, aber auch wieder nicht so Konkret

  1. Suchst du vielleicht einfach nur sowas wie CKEditor? Der macht ja genau das - der zeigt HTML an zur Bearbeitung durch den Benutzer und stellt das Ergebnis als Formularfeld zum abschicken und abspeichern bereit.

  2. Wer erzeugt denn bei Dir Content? Sind das beliebige Benutzer, so ist eine redaktionelle Aufarbeitung unerläßlich. So erstellen unbekannte Nutzer auch keine Tabellen mit Markup, vielmehr stellst Du da eine Maske bereit wo die Daten einzutragen sind und wo ggf. neue Zeilen hinzugefügt werden können.

    Was den semantischen Aufbau einer Seite selbst betrifft, beschreibt ja das View bzw. das Template. Da jede Seite, sofern Content-Type: text/html, gleichermaßen einen <head>, <body> bzw. <main> Bereich hat, ergeben sich schon mehrere Templates die stets in derselben Reihenfolge ausgegeben werden. Von Außen nach Innen gesehen qualifiziert Deine MVC-Klasse z.B. nur noch den <body>, alles Andere ist ja auf jeder Seite gleich.

    Von weiteren und von text/html abweichenden beliebigen Content-Types abgesehen, die ein CMS natürlich auch auszugeben hat, bspw. eine Ajax-Response in application/json.

    MfG

  3. Tach!

    Es geht um z.B. typografische erhebungen im Text: lorem <strong>ipsum</strong> säh dann in CMS-Tabellen Eintrag codiert so aus: lorem %3Cstrong%3Eipsum%3C%2Fstrong%3E. Wird bei mir schon unübersichtlich.

    Eine Datenbank ist keine URL, eine URL-Kodierung ist unangebracht. In der Datenbank sollten Rohdaten zu liegen kommen, was in deinem Fall mit HTML angereicherter Text ist, ohne irgendwelche Kodierungen von bestimmten Zeichen. Solltest du SQL-Statements zu Fuß zusammenbauen statt Prepared Statements zu verwenden, dann muss lediglich der Kontext "SQL-Statement" berücksichtigt werden.

    Was ist mit Listen, Bildern, Tabellen oder Codeausschnitten in einem einzigen Artikel.

    Das ist aus Sicht der Datenbank alles nur Daten. Texte in einem CMS haben üblicherweise keine Struktur, die es erlauben würde, die Daten der Texte in ein relationales Verhältnis zu bringen. Das ist einfach nur ein großer Text.

    Wie kann ich die Trennung der Funktion und Präsentation bewaren?

    Was genau möchtest du da trennen?

    Mein wissensstand ist, das ich diesen gesamten HTML-Artikel codieren muss und dann in die CMS-Tabelle schiebe.

    Kodieren wofür?

    Oder mir für jede HTML-Struktur ein eigenes Template baue, das dann mit Daten gefüttert wird und dann kaskadierend von der HTML-Tabelle, zum Artikel, zur gesamten <html>-Datei zum Browser vom Client gesendet wird.

    Nein, sowas ist viel zu umständlich und bringt keinen Nutzen. Es sei denn, du hast strukturierbare Daten. Ansonsten einfach VARCHAR(ausreichendgroß) oder TEXT (oder MEDIUMTEXT oder LONGTEXT) und fertig ist.

    Macht man sowas in der Art oder gibts n schönen Zwischen weg z.B. RegEx mit preg_math?

    Um was zu erreichen?

    dedlfix.

    1. moin dedlfix,

      ok ich machs sehr deutlicher: Ich wollte euch die Code-Beispiel echt ersparen 😕:

      <html lang="<?=$...?>">
        <head>
          <title><?=$...?></title>
        </head>
        <body>
          <header><?=$...?></header>
          <nav><?=$...?></nav>
          <main><?=$...?></main>
          <footer><?=$...?></footer>
        </body>
      </html>
      

      in z.B. <main> Kommt dann sowas rein:

      <article>
        <header>
          <h2><?=$...?></h2>
          <p class="article-overview">
            <?=$...?>
          </p>
        </header>
        <p class="article-content">
          <?=$...?>
        </p>
        </footer><?=$...?></footer>
      </article>
      

      Hinweis: <?=$...?> ist für irgendeine variable

      den content z.B. zur Einleitung mit ner <ul> und ne <table> mitten drin oder n <img>

        ...text...<br />
        <?= /* ul */ ?>
        ...nochmehrtext...
        <?= /* table */ ?>
        ...text...
        <?= /* img */ ?>
      

      dann die tabelle

      <table>
        <caption><?=$...?></caption>
        <thead>
          <?php foreach() : ?>
          <td><?=$...?></td>
          <?php endforeach; ?>
        <tbody>
          <?php foreach() : ?>
          <td><?=$...?></td>
          <?php endforeach; ?>
        </tbody>
        <tfoot>
          <?php foreach() : ?>
          <td><?=$...?></td>
          <?php endforeach; ?>
        </tfoot>
      </table>
      

      Wie gesagt ich kann für jede Struktur n eigenes View-Template bauen und gestalten, das dann mit Daten gefüttert wird, aber ich verliere da die Übersicht, wie ich was anstellen soll. Wenn man einmal eine solide Konzeption hat, kann ich sofort anfangen aber erstmal eine solide Konzeption haben. Da hänge ich. Soll ich bei diese View-Template Code-Schnipseln bleiben um eine vorzeigbare View zu präserntieren oder hab ihr da n besseren weg den ich zufuß gehen kann?

      vlg MB

      1. Tach!

        ok ich machs sehr deutlicher: Ich wollte euch die Code-Beispiel echt ersparen 😕:

        Damit wird leider nicht deutlich, was für Daten du vorliegen hast. Bei "CMS" geht man üblicherweise davon aus, dass man ein Grundgerüst hat mit Navigation und anderen statischen Dingen (wie Footer). Und du hast einen großen Bereich, in dem der Hauptinhalt zu liegen kommt. Der Hauptinhalt ist ein Text, den du zur Entwicklungszeit noch nicht kennst, ebensowenig seine Struktur (Absätze, Überschriften). Das ist Inhalt, den der Bediener erzeugt, im einfachsten Fall in einer Textarea, oder komfortabel mit einem Wysiwyg-Editor. Diesen Text nimmst du komplett, steckst in in die Datenbank. Bei Requests holst du ihn wieder heraus und fügst ihn in das Grundgerüst ein. Es besteht keine Notwendigkeit, den auseinanderzupflücken, um ihn dann wieder so zusammenzusetzen. Es sei denn, du hast irgendwelche weitergehenden Verarbeitungen vor.

        Wenn du hingegen strukturierte Daten hast (zum Beispiel eine Artikel-Datenbank für einen Shop), dann sieht die Sachlage natürlich anders aus. Aber das läuft dann nicht mehr unter dem Begriff CMS.

        dedlfix.

        1. moin dedlfix,

          Wenn du hingegen strukturierte Daten hast (zum Beispiel eine Artikel-Datenbank für einen Shop), dann sieht die Sachlage natürlich anders aus. Aber das läuft dann nicht mehr unter dem Begriff CMS.

          ok danke für die Info. Ist die technische Terminologie, die hier im Forum Anwendung findet, strikt definiert oder ein Teil eher inflationär und nur im kontext definiert? Ein DBMS ist doch in CMS subsummiert. z.B. phpMyAdmin ist doch beides oder nicht?

          vlg MB

          PS: Ich möchte mich auf Begriffe verlassen können die fest definiert sind, und die ich gottseidank selbst nicht erklären muss und Abkürzungen verwenden kann wie CMS. Jeder weis was gemeint ist.

          1. Tach!

            Ist die technische Terminologie, die hier im Forum Anwendung findet, strikt definiert oder ein Teil eher inflationär und nur im kontext definiert?

            Sprache und deren Anwendung ist nur selten strikt und ansonsten von Missverständnissen und anderen Fehlern geprägt. Sie ist jedenfalls nicht mit der Striktheit von Protokollen oder Programmiersprachen zu vergleichen. Und selbst in letzteren gibt es meist nicht nur eine Möglichkeit, sich ausdrücken zu können. "Hier im Forum" ist auch keine eindeutige Menge. Hier im Forum schreiben Personen mit unterschiedlich langer Erfahrung und Begriffssicherheit. Fachbegriffe sollen dazu dienen, dass man wenigen Wörtern eine möglichst genaue Kommunikation zustandekommen kann. Nicht jeder kennt alle Fachwörter und deren übliche Bedeutung, und um Fehler zu vermeiden, muss man erstmal wissen, was da vielleicht nicht richtig sein könnte.

            Manche Begriffe sind ziemlich genau definiert, andere hingegen sind nur Sammelbegriffe. Als CMS = Content Management System könnte man jedes beliebige System ansehen, denn alle beschäftigen sich irgendwie mit Content. Das hilft aber nicht weiter. Der Begriff sollte trotz seiner sehr allgemeinen Bedeutung - wenn man ihn wörtlich nimmt - reserviert bleiben für Systeme, die zum Beispiel wie Wordpress, Joomla, Drupal arbeiten. Mit denen man also Inhalte (beliebige Texte) verwalten kann, die im Web veröffentlicht werden sollen.

            Ein DBMS ist doch in CMS subsummiert. z.B. phpMyAdmin ist doch beides oder nicht?

            Nein, nur wenn man CMS wörtlich nimmt. Ein DBMS verwaltet natürlich auch Inhalte. Aber üblicherweise werden mit dem Begriff CMS keine DBMSe bezeichnet. Datenbanken werden häufig als Speichermedium für CMSe verwendet, aber auch für viele andere Systeme. Ein DBMS arbeitet im Hintergrund und ist nicht dafür ausgelegt, Inhalte einem "normalen Publikum" zu präsentieren, sondern von Programmen bedient zu werden, die die Interaktion mit den Anwendern übernehmen.

            phpMyAdmin ist weder CMS noch DBMS sondern eine administrative Oberfläche um sich die DBMS-Inhalte ansehen zu können.

            Ein LKW ist ein LastKraftWagen. Ein Bus transportiert auch eine Last mittels Kraft. Trotzdem ist die Bezeichnung LKW für die Fahrzeuge vorgesehen, die für den Güterverkehr bestimmt sind, und Bus für die Beförderung von Personen. Und auch wenn mit einem LKW (unerlaubterweise) Personen befördert werden, sagt man dazu nicht Bus, weil das falsche Assoziationen beim Nachrichtenempfänger auslöst.

            Wenn du also vom CMS sprichst, dann nehmen die meisten an, du meinst ein Wordpress-ähnliches System. Wie mir scheint, hast du es aber unüblicherweise als Oberbegriff verwendet. Sowas sorgt natürlich für Verwirrung auf beiden Seiten.

            PS: Ich möchte mich auf Begriffe verlassen können die fest definiert sind, und die ich gottseidank selbst nicht erklären muss und Abkürzungen verwenden kann wie CMS. Jeder weis was gemeint ist.

            Das wäre schön, ist aber mit Menschen und menschlicher Sprache nicht vollständig zu erreichen.

            dedlfix.

            1. Hallo dedlfix,

              Ein LKW ist ein LastKraftWagen. Ein Bus transportiert auch eine Last mittels Kraft. (...) wenn mit einem LKW (unerlaubterweise) Personen befördert werden

              (Fettsatz von mir)

              Sag das mal der Bundeswehr, die haben (oder hatten?) Lastwagen mit Bänken hinten drin, und damals, als ich seltsame Gewänder in steingrau-oliv trug und noch planloser als heute umherirrte, haben sie uns mit solchen Gefährten von Essen nach Dinslaken zum Schießstand transportiert. Die Ladefläche hatte immerhin eine Plane, war aber hinten offen. Schöne frische Luft mit gewissen Anteilen an Ruß und Stickoxiden. Sicherheitsgurt? Nö. 45km Fahrt? Yup!

              Rolf

              1. moin RolfB,

                [...] und damals, als ich seltsame Gewänder in steingrau-oliv trug und noch planloser als heute umherirrte, haben sie uns mit solchen Gefährten von Essen nach Dinslaken zum Schießstand transportiert. [...]

                Bis du auch Essener?

                vlg MB

                1. Hallo MB,

                  nee, weder Essener noch Essēner. Aber Esser 😂

                  Ich war in Kupferdreh in der Grundausbildung, als da auf der Dilldorfer Höhe noch die Ruhrlandkaserne stand. Ich lebe in der Nähe von Köln und stamme aus Gummersbach.

                  Rolf

                  1. moin RolfB

                    nee, weder Essener noch Essēner. Aber Esser 😂

                    ich dachte.

                    Ich lebe in der Nähe von Köln und stamme aus Gummersbach.

                    In Gummersbach lebte die jetzige Frau von meinen Vetter der CS-Zocker und Jetzt Maschinenbauer. War auch n paar mal da zur besuch. Aber Sorry, zurück zum Thema. Ich plauder zuviel und dafür ist dieses Forum nicht gedacht. Sorry. Ich hab kein Probleme damit wenn dieser Post gelöscht wird.

              2. Sag das mal der Bundeswehr, die haben (oder hatten?) Lastwagen mit Bänken hinten drin, .. 45km Fahrt? Yup!

                Weicheier. 200 km ohne Bank war meine Bestleistung als Tramper in Zivil 😉

            2. moin dedlfix,

              Ist die technische Terminologie, die hier im Forum Anwendung findet, strikt definiert oder ein Teil eher inflationär und nur im kontext definiert?

              Sprache und deren Anwendung ist nur selten strikt und ansonsten von Missverständnissen und anderen Fehlern geprägt. Sie ist jedenfalls nicht mit der Striktheit von Protokollen oder Programmiersprachen zu vergleichen.

              gut gesprochen

              Fachbegriffe sollen dazu dienen, dass man wenigen Wörtern eine möglichst genaue Kommunikation zustandekommen kann. Nicht jeder kennt alle Fachwörter und deren übliche Bedeutung, und um Fehler zu vermeiden, muss man erstmal wissen, was da vielleicht nicht richtig sein könnte.

              meine rede. Du bringst es auf den punkt was ich nicht schaffe.

              Wenn du also vom CMS sprichst, dann nehmen die meisten an, du meinst ein Wordpress-ähnliches System. Wie mir scheint, hast du es aber unüblicherweise als Oberbegriff verwendet. Sowas sorgt natürlich für Verwirrung auf beiden Seiten.

              Mein Fehler.

              PS: Ich möchte mich auf Begriffe verlassen können die fest definiert sind, und die ich gottseidank selbst nicht erklären muss und Abkürzungen verwenden kann wie CMS. Jeder weis was gemeint ist.

              Das wäre schön, ist aber mit Menschen und menschlicher Sprache nicht vollständig zu erreichen.

              das ist wahr 😏. aufjedenfall danke für die erleuchtung.

              vlg MB

  4. Hallo MB,

    ein CMS dürfte so gestrickt sein, dass es Seiten-Templates hat, in die es benutzerdefinierte HTML-Fragmente einsetzt. Diese Fragmente können aus anderen Templates generiert werden, oder mit einem HTML Editor wie CKEditor erfasst werden. Es ist dann natürlich Sache des Seitenlayouts, über CSS dafür zu sorgen, dass ein einheitliches Theme eingehalten wird, und Sache der Template- und Fragment-Autoren, ihre Bausteine so zuzuliefern dass das Theme auch wirkt. Wer Bilder anzeigen will, muss sie ohnehin separat ins CMS hochladen.

    Inwieweit CKEditor dabei hilft oder stört, musst Du herausfinden. Auf deren Homepage gab's eine Toolbar mit Bild-Include und einer Funktion "Server nach Bild durchsuchen" - da steckte garantiert ein Add-On dahinter, das die Bilderliste vom Server geholt hat.

    Was die Ablage der Bausteine in der DB angeht: niemand zwingt dich, das HTML Markup dazu in den CMS Tabellen zu maskieren. Das ist nicht nötig. Eine HTML Maskierung brauchst Du nur dann, wenn du verhindern willst, dass vom User geliefertes HTML vom Browser interpretiert wird. Aber das willst Du hier ja gerade nicht verhindern. Du musst nur verhindern, dass Dir ein CMS Autor bösartiges HTML ins Fragment schiebt. Dabei hilft CKEditor, weil man damit das HTML nicht selbst schreibt.

    Anders wird es, wenn Du für CMS-Artikel Vorlagen definieren willst, die vom CMS automatisch ausgefüllt werden sollen. Da brauchst Du selbstgebaute Extralogik, das die auszufüllenden Felder mit Inhalt versieht, solche Felder KÖNNTE man dann per HTML codieren, z.B. als <div class="templateField">template-steuerbefehle</div> - und das Innere dieses div wird vom CMS dann ausgewertet um das Templatefeld auszufüllen. Dabei stört CKEditor allerdings eher, weil er kein freies HTML zulässt. Du musst die Templatefelder also anders codieren, oder ein Add-On für CKEditor suchen, das dich dabei unterstützt. Für die eigene Auswertung, d.h. das Finden der Templatefelder, wäre jedenfalls preg_match ganz hilfreich. Die DOM-Funktionen von PHP scheinen eher auf XML statt HTML ausgelegt zu sein. Was aus meiner Sicht jedenfalls nicht taugt, wäre ein Datenmodell in der Datenbank, das auf konkrete Templatestrukturen ausgelegt ist. Dazu sind solche Templates viel zu variabel.

    Rolf

    --
    Dosen sind silbern
    1. Tach!

      Du musst nur verhindern, dass Dir ein CMS Autor bösartiges HTML ins Fragment schiebt.

      Das ist bei einem CMS in der Regel kein Kriterium, solange die Autoren handverlesen sind. Bei einem Wiki, das auf anonyme Mitarbeit setzt und HTML zulässt, wäre das anders.

      Zudem lässt sich "bösartig" nicht maschinell erkennen. Zum Beispiel ist auch Code bösartig, der einfach nur ein unerwünschtes Bild anzeigt. Wie will man das vom Anzeigen erwünschter Bilder unterscheiden?

      dedlfix.

      1. Hallo dedlfix,

        schon klar. Man kann nur Dinge abfangen, die technisch böse sind, also Script-Tags.

        Inhalte in Wort und Bild kann nur ein Lektor absichern. Wenn man Autoren dabei hat, denen man nicht vertraut, braucht das CMS ein Prüf- und Freigabeverfahren.

        Das hindert den bösen Autor aber auch noch nicht daran, ein <img> Tag zu setzen, dessen src eine URL mit Nebenwirkungen ist. Da hilft nur korrekte CMS Programmierung, die keine GET Requests mit Nebenwirkungen akzeptiert (also sowas wie /wiki/delete/4711 nicht als GET-Request zum Löschen von irgendwelchen Dingen zulässt).

        Rolf

        --
        Dosen sind silbern
    2. Hallo Rolf,

      Du musst nur verhindern, dass Dir ein CMS Autor bösartiges HTML ins Fragment schiebt. Dabei hilft CKEditor, weil man damit das HTML nicht selbst schreibt.

      Ein Editor wie CKEditor oder TinyMCE hilft – dem Zweck angemessen konfiguriert – dabei, dass sie das unbeabsichtigt machen (z.B. kaputtes HTML einfügen), gegen die „bösen Jungs“ hilft HTML Purifier.

      Anders wird es, wenn Du für CMS-Artikel Vorlagen definieren willst, die vom CMS automatisch ausgefüllt werden sollen. Da brauchst Du selbstgebaute Extralogik, das die auszufüllenden Felder mit Inhalt versieht, solche Felder KÖNNTE man dann per HTML codieren, z.B. als <div class="templateField">template-steuerbefehle</div> - und das Innere dieses div wird vom CMS dann ausgewertet um das Templatefeld auszufüllen. Dabei stört CKEditor allerdings eher, weil er kein freies HTML zulässt. Du musst die Templatefelder also anders codieren, oder ein Add-On für CKEditor suchen, das dich dabei unterstützt. Für die eigene Auswertung, d.h. das Finden der Templatefelder, wäre jedenfalls preg_match ganz hilfreich.

      Ich habe für sowas einen TinyMCE mit dem NonEditable-Plugin im Einsatz. Wird zur Bearbeitung einer Seite benutzt, auf der eine einzelne festgelegte Bildergalerie eingefügt wird. Ein <div class="bildergalerie">%gallery%</div> wird dann Server-seitig entsprechend bearbeitet. Vor und nach der Bildergalerie können dann nach Belieben andere Inhalte platziert werden, ohne dass die Gefahr bestünde, dass der Platzhalter aus Versehen gelöscht wird (eine Server-seitige Kontrolle sollte man hier auch noch implementieren).

      Gruß
      Julius

  5. Hallo MB,

    Wie kann ich die Trennung der Funktion und Präsentation bewaren?

    Falls du mit der Funktion den Inhalt meinst, bist du wahrscheinlich auf dem falschen Pfad, weil semantisches Markup oft zum Inhalt dazugehört.

    Für speziellere Dinge wie Bildergalerien oder dynamsiche Terminkalender würde ich mir aber schon eine dafür geeignete Datenstruktur überlegen, damit man die Präsentation leicht ändern kann, ohne auch die Inhalte anfassen zu müssen.

    Gruß
    Julius