Dieser Artikel behandelt das Legacy-Format für wiederkehrende Ereignisse im DHTMLX Scheduler. Informationen zur aktuellen Version ab DHTMLX Scheduler v7.1+ finden Sie hier.
Standardmäßig unterstützt der Scheduler keine wiederkehrenden Ereignisse. Um diese Funktionalität hinzuzufügen, müssen Sie eine spezielle Erweiterung namens recurring_legacy auf Ihrer Seite aktivieren.
scheduler.plugins({
recurring_legacy: true
});
Sobald die Unterstützung für wiederkehrende Ereignisse aktiviert ist, enthält die Lightbox einen zusätzlichen Abschnitt wie unten dargestellt:
Die Bibliothek bietet verschiedene Optionen zur Konfiguration wiederkehrender Ereignisse:
scheduler.config.repeat_date = "%m/%d/%Y";
scheduler.config.include_end_by = true;
...
scheduler.init('scheduler_here', new Date(2019, 7, 5), "month");
Related sample: Recurring events
Nach Aktivierung der recurring-Erweiterung erhält die Lightbox einen zusätzlichen Abschnitt namens "Repeat event". Die Standardkonfiguration der 'wiederkehrenden' Lightbox sieht wie folgt aus:
[
{name:"description", height:130, map_to:"text", type:"textarea" , focus:true},
{name:"recurring", height:115, type:"recurring", map_to:"rec_type",
button:"recurring"},
{name:"time", height:72, type:"time", map_to:"auto"}
];
Sie können bei Bedarf weitere Abschnitte hinzufügen, aber die Abschnitte "recurring" und "time" müssen erhalten bleiben. Außerdem sollte der Abschnitt "time" immer nach dem Abschnitt "recurring" stehen.
Related sample: Recurring events
Ein wiederkehrendes Ereignis wird in der Datenbank als einzelner Datensatz gespeichert, der alle üblichen Ereignisfelder sowie drei zusätzliche enthält:
Eine typische Connector-Abfrage könnte folgendermaßen aussehen:
$scheduler->render_table("events_rec","event_id",
"start_date,end_date,text,rec_type,event_pid,event_length");
Neben diesen Pflichtfeldern können Sie beliebige weitere Daten aus Ihrer Datenbank abrufen.
Beachten Sie, dass die Bedeutungen von start_date und end_date hier leicht abweichen:
Beispielsweise würde ein wiederkehrendes Ereignis, das am 3. Januar 2019 um 10:00 Uhr beginnt, sich täglich wiederholt und am 13. Januar 2019 um 12:00 Uhr endet, wie folgt gespeichert werden:
id:1,
start_date:"2019-01-03 10:00:00",
end_date:"2019-01-13 00:00:00",
text:"some_text",
details:"",
rec_type:"day_1___",
event_length:"7200",
event_pid:"0" // 0 für Hauptereignisse oder die Eltern-ID für Unterereignisse
Auf der Client-Seite enthält das Feld rec_type einen String im folgenden Format:
[type]_[count]_[day]_[count2]_[days]#[extra]
wobei:
Einige Beispiele für rec_type-Werte:
Hinweis: Doppelte oder dreifache Unterstriche bedeuten, dass diese Parameter ausgelassen werden.
Wiederkehrende Ereignisse werden als einzelne Datensätze in der Datenbank gespeichert, die vom Scheduler clientseitig aufgeteilt werden können. Wenn Sie einzelne Vorkommensdaten auf der Serverseite benötigen, stehen Hilfsbibliotheken für das Parsen wiederkehrender Ereignisse in ASP.NET/ASP.NET Core und PHP zur Verfügung.
Diese Bibliotheken finden Sie auf GitHub:
Es ist möglich, einzelne Vorkommen innerhalb einer wiederkehrenden Serie zu bearbeiten oder zu löschen.
Stellen Sie sich vor, Sie sind ein Fan der Olympischen Spiele und möchten die Olympischen Spiele in London 2012 (27. Juli – 12. August) so oft wie möglich verfolgen. Sie erstellen ein wiederkehrendes Ereignis, das um 17:00 Uhr beginnt (Ende Ihres Arbeitstags) und um 23:00 Uhr endet (Ihre Schlafenszeit). Da die Eröffnungsfeier jedoch um 19:00 Uhr beginnt, möchten Sie das erste Vorkommen auf 19:00–23:00 Uhr ändern. Außerdem wissen Sie, dass Sie am 1. August 2012 eine Deadline haben und wahrscheinlich nichts anschauen werden, weshalb Sie das Vorkommen dieses Tages aus der Serie löschen möchten.
Dies führt zu 3 Datensätzen, die mit dem wiederkehrenden Ereignis in der Datenbank verbunden sind.
Erstellung des wiederkehrenden Ereignisses:
Bearbeiten von 27. Juli 2012:
Löschen von 1. August 2012:
Zusätzlich zu den extra Feldern muss der Server-Controller einige spezielle Logik abdecken:
Vollständige Codebeispiele finden Sie hier
Wenn Sie den PHP Connector verwenden, könnte der serverseitige Code wie folgt aussehen:
function delete_related($action){
global $scheduler;
$status = $action->get_status();
$type = $action->get_value("rec_type");
$pid = $action->get_value("event_pid");
// Wenn die Serie geändert oder gelöscht wurde, entferne alle verknüpften Ereignisse
if (($status == "deleted" || $status == "updated") && $type != ""){
$scheduler->sql->query("DELETE FROM events_rec WHERE
event_pid='" . $scheduler->sql->escape($action->get_id()) . "'");
}
if ($status == "deleted" && $pid != 0){
$scheduler->sql->query("UPDATE events_rec SET rec_type='none' WHERE
event_id='" . $scheduler->sql->escape($action->get_id()) . "'");
$action->success();
}
}
function insert_related($action){
$status = $action->get_status();
$type = $action->get_value("rec_type");
if ($status == "inserted" && $type == "none")
$action->set_status("deleted");
}
$scheduler->event->attach("beforeProcessing","delete_related");
$scheduler->event->attach("afterProcessing","insert_related");
Um Nutzern das Verschieben der gesamten Serie wiederkehrender Ereignisse per Drag & Drop zu ermöglichen, fügen Sie vor der Initialisierung des Schedulers folgenden Code hinzu:
scheduler.attachEvent("onBeforeEventChanged", function(dev){
var parts = scheduler.getState().drag_id.toString().split("#");
if (parts.length > 1) {
var series = this.getEvent(parts[0]);
series.start_date.setHours(dev.start_date.getHours());
series.start_date.setMinutes(dev.start_date.getMinutes());
series.event_length = (dev.end_date - dev.start_date) / 1000;
setTimeout(function(){
scheduler.addEvent(series);
}, 1);
return false;
}
return true;
});
Ab Version 4.2 erlaubt dhtmlxScheduler die Anpassung des HTML-Formulars, das im 'recurring'-Block der Lightbox verwendet wird.
Beginnen wir mit einem Beispiel. Angenommen, Sie möchten die Optionen „monatlich“ und „jährlich“ für Wiederholungen entfernen und die Auswahl „kein Enddatum“ für alle Ereignisse verfügbar lassen (das bedeutet, dass der Abschnitt zur Festlegung des Endes der Wiederholung entfernt wird).
<div class="dhx_form_repeat" id="my_recurring_form"> <form>
<div>
<select name="repeat">
<option value="day">Täglich</option>
<option value="week">Wöchentlich</option>
</select>
</div>
<div>
<div style="display:none;" id="dhx_repeat_day">
<input type="hidden" name="day_type" value="d"/>
<input type="hidden" name="day_count" value="1" />
</div>
<div style="display:none;" id="dhx_repeat_week">
Wiederhole jede Woche an folgenden Tagen:<br />
<label><input type="checkbox" name="week_day" value="1" />Montag</label>
<label><input type="checkbox" name="week_day" value="2" />Dienstag</label>
<label><input type="checkbox" name="week_day" value="3" />Mittwoch</label>
<label><input type="checkbox" name="week_day" value="4" />Donnerstag</label>
<label><input type="checkbox" name="week_day" value="5" />Freitag</label>
<label><input type="checkbox" name="week_day" value="6" />Samstag</label>
<label><input type="checkbox" name="week_day" value="0" />Sonntag</label>
<input type="hidden" name="week_count" value="1" />
</div>
</div>
<input type="hidden" value="no" name="end">
</form>
</div>
scheduler.config.lightbox.sections = [
{name:"description", height:130, map_to:"text", type:"textarea" , focus:true},
{name:"recurring", type:"recurring", map_to:"rec_type", button:"recurring",
form:"my_recurring_form"}, {name:"time", height:72, type:"time", map_to:"auto"}
];
Das Standard-HTML-Layout des Wiederholungsblocks der Lightbox in verschiedenen Sprachen finden Sie im Ordner 'scheduler\sources\locale\recurring\'.
Für die englische Sprache sehen Sie sich zum Beispiel die Datei 'scheduler\sources\locale\recurring\repeat_template_en.htm' an.
Im Allgemeinen besteht der Wiederholungsblock in der Lightbox aus 3 Hauptgruppen von Steuerelementen:
1) Steuerelemente zur Auswahl des Wiederholungstyps. Diese Eingaben sollten den Namen 'repeat' und einen der folgenden Werte haben: 'daily', 'weekly', 'monthly', 'yearly'. Ihr Formular muss mindestens ein 'repeat'-Eingabefeld mit einem Wert enthalten. Sie können Radiobuttons, Selects oder sogar ein verstecktes Eingabefeld verwenden, um den Standardtyp festzulegen.
Hier sind einige gültige Beispiele, wie Sie den Wiederholungstyp im Formular auswählen können:
<label><input type="radio" name="repeat" value="day" />Täglich</label><br />
<label><input type="radio" name="repeat" value="week"/>Wöchentlich</label><br />
<label><input type="radio" name="repeat" value="month" />Monatlich</label><br />
<label><input type="radio" name="repeat" value="year" />Jährlich</label>
<select name="repeat">
<option value="day">Täglich</option>
<option value="week">Wöchentlich</option>
</select>
<input type="hidden" name="repeat" value="day" />
2) Ein Abschnitt zur Konfiguration der Wiederholung basierend auf dem Wiederholungstyp. Zum Beispiel sieht das Markup für den Typ 'Täglich' so aus:
<div class="dhx_repeat_center">
<div style="display:none;" id="dhx_repeat_day">
<label>
<input class="dhx_repeat_radio" type="radio"
name="day_type" value="d"/>Jeden
</label>
<input class="dhx_repeat_text" type="text"
name="day_count" value="1" />Tag<br>
<label>
<input class="dhx_repeat_radio" type="radio"
name="day_type" checked value="w"/>Jeden Werktag
</label>
</div>
...
</div>
Beachten Sie, dass Markup, das sich auf einen bestimmten Wiederholungstyp bezieht, in ein div mit einer id im Format "dhx_repeat_<repeat type>" eingeschlossen werden kann, z. B. "dhx_repeat_day". Dadurch wird es nur angezeigt, wenn der entsprechende Wiederholungstyp ausgewählt ist.
3) Steuerelemente zum Festlegen des Endes der Wiederholung. Dies wird durch Eingaben mit dem Namen 'end' definiert.
Mögliche Werte sind 'no', 'date_of_end' und 'occurences_count'.
Wie bei den 'repeat'-Steuerelementen sollte Ihr Formular mindestens eine Eingabe dieses Typs enthalten.
<div class="dhx_repeat_right">
<label>
<input type="radio" name="end" value="no" checked/>Kein Enddatum
</label><br />
<label>
<input type="radio" name="end" value="date_of_end" />Nach</label>
<input type="text" name="date_of_end" />
<br />
<label>
<input type="radio" name="end" value="occurences_count" />Nach</label>
<input type="text" name="occurences_count" value="1" />Vorkommen
</div>
Das Datum für die Option 'date_of_end' sollte in ein Eingabefeld mit dem Namen 'date_of_end' eingetragen werden. Ebenso nimmt die Option 'occurences_count' die Anzahl der Wiederholungen aus einem Eingabefeld mit dem Namen 'occurences_count'.
Sie können jede Option entfernen oder sie standardmäßig per verstecktem Eingabefeld festlegen:
<input type="hidden" name="end" value="date_of_end" />
<input type="hidden" name="date_of_end" value="01.01.2016" />
Bevor Sie den Wiederholungsblock der Lightbox anpassen, beachten Sie bitte folgende Punkte:
Beachten Sie, dass dhtmlxScheduler nicht direkt mit Ihrem Original-HTML-Formular arbeitet, sondern eine Kopie davon im Template der Lightbox erstellt.
Zum Beispiel:
<input onclick="handler()">
addEventListener(node, "click", function(){...})
Nach oben