Modul 4.4.x Comments v0.0.1

Gesperrt
emergence
Beiträge: 10603
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Modul 4.4.x Comments v0.0.1

Beitrag von emergence » Sa 29. Mai 2004, 10:16

hab mich mal hingesetzt und was geschrieben wobei ich mir dachte ich brauchs mal. leider hab ich momentan keine verwendung dafür. ist zwar nicht perfekt aber funktioniert ganz gut.

sobald man das erste mal die konfiguration aufruft wird die tabelle con_comments angelegt und ein eintrag in der con_sequence als zähler vorgenommen.

ich hab bewusst keinerlei textformatierungen reingebaut. das soll jedem selbst überlassen bleiben.

im backend hat man die möglichkeit einträge zu löschen.
die kommentare werden der idart des artikels zugeordnet. sie sind client und sprachabhängig.

es fehlt noch die möglichkeit einträge online und offline zu schalten -> dafür wäre das feld status vorgesehen.
ebenso eine konfigurierbare möglichkeit wieviele einträge angezeigt werden sollen und eine blätter funktion etc...

verbesserungsvorschläge willkommen...

Beschreibung:

Code: Alles auswählen

# Comments v0.0.1
# Autor: Martin Horwath
# Date: 24.04.2004
# Requires: Contenido 4.4.4
Input:

Code: Alles auswählen

/**
 * Comments v0.0.1
 *
 * INPUT
 *
 * @autor Martin Horwath <horwath@dayside.net>
 * @copyright dayside.net 2004
 */

 // configuration
 $cfg["tab"]["comments"] = $cfg['sql']['sqlprefix']."_comments"; // for syntax reasons only

 if($db->query("SELECT * FROM ".$cfg["tab"]["comments"]." WHERE idclient =".$client." AND idlang = ".$lang)) {
   // do something table exists
   echo "Works...";
 } else {
   echo "error-> table: ".$cfg["tab"]["comments"]." does not exist<br>";
   // init table creation
   $sql= "CREATE TABLE ".$cfg["tab"]["comments"]." (
          idcomments INT(10) NOT NULL default '0',
          idclient INT(10) NOT NULL default '0',
          idlang INT(10) NOT NULL default '0',
          idart INT(10) NOT NULL default '0',
          text text NOT NULL default '',
          name varchar(64) NOT NULL,
          email varchar(64) NOT NULL default '',
          status INT(10) NOT NULL default '0',
          created datetime NOT NULL default '0000-00-00 00:00:00',
          PRIMARY KEY (idcomments) )";

   if ($db->query($sql)) {
     // table successfully created
     echo "init-> created table: ".$cfg["tab"]["comments"]."<br>";
   } else {
     echo "error-> table: ".$cfg["tab"]["comments"]."<br>";
   }

   $sql= "INSERT INTO ".$cfg["tab"]["sequence"]." (seq_name,nextid) VALUES ('".$cfg["tab"]["comments"]."','0')";

   if ($db->query($sql)) {
     // value successfully insert
     echo "init-> value insert into ".$cfg["tab"]["sequence"]." - ".$cfg["tab"]["comments"]."<br>";
   } else {
     echo "error-> value: ".$cfg["tab"]["sequence"]." - ".$cfg["tab"]["comments"]."<br>";
   }
 }
Output:

Code: Alles auswählen

