Robert: Zeilenwechsel in textarea-Feld in Mini-CMS

Hi,
ich habe ein Problem mit einem selbstgestrickten Mini-Content-Managementsystem auf Basis einer MySQL-Datenbank, in dem die einzelnen Webseiten in einer Datenbanktabelle gespeichert sind und über PHP auf die Seite gebracht werden, nachdem über den Navigationslink die Seite gewählt wurde. Das funktioniert auch einwandfrei.
Außerdem soll es möglich sein, eine Seite auszuwählen, um sie zu ändern. Dann wird diese Seite in einem Textarea-feld gezeigt, und man kann ergänzen, etwas ändern oder löschen. Auch das läuft, Code kommt weiter unten, falls Ihr solange den Nerv habt.

Ich habe hier a) ein Problem mit den Zeilenumbrüchen bei einer Änderung. Ich verwende natürlich die Funktion nl2br, wenn man beim Ändern im textarea-Feld Zeilenumbrüche macht, das Ganze soll ja in <br /> umgewandelt werden, um dann im HTML-Code zu stehen. Die Zeilen werden nun immer mehr, je öfter die Seite zum Ändern aufgerufen wird. Die genauere Erläuterung folgt unten, weil ich gerne den Code zeigen will, damit Ihr wisst, was ich meine.

b) möchte ich gerne fragen, ob jemand weiß, ob ich die HTML-Tags im textarea-feld "unsichtbar" machen kann, ohne sie aber zu verlieren. Die php-Funktion strip_tags entfernt ja einfach die tags, ich brauche sie aber noch, sie sollen auch nach Änderungen weiter in der mysql-Tabelle stehen, damit man sie nachträglich ändern kann. Es wäre nur schön, wenn man sie einfach nicht sehen würde.
Die Datenbank besteht (bislang) aus einer einzigen Tabelle mit den drei Feldern id, linkname und inhalt. id ist Primärschlüssel und auto_increment, linkname enthält nur den Namen der Unterseite im Navigationsbereich, und inhalt enthält den gesamten "inneren" HTML-Code der Seite, also ohne head usw. Die Seite wird auf den Bildschirm gebracht, wenn im Nav-Bereich gewählt wurde (bisher ist das Ganze noch für register_globals=on, ich kenne die Problematik und werde es noch ändern):
Navi-Bereich: (erzeugt die Liste der anklickbaren Links)
<?php
include ("verbindung.php");
$sql=("select id,linkname from seiten");
   $linkliste = mysql_query($sql);
     while ($row=mysql_fetch_array($linkliste)){
     $test=$row['id'];
     echo "<li><a href="content.php?sch=$test"  target="inhalt"> ";
     echo $row["linkname"];
     echo "</a></li><br>";
                                               }
?>

Dann wird in der Datei content.php die Seite gezeigt:

?php
include ("verbindung.php");
// mit der folgenden query wird der gewünschte Inhalt aus der DB gelesen
   $abfrage=("select inhalt from seiten where id='$sch'");

// in die Variable Ergebnis wird eingelesen, was die Abfrage ergeben hat.
$ergebnis=mysql_query($abfrage);
        $row=mysql_fetch_assoc($ergebnis);
        echo $row["inhalt"];
echo "<br>Admin-Bereich: <a href='admin.php'>Hier klicken</a>";
?>
Durch die Zeile oben:
        echo $row["inhalt"];    wird die komplette HTML-Seite, die ,wie gesagt, in der mysql-Tabelle ist, gezeigt.

Nun kommt der CMS-artige Teil (wie gesagt im Mini-Format), der auf der Datei admin.php zunächst die Auswahl der zu ändernden Dateien zeigt und über checkbox die Seite zum Ändern auswählen lässt, und der außerdem erlaubt, eine neue Seite anzulegen:

Der Link zum Admin-Bereich leitet auf die Detei admin.php, bisher noch ohne Passwortschutz, ist alles erstmal zum Probieren.

