Konkurrierende Kommentare
am 09.08.2010 - 11:00 Uhr in
Hallo,
ich habe ja schon viele meiner Fragen im Web und auch hier durch Suchen beantworten können, aber jetzt habe ich keine Idee mehr und brauche Eure versammeltes Fachwissen;)
Folgendes Szenario
- 12:00:00 Mitglied A schreibt Kommentar an Node 1234, hat aber noch nicht auf Speichern geklickt;
- 12:00:01 Mitglied B schreibt Kommentar an Node 1234 und klickt auf Speichern;
- 12:01:00 Jetzt ist Mitglied A auch mit schreiben fertig und klickt auch auf speichern.
Mitglied A hat jetzt ein Problem, da er den Kommentar von Mitglied B noch nicht gesehen hat und inhaltlich völlig falsch liegen könnte.
Ich hätte gerne eine Warnfunktion, das während des Schreibens meines Kommentars ein anderer Kommentar gespeichert wurde. Wenn also Mitglied A endlich auf speichern klickt, sollte diese Warnung erscheinen, noch besser Warnung und die zwischenzeitlich erfassten Kommentare dargestellt werden.
Ist Euch eventuell. bereits ein fertiges Modul bekannt oder habt Ihr eine Idee für einen Lösungsansatz? Ich kennen eine solche Funktion z.Bsp. aus phpBB3 aber in Drupal ist mir solches noch nicht untergekommen.
Hintergrund: Ich betreibe ein Forum (www.sgaf.de) in dem die Antworten teilweise sehr schnell geschrieben werden :)
- Anmelden oder Registrieren um Kommentare zu schreiben
Hooks
am 09.08.2010 - 11:48 Uhr
Hallo.
Ein fertiges Modul für diesen Anwendungsfall ist mir nicht bekannt (das heisst jedoch nicht, dass es kein solches Modul gibt :) ).
Allerdings könnte man sich mit einem eigenen Modul und einem modifizierten submit-Handler für das [api:comment_form] behelfen.
Man müsste also den Standard-Submithandler durch einen Eigenen ersetzen und in diesem dann schauen, ob es schon neue Kommentare gibt.
Wenn ja, muss der Speichervorgang abgebrochen und eine entsprechende Meldung angezeigt werden.
Wenn nein, wird einfach der übliche Submithandler aufgerufen.
So könnte das funktionieren.
hth,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Die Lösung
am 17.08.2010 - 08:51 Uhr
Auch dieses Problem habe ich gelöst bekommen und will Euch die Lösung nicht vorenthalten:
<?php
/**
* Implementation of hook_help
*/
function comment_warn_help($path, $arg) {
switch ($path) {
case 'admin/help#sgafNotify':
$output = '<p>'. t('Comment_warn warnt vor konkurrierenden Kommentaren') .'</p>';
$output .= '<p>'. t('...') .'</p>';
return $output;
}
}
function comment_warn_form_alter(&$form, $form_state) {
global $user;
// Gilt nur für angemeldete
if ($user->uid) {
if ($form['#id'] == 'comment-form') {
// Ansonsten wird die Variable auch beim Senden geschrieben
if (!$form_state['post']['form_build_id']) {
$nid = $form['nid']['#value'] ? $form['nid']['#value'] : $form['nid']['#default_value'];
// variablennamen zusammenstellen
// Jetzt den Zeitpunkt der Formerstellung in Variable speichern
$variable = 'comment_warn_time_'.$nid;
$_SESSION[$variable] = time();
}
}
}
return $form;
}
function comment_warn_comment(&$a1, $op) {
global $user;
switch ($op) {
case 'validate':
// Gilt nur für angemeldete
if ($user->uid) {
// variablennamen zusammenstellen, wir brauch diesen mehrfach
$variable = 'comment_warn_time_'.$a1['nid'];
// Der Zeitpunkt, an dem User die Form aufgemacht hat
$last_comment = $_SESSION[$variable];
$nid = $a1['nid'];
$count = 0;
$message = '';
if ($last_comment) {
// Ermittel der in der Zwischenzeit geschrieben Nachrichten und Zusammenbauen der Nachricht
$result = db_query('select * from comments where status = 0 and nid = %d and uid <> %d and timestamp > %d order by timestamp asc', $nid, $user->uid, $last_comment);
while ($row = db_fetch_object($result)) {
$count = $count + 1;
$message .= '<hr /><b>'.format_date($row->timestamp).' - '.theme('username', $row).' ';
$message .= $row->subject.'</b><br />';
$message .= check_markup($row->comment, $row->format, TRUE).'<br />';
}
}
if ($count) {
// Wenn es in der Zwischnezeit geschrieben Kommentare gibt
if ($count == 1) {
$message = t('<b>Hinweis:</b> Du hast den folgenden Kommentar zum Beitrag noch nicht gesehen, da er in den letzten Sekunden erstellt wurde: ').$message;
} else {
$message = t('<b>Hinweis:</b> Du hast die folgenden '.$count.' Kommentare zum Beitrag noch nicht gesehen, da diese in den letzten Sekunden erstellt wurden: ').$message;
}
// Die Zeit neu setzen, ansonsten kann der Kommentar nicht gespeichert werden
$_SESSION[$variable] = time();
// Als Fehler ausgeben, nicht schoen, aber ich kann leider hier nix anders an $form zurueck geben
form_set_error('','<div class="messages warning">'.$message."</div>");
}
}
break;
}
}
?>
Das war eine schnelle Lösung und wird mit Erfolg genutzt.
Wenn hier einer Lust hat, ein ordentliches Modul daraus zu bauen (meine Englisch ist nicht so gut, deshalb mache ich das lieber nicht selber) stehe ich dem sehr aufgeschlossen gegenüber ;)