<?
/**
 * Comments v0.0.1
 *
 * OUTPUT
 *
 * @autor Martin Horwath <horwath@dayside.net>
 * @copyright dayside.net 2004
 */

 // configuration
 $cfg["tab"]["comments"] = $cfg['sql']['sqlprefix']."_comments"; // for syntax reasons only

 $clink = "front_content.php?&idcat=$idcat&idart=$idart&lang=$lang&client=$client";


 if ($cmode == "delete" && $edit) {

     $sql = "DELETE FROM ".$cfg["tab"]["comments"]." WHERE idcomments = $commentid";

     if ($db->query($sql)) {
       echo "Deleted<br>";
     } else {
       echo "Delete failed<br>";
     }

     unset($cmode);

 }

 if (trim($commentname) == "" && trim($commentemail) == "" && trim($commenttext) == "" && $cmode == "add" ) unset($cmode); // do nothing

 if ($cmode == "add") {
   // check if all entries are correct otherwise show form
   if (trim($commentname) == "") {
     echo "Bitte einen Namen eingeben.<br>";
     $cmode = "form";
   }

   if (trim($commentemail) != "") {
     if (!preg_match("/^[\w-]+((\.|\+)[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/i",$commentemail)) {
       echo "Bitte geben Sie eine korrekte Email Adresse an.<br>";
       $cmode = "form";
     }
   }

   if (trim($commenttext) == "") {
     echo "Sie haben kein Kommentar geschrieben.<br>";
     $cmode = "form";
   }

   if ($cmode == "add") {

     $sql = "INSERT INTO ".$cfg["tab"]["comments"]." (idcomments,idclient,idlang,idart,text,name,email,status,created) VALUES ('".$db->nextid($cfg["tab"]["comments"])."','".$client."','".$lang."','".$idart."','".$commenttext."','".$commentname."','".$commentemail."','1','".date("Y-m-d H:i:s")."')";

     if ($db->query($sql)) {
       echo "Created<br>";
     } else {
       echo "Creation failed<br>";
     }

     unset($cmode); // show all comments
   }
 }

 if (!$cmode) { // show comments

   if($db->query("SELECT * FROM ".$cfg["tab"]["comments"]." WHERE idclient =".$client." AND idlang = ".$lang." AND idart = ".$idart."")) {

     $clinkform = $clink."&cmode=form";
     if ($edit) {
       $clinkform = $sess->url($clinkform);
     }
     echo '<a href="'.$clinkform.'">Kommentar hinzufügen</a><br>';

     while ($db->next_record()) {

       if ($db->f("email") != "") {
         $comment['header'] = '<a href="mailto:'.$db->f("email").'">%s</a>';
       } else {
         $comment['header'] = '%s';
       }
       $comment['header'] = sprintf($comment['header'],$db->f("name"));

       $comment['header'] .= " schrieb am ".$db->f("created");
       $comment['text'] = $db->f("text");

       echo "<p><b>".$comment['header']."</b><br>\n".$comment['text']."</p>\n";

       if ($edit) {
         $clinkdelete = $sess->url($clink."&cmode=delete&commentid=".$db->f("idcomments"));
         echo '<br><a href="'.$clinkdelete.'">Delete</a>';
       }

       echo "<hr size=\"1\">\n";

     }

   } else {
     echo "<!-- comments init failed - table does not exist //-->";
   }
 } else { // show form

   if ($cmode == "form") {
     echo ("<form name=\"comments\" method=\"post\" action=\"$clink\">");
     echo ("<table cellpadding=\"0\" cellspacing=\"0\">");
     echo ("<tr>");
     echo ("<td width=\"120\"><p>Name:</p></td>");
     echo ("<td><input type=\"text\" name=\"commentname\" size=\"30\" value=\"$commentname\"></td>");
     echo ("</tr>");
     echo ("<tr>");
     echo ("<td><p>Email:</p></td>");
     echo ("<td><input type=\"text\" name=\"commentemail\" size=\"30\" value=\"$commentemail\"></td>");
     echo ("</tr>");
     echo ("</table>");
     echo ("<input type=text size=\"60\" name=\"commenttext\" value=\"$commenttext\">");
     echo ("<input type=\"hidden\" name=\"cmode\" value=\"add\">");
     echo ("<input type=\"submit\" name=\"submit\" value=\"Absenden\">");
     echo ("</form>");
   }
 }

?>
Zuletzt geändert von emergence am Do 24. Jun 2004, 08:57, insgesamt 1-mal geändert.
*** make your own tools (wishlist :: thx)

acquire
Beiträge: 194
Registriert: So 13. Jun 2004, 13:24
Kontaktdaten:

Beitrag von acquire » Sa 19. Jun 2004, 16:17

Hallo!

Schön das du ein Kommentar Modul geschrieben hast!
Leider bekomme ich nichts angezeigt.
error-> table: con_comments does not exist
init-> created table: con_comments
init-> value insert into con_sequence - con_comments
Aber ich kann es auch nicht "per Hand" machen mit dem Code:
CREATE TABLE ".$cfg["tab "]["comments "]."(
idcomments INT( 10 ) NOT NULL default '0',
idclient INT( 10 ) NOT NULL default '0',
idlang INT( 10 ) NOT NULL default '0',
idart INT( 10 ) NOT NULL default '0',
text text NOT NULL default '',
name varchar( 64 ) NOT NULL ,
email varchar( 64 ) NOT NULL default '',
STATUS INT( 10 ) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY ( idcomments )
)
Dann erhalte ich folgende Fehlermeldung:
MySQL meldet:

You have an error in your SQL syntax near '".$cfg["tab "]["comments "]."( idcomments INT( 10 ) NOT NULL default '0',
id' at line 1
Leider kenne ich mich mit MySQL Datenbanken nicht aus, daher kann ich die Meldung nicht interpretieren.
kannst du, oder jemand anderes die passenden Befehle hier posten?
Danke im Voraus!

Gruß, acquire


EDIT:

Scheint irgendwie doch zu funktionieren, trotz der Fehlermeldung!

emergence
Beiträge: 10603
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 19. Jun 2004, 17:50

beim erstmaligen aufruf der konfiguration wird überprüft ob die tabelle con_comments existiert falls nicht wird sie angelegt. steht ja da...

error-> table: con_comments does not exist
init-> created table: con_comments
init-> value insert into con_sequence - con_comments

ein neuerlicher versuch die tabelle dann via phpmyadmin anzulegen bringt an sich ne andere fehlermeldung (da sie ja bereits existiert)

deine fehlermeldung ist klar
in php wird anstelle von ".$cfg["tab "]["comments "]." con_comments verwendet oder je nachdem was du als db prefix definiert hast.
*** make your own tools (wishlist :: thx)

acquire
Beiträge: 194
Registriert: So 13. Jun 2004, 13:24
Kontaktdaten:

Beitrag von acquire » Sa 19. Jun 2004, 18:13

Danke.

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Mi 23. Jun 2004, 19:47

Ich habe eine HP fuer meinen Mann gemacht, und da habe ich heute etwas eingebaut, wo ich mir dachte, dass dieses Kommentarmodul ganz nuetzlich waere (ob's tatsaechlich ist, sprich, ob's auch benutzt wird, wird sich noch herausstellen :wink:).

Ein paar Kleinigkeiten:
1. Vor dem "schrieb am" soll ein Leerzeichen eingefuegt werden, sonst steht nachher "Halchteranerinschrieb am" (bei mir habe ich das natuerlich schon geaendert)
2. Das Eingabefeld habe ich in textarea geaendert, damit man ein bisschen mehr vom eingegebenen Kommentar sehen kann. Geaenderter Code hierfuer '(ich habe insgesamt die Tabelle etwas geaendert):

Code: Alles auswählen

   if ($cmode == "form") { 
     echo ("<form name=\"comments\" method=\"post\" action=\"$clink\">"); 
     echo ("<table cellpadding=\"0\" cellspacing=\"0\">"); 
     echo ("<tr>"); 
     echo ("<td width=\"120\"><p>Name:</p></td>"); 
     echo ("<td><input type=\"text\" name=\"commentname\" size=\"30\" value=\"$commentname\"></td>"); 
     echo ("</tr>"); 
     echo ("<tr>"); 
     echo ("<td><p>Email:</p></td>"); 
     echo ("<td><input type=\"text\" name=\"commentemail\" size=\"30\" value=\"$commentemail\"></td>"); 
     echo ("</tr>");
     echo ("<tr>"); 
     echo ("<td><p>Kommentar:</p></td>"); 
     echo ("<td><textarea cols=\"30\" rows=\"5\" name=\"commenttext\" value=\"$commenttext\"></textarea></td>"); 
     echo ("</tr>");
     echo ("</table>"); 
     echo ("<input type=\"hidden\" name=\"cmode\" value=\"add\">"); 
     echo ("<input type=\"submit\" name=\"submit\" value=\"Absenden\">");
     echo ("</form>"); 
   } 
3. Uebers Datumsformat haben wir schon an anderer Stelle 'gesprochen': das Datumsformat 'gefaellt mir nicht', Jahr-Monat-Tag sieht bei deutschsprachigen Seiten etwas doof aus. Man kann es bestimmt umformatieren, aber mir ist es leider nicht gelungen. Ich hab's hiermit probiert:

Code: Alles auswählen

       $comment['header'] .= " schrieb am ".date("Y-m-d G:i:s",$db->f("created")); 