<div id=mainlinks>
<h2 class=kurz>Seiten ändern</h2>
<form action="loesch_bearbeit.php" method="post" >
<?php
include ("verbindung.php");
// mit der folgenden query wird der gewünschte Inhalt aus der DB gelesen
   $abfrage=("select inhalt from seiten where id='$sch'");

// in die Variable Ergebnis wird eingelesen, was die Abfrage ergeben hat.
$ergebnis=mysql_query($abfrage);
//  Die Funktion mysql_fetch_assoc holt den Inhalt aus dem Array:
        $row=mysql_fetch_assoc($ergebnis);
        echo $row["inhalt"];

echo "<span class=unterlegt>Liste der Seiten:</span><br><br>";
   echo "<table><tr><td>Seite</td><td>Bearbeiten</td><td>L&ouml;schen</td></tr>";

$liste = mysql_query("select id,linkname from seiten");
/* die folgende Schleife bringt die Namen der Links zur Auswahl und erlaubt, eine davon zum Bearbeiten oder Löschen anzuklicken: */
     while ($row=mysql_fetch_array($liste)){
     echo"<tr><td>";
     $nr=$row['id'];
     echo $row["linkname"]."</td><td> ";
     echo"<input type='checkbox' name='bearbeiten' value='$nr'></input></td>";
     echo"<td><input type='checkbox' name='loeschen' value='$nr'></td></tr>";
                                            }
?>

</table><br>
<div align=center><input type="Submit" name="abschicken" value="Abschicken"></div>
</form>
</div>
<!- - im folgenden Teil kann man eine neue Seite hinzufügen: - ->
<div id=mainrechts>
<h2 class=kurz>Seiten hinzufügen</h2>
Klicken Sie auf den Button unten, um eine neue Seite einzufügen. Sie können den Namen der Seite eingeben, und natürlich den Text. <br>Den Text können Sie aus Word oder anderen Programmen kopieren und einfügen.<br>
Die Seite und der Titel wird in die Datenbank aufgenommen und ist direkt anschließend auf der Website zu sehen.
<form action="neu.php" method="post" >

Hier folgt jetzt der php-Teil der Datei loesch_bearbeit.php. Der Inhalt wird aus der DB-Tabelle gelesen, indem die vorher gewählte id übergeben wurde, und dann wird der HTML-Code mit Text, auf den es hier ja ankommt, in das Textarea-Feld gebracht, damit man Änderungen oder Ergänzungen im Text vornehmen kann. Den unteren Teil zum Löschen brauche ich, glaube ich, nicht näher zu erklären. Er wird ja nur dann gebraucht, wenn mian vorher eine Seite zum Löschen gewählt hat.

<?php
include ("verbindung.php");

if (isset ($bearbeiten) && ($bearbeiten) !=""){
echo "<h2 align='center'>Daten bearbeiten</h2>";

$sql=("select inhalt from seiten where id='$bearbeiten'");
$ergibt=mysql_query($sql);
$row=mysql_fetch_assoc($ergibt);

echo "<form action='update_seiten.php' method='post' >";
$anzeigen=$row[inhalt];
echo "<textarea name='content' cols='70' rows='30'>";

echo "$anzeigen";
echo "</textarea>";

echo "<input type='hidden' name='zahl' value='$bearbeiten'></input>";
echo "<input type='Submit' name='Aufnehmen' value='Änderungen bestätigen'>";
echo "</form>";

}
if (isset ($loeschen) && ($loeschen) !=""){

echo "<br><br><b>Der Eintrag nr.: ".$loeschen." wurde Gel&ouml;scht!!</b>";
  $abfrage="delete from seiten where id=$loeschen";
  $res = mysql_query($abfrage);

if(!$res) {echo mysql_error();
             }
             }
?>
 Wenn Änderungen vorgenommen wurden, wird der gesamte geänderte Seiteninhalt in die Datei update_seiten.php gebracht. Die wandelt die Zeilenwechsel in <br> um, zeigt alles nochmal als echo, und führt das update der Seite aus.
<?php
include ("verbindung.php");
$content=nl2br($content);