aber es ging in die Hose, alle Eintraege tragen ploetzlich das Datum '1970-01-01' bzw. 01-01-1970, nachdem ich das Format in d-m-Y geaendert habe. In der DB steht aber der richtige Eintrag. Liegt's evtl. daran, dass ich das $db->f("created") nicht einfach so als Parameter uebergeben kann?

Was ich gut finde, ist, dass die geloeschten Kommentare auch tatsaechlich in der DB geloescht werden. Dass man Beitraege nicht on- und offline schalten kann, finde ich nicht tragisch, zumindest sehe ich fuer meine Seite nicht die Notwendigkeit. Mir geht's nur darum, Beitraege loeschen zu koennen, falls jemand 'Schweinereien' schreiben sollte. Blaetterfunktion und Moeglichkeit, die Anzahl der anzuzeigenden Eintraege waeren zwar nett, ich kann mir aber zur Zeit nicht vorstellen, wie das funktionieren soll: wohin blaettert man? Zu einer Seite, die nur Kommentare aber den eigentlichen Artikel nicht mehr beinhaltet? Vielleicht stehe ich aber auch gerade aufm Schlauch. :oops:

Emceechen
Beiträge: 129
Registriert: Mi 26. Mai 2004, 11:18
Kontaktdaten:

Beitrag von Emceechen » Do 24. Jun 2004, 08:53

Ich hoffe das hilft dir:

<?
$timestamp = time();
?>

Mit diesem kurzen Befehl time() wird die aktuelle UNIX-Timestamp ermittelt und - zur weiteren Verarbeitung - in der Variable timestamp gespeichert.

Um die Zeit jetzt angenehm zu formatieren gibt es die Funktion date (format, timestamp).

Für die Formatierung stehen hierbei sehr viel Möglichkeiten zur Verfügung (nur Auszug, vollständige Liste findet sich unter www.php.net):
Format Beschreibung Beispiel
========================================================
d Tag des Monats, zweistellig 03, 28
j Tag des Monats 7, 13
m Nummer des Monats, zweistellig 01, 11
n Nummer des Monats 2, 10
y Jahr zweistellig 99, 00
Y Jahr vierstellig 1999, 2001
H Stunde im 24-Stunden-Format, zweist. 08, 16
G Stunde im 24-Stunden-Format 7, 18
i Minuten, zweistellig 08, 45
s Sekunden, zweistellig 06, 56
w Wochentag in Zahlenwert 2, 6

PHP hat zwar auch Formate zur Anzeige von Monatsnamen und Wochentagsnamen, jedoch sind diese auf Englisch.

Um ein Datum inkl. Uhrzeit im Stil von 24.06.2004 - 09:48 Uhr auszugeben gibt es zB folgende Schreibweise:
<?
$datum = date("d.m.Y",$timestamp);
$uhrzeit = date("H:i",$timestamp);
echo $datum," - ",$uhrzeit," Uhr";
?>

Ich hoffe du kannst das so irgendwie zusammbasteln, viel Erfolg,

Michael

emergence
Beiträge: 10603
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 24. Jun 2004, 08:55

Halchteranerin hat geschrieben:Blaetterfunktion und Moeglichkeit, die Anzahl der anzuzeigenden Eintraege waeren zwar nett, ich kann mir aber zur Zeit nicht vorstellen, wie das funktionieren soll: wohin blaettert man? Zu einer Seite, die nur Kommentare aber den eigentlichen Artikel nicht mehr beinhaltet? Vielleicht stehe ich aber auch gerade aufm Schlauch. :oops:
das läuft alles auf der selben seite ab, wenn es mal eingebaut wird...
wohin man blättert -> zu den älternen einträgen wenn zb nur 10 kommentare angezeigt werden.

ad. datumsformat
siehe -> http://at2.php.net/manual/en/function.date.php
das datum wird bereits formatiert in die db geschrieben, eine nochmalige formatierung mit date bei der ausgabe wird somit nicht funktionieren.
d.h. das datum müsste via mkdate in die db geschrieben werden und bei der ausgabe könnte man dann mittels date die gewünschte formatierung vornehmen. -> wäre die sauberste lösung.

ad. schrieb am
bessere ich oben noch aus...
*** make your own tools (wishlist :: thx)

Emceechen
Beiträge: 129
Registriert: Mi 26. Mai 2004, 11:18
Kontaktdaten:

Beitrag von Emceechen » Do 24. Jun 2004, 08:56

Vielen Dank übrigens an Claudia Schaffarik für ihr PHP Manual (Funktion Timestamp daraus entnommen).
Schöne Grüße an dieser Stelle, hat mir sehr geholfen.

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Do 24. Jun 2004, 09:02

Hallo Michael,

danke, aber das trifft's nicht ganz, denn da muesste ich ja das ganze Modul umschreiben. :cry:

Gruss
Christa

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Do 24. Jun 2004, 09:06

emergence hat geschrieben: das läuft alles auf der selben seite ab, wenn es mal eingebaut wird...
wohin man blättert -> zu den älternen einträgen wenn zb nur 10 kommentare angezeigt werden.
Ach so, das hoert sich ganz gut an! Wenn's denn eingebaut wird. :wink:
emergence hat geschrieben: ad. datumsformat
siehe -> http://at2.php.net/manual/en/function.date.php
das datum wird bereits formatiert in die db geschrieben, eine nochmalige formatierung mit date bei der ausgabe wird somit nicht funktionieren.
bei php.net war ich schon, es war mir nur nicht klar, dass man das beim Ausgeben nicht nochmal formatieren kann. :cry:

Eine andere Idee ist mir noch gekommen: das Datum aus der DB rausholen, zerstueckeln (Tag, Monat, Jahr) und wieder zusammensetzen. Ich versuch's mal ...

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Do 24. Jun 2004, 09:39

emergence hat geschrieben:aua, gehts noch komplizierter ?
Ich hab' doch so gut wie keine PHP-Erfahrung. :oops: Aber damit hat es wenigstens schon mal geklappt. Es waren auch nur 7 kurze Zeilen, die man sicherlich noch mehr haette zusammenfassen koennen. :)
emergence hat geschrieben:[...]
ersetzen durch
[...]
geht das 'on the fly' oder muesste die Tabelle con_comments neu angelegt werden? Datentyp datetime ist ok, also muesste das auch on the fly gehen, oder?

Meine Loesung ist aber, wenn auch umstaendlicher, nicht mal sooo schlecht, denn ich kann schreiben "XYZ schrieb am XX.YY.ZZ um XX:YY:ZZ Uhr:". Nicht schoen aber selten. :wink:

emergence
Beiträge: 10603
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 24. Jun 2004, 09:43

ach ja stimmt, tabelle müsste dann ebenfalls neu angelegt werden...
feld created müsste ebenso umdefiniert werden... sind zu viele änderungen obriges teil hab ich entfernt... sonst probiert es noch einer aus..

ähm anders nur diese änderung

Code: Alles auswählen

$comment['header'] .= " schrieb am ".date("d.m.Y G:i:s",strtotime($db->f("created")));
ergibt dann

xyz schrieb am tag.monat.jahr stunden:minuten:sekunden...
*** make your own tools (wishlist :: thx)

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Do 24. Jun 2004, 11:15

emergence hat geschrieben:obriges teil hab ich entfernt... sonst probiert es noch einer aus..
gute Idee, Vorbeugen ist besser als Heilen. ;-)
Aber stimmt, on the fly waere nicht gegangen, ich habe mir genauer time() bei php.net angeschaut. ('Returns the current time measured in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).')

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Do 24. Jun 2004, 11:40

ein kleiner tipp am rande:

(1) beim schreiben eines eintrages kann man mysql als zeitangabe now() übergeben. dann wird das aktuelle datum geschrieben.

(2) und beim lesen aus der db kann man die formatierung des datumstrings auch gleich mysql vornehmen lassen (funktion: date_format()).

gruss,
andreas

ps: ich würde zeit- und datumsangaben in der datenbank nie als text speichern. neben der tatsache, dass dabei information verloren geht, braucht es in der db zusätzlich noch mehr platz und zahl- sowie hilfreiche datumsfunktionen stehen nicht mehr zur verfügung.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Do 24. Jun 2004, 12:17

kummer hat geschrieben:ps: ich würde zeit- und datumsangaben in der datenbank nie als text speichern.
aehm ... datetime ist aber kein Text, oder :?:

Gesperrt