$content=stripslashes($content);
echo $content;
 $abfrage="update seiten set inhalt ='$content' where id=$zahl";
$tues=mysql_query($abfrage);
?>

Wie gesagt, alles läuft soweit gut, aber die Zeilenumbrüche: Durch die Zeile
$content=nl2br($content);
verwandle ich Zeilenumbrüche in <br />. Die Zeilenumbrüche an sich bleiben aber drin. Wenn man später nochmal dieselbe Datei aufruft, kommt sie wieder ins textarea-Feld. Der rein optisch sichtbare Zeilenwechsel ist noch da, und zusätzlich das HTML-Tag <br />.
Jedesmal, wenn man die Datei zum Ändern in das textarea-Feld aufruft, gibt es einen Zeilenwechsel mehr! Das <br /> ist da, und der durch Return-Drücken erzeugte Zeilenwechsel, der immer wieder umgewandelt wird!
Ist eigentlich auch logisch, aber ich weiß jetzt nicht weiter, wie ich es verhindern kann.

Wenn mir jemand hierzu einen Rat geben kann, würde ich mich sehr freuen.

P. S. Die beiden Funktionen htmlspecialchars und htmlentities (wie man es in Erläuterungen zu Gästebüchern etc. findet), brauche ich insgesamt meines Erachtens für das Ganze nicht, denn ich will ja das HTML an sich erhalten, es soll ja wieder "wirken", wenn die Seite aufgerufen wird.

Vielen Dank für Eure Geduld – weiß jeman einen Rat?

  1. Hallo Robert,

    ohne den Quellcode durchgelesen zu haben: Ich denke du gehst falsch an die Sache heran.

    Wende _keine_ Funktionen wie nl2br oder htmlspecialchars auf die Eingabe in die Textareas _vor_ dem Speichern in der Datenbank an. Speicher den Text so wie eingegeben ab. Dann hast du auch keine Probleme den Text wieder in der Textarea auszugeben.

    Wende die Funktionen zu Formatierung nur bei der Ausgabe in die HTML Seite an.

    Wenn du so vorgehst hast du noch den Vorteil, dass du die Eingabe auch mal in andere Medien, wie z.B. PDF Dokumente oder so ausgeben kannst.

    Gruß,

    ARne.

    1. Hallo Arne,
      zunächst danke für deine Antwort. Ich möchte aber folgendes: Wenn man in dem textarea-Feld ein paar Absätze hinzufügt, die dann später auf der Seite gezeigt werden, dann drückt man nach jedem Absatz zwei mal Return, um den Zeilenwechsel + Leerzeile zu haben. Damit das auch später gezeigt wird, muss ich den Zeilenwechsel in HTML-Code umwandeln, also in <br />, und deshalb wende ich ja die Funktion nl2br an; ich wüßte jetzt nicht, wie ich es sonst machen soll?
      Gruß
      Robert

      1. hi,

        Damit das auch später gezeigt wird, muss ich den Zeilenwechsel in HTML-Code umwandeln, also in <br />, und deshalb wende ich ja die Funktion nl2br an; ich wüßte jetzt nicht, wie ich es sonst machen soll?

        *seufz*
        Das hat Arne dir doch gerade gesagt:
        Wende nl2br an, aber zu einem günstigeren Zeitpunkt als dem derzeitigen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Okay, ich hab´s geschnallt. Danke -
          Robert

          1. Hi,

            erlaubt mir bitte, auf meine andere Frage noch zurückzukommen: Wie schaffe ich es, die HTML-Tags im textarea-feld "unsichtbar" zu machen kann, ohne sie mit der Funktion strip_tags richtig rauszunehmen, denn sie werden ja noch benötigt?

            Vielen Dank für Tips,

            Robert

            1. hi,

              Wie schaffe ich es, die HTML-Tags im textarea-feld "unsichtbar" zu machen kann, ohne sie mit der Funktion strip_tags richtig rauszunehmen, denn sie werden ja noch benötigt?

              Entferne sie mittels strip_tags aus dem Wert, den du in die Textarea schreibst.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. hallo wahsaga,

                danke für die Antwort. Ich verstehe schon, was du meinst, du sagst, es soll so gemacht werden, dass die Tags nur aus dem Textarea-Feld raus sind; klar kann ich sie aus der Variablen ´herausnehmen, die anzeigen lassen und den Eintrag in der db-Tabelle davon unberührt lassen. Aber was der, der dann eine Änderung macht, über den Button bestätigt, wird dann ja wieder in die db-Tabelle geschrieben, und dann wären die tags doch heraus.
                Ich versuche ein Beispiel zu bringen: Ich habe selber in der Erstfassung der Seite eine Aufzählung mit einem kleinen Kreis als Grafik. Da ist dann der HTML-Code:
                <ul class=kreis><li>blabla</li></ul>
                (Der Rest ist in der css-Datei) usw.
                Also etwas, was ich zu Anfang mache, und dann soll jemand nur noch Text ändern können, etwas ergänzen usw. Das tut er in dem textarea-Feld. Nachdem er was ändert, wird es gespeichert.

                Vielleicht ist ja mein Ansatz insgesamt etwas unlogisch, ich bin kein profi und versuche umzusetzen, was ich mir so gedacht habe. Dabei mache ich sicherlich Fehler, auch im Denkansatz.
                Ich bin trotzdem natürlich happy über das, was klappt, das meiste habe ich ja jetzt fertig.

                Mit den zeilenwechseln ist dank eurer Hilfe jetzt auch okay und gelöst, ich habe den Unterschied kapiert und musste nur die vorher schon gespeicherten Seiten (also die in der Tabelle) noch mal ziemlich ändern, aber jetzt ist es genau so, wie es soll.
                Also, danke nochmal

                Robert

                1. hi,

                  Ich verstehe schon, was du meinst, du sagst, es soll so gemacht werden, dass die Tags nur aus dem Textarea-Feld raus sind; klar kann ich sie aus der Variablen ´herausnehmen, die anzeigen lassen und den Eintrag in der db-Tabelle davon unberührt lassen. Aber was der, der dann eine Änderung macht, über den Button bestätigt, wird dann ja wieder in die db-Tabelle geschrieben, und dann wären die tags doch heraus.

                  Ach so, darum geht's dir.
                  Dann wäre dir vermutlich am ehesten mit dem aus Foren/Boards bekannten System namens BB-Code geholfen, bei dem keine richtigen HTML-Tags verwendet werden, sondern Tags wie [b], [i], [url] etc.
                  Die kannst du problemlos in der Textarea anzeigen und ändern lassen.
                  In HTML umgewandelt werden diese erst bei der Ausgabe; dazu gibt's es einiges an fertigen Klassen.

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
                  1. hi wahsaga,
                    danke für den Tipp, ich werd´s mir mal angucken.

                    Robert

    2. Hallo Arne,
      doch, du hast recht, ich habe gerade deinen Vorschlag aufgenommen und mein PHP dahingehend geändert. Das ist wunderbar bei neuen Einträögen, nur muss ich jetzt wohl die schon bestehenden Seiten anders machen, denn da sind auch schon "normale" Zeilenwechsel drin, die jetzt in <br> gewechselt werden, und dadurch sind die Abstände wieder größer. Mal gucken, wie ich das mache.

      Also, vielen Dank!
      Robert

  2. Hi,

    b) möchte ich gerne fragen, ob jemand weiß, ob ich die HTML-Tags im textarea-feld "unsichtbar" machen kann, ohne sie aber zu verlieren.

    Nicht notwendig. Einfach mit  deiner serverseitigen Sprache in die Textarea einfügen und gut ist. Nur wenn im Text selbst </textarea> vorkommt, wird's kniffliger. ;-)

    Sofern JS aktiv ist, kann man aber auch hier auf "Klimmzüge" verzichten. Einfach den Text in einen JS-Variable packen und dann den value der Textarea mittels JS befüllen.

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!