W pierwszej części poradnika http://piotrooo.com/2010/01/kalendarz-google-w-jquery-cz-1/ pokazałem jak generować kalendarz, jak dodawać nowe zdarzenia i wyświetlać je w kalendarzu czas na pozostałą obsługę zdarzeń mianowicie zmiana rozmiaru zdarzenia (czyli zmiana czasu), edycja i usuwanie. Zapraszam do lektury.
1. Zmiana godzin zlecenia – czyli rozszerzamy i przenosimy zdarzenia
To zmian rozmiarów (czasów, aczkolwiek dla uproszczenia będę używał słów zmian rozmiarów) zdarzenia odpowiedzialna jest metoda eventResize. A do zmiany całych dni za pomocą Drag ‘n Drop odpowiedzialna jest funkcja eventDrop. Oczywiście do zmiany będą nam potrzebne dane które przechwycimy w pliku kalnedarz_do.php. Obsłużenie tych metod po strobie jQuery wygląda następująco:
| 01 | eventDrop : function(calEvent, $event) { |
| 02 | $.ajax({ |
| 03 | type : "GET", |
| 04 | url: "kalendarz_do.php?co=resize&id="+calEvent.id+"", |
| 05 | data: ({start: new Date(calEvent.start)/1000, end: new Date(calEvent.end)/1000}) |
| 06 | }); |
| 07 | }, |
| 08 | eventResize : function(calEvent, $event) { |
| 09 | $.ajax({ |
| 10 | type : "GET", |
| 11 | url: "kalendarz_do.php?co=resize&id="+calEvent.id+"", |
| 12 | data: ({start: new Date(calEvent.start)/1000, end: new Date(calEvent.end)/1000}) |
| 13 | }); |
I teraz obsługa tych zdarzeń po stronie serwera aby w naszej bazie coś się zmieniło. Jak pewnie zauważyliście przekazuje również ID tego zdarzenia aby można było jednoznacznie określić co ma być edytowane, plik kalendarz_do.php:
| 1 | if ($_GET['co']=='resize') |
| 2 | { |
| 3 | $baza->quick_sel("UPDATE kalendarz SET start=('1970-01-01 00:00'::timestamp + interval '{$_GET['start']}')::timestamp at time zone 'GMT', |
| 4 | koniec=('1970-01-01 00:00'::timestamp + interval '{$_GET['end']}')::timestamp at time zone 'GMT' |
| 5 | WHERE id={$_GET['id']}"); |
| 6 | } |
I teraz po zmianie rozmiaru (czasu), przeciągnięciu i upuszczeniu na inny dzień możemy zaobserwować zmiany.
2. Edytowanie i usuwanie zdarzeń
Umiemy już dodać, wyświetlić, zmienić dane to teraz czas na edycję i usuwanie. Można powiedzieć że jest to najbardziej skomplikowana część naszego kalendarza. Aby zrealizować tą funkcjonalność należy obsłużyć metodę eventClick. Obsługa tej metody wygląda następująco:
| 01 | eventClick : function(calEvent, $event) { |
| 02 | if (calEvent.readOnly) { |
| 03 | return; |
| 04 | } |
| 05 | |
| 06 | var $dialogContent = $("#event_edit_container"); |
| 07 | resetForm($dialogContent); |
| 08 | var startField = $dialogContent.find("select[name='start']").val(calEvent.start); |
| 09 | var endField = $dialogContent.find("select[name='end']").val(calEvent.end); |
| 10 | var titleField = $dialogContent.find("input[name='title']").val(calEvent.title); |
| 11 | var bodyField = $dialogContent.find("textarea[name='body']"); |
| 12 | bodyField.val(calEvent.body); |
| 13 | |
| 14 | $dialogContent.dialog({ |
| 15 | modal: true, |
| 16 | height: 260, |
| 17 | width: 400, |
| 18 | title: "Edytuj zlecenie - " + calEvent.title, |
| 19 | close: function() { |
| 20 | $dialogContent.dialog("destroy"); |
| 21 | $dialogContent.hide(); |
| 22 | $('#calendar').weekCalendar("removeUnsavedEvents"); |
| 23 | }, |
| 24 | buttons: { |
| 25 | Zamknij : function() { |
| 26 | $dialogContent.dialog("close"); |
| 27 | }, |
| 28 | Usuń : function() { |
| 29 | $calendar.weekCalendar("removeEvent", calEvent.id); |
| 30 | $.ajax({ |
| 31 | type : "GET", |
| 32 | url: "kalendarz_do.php?co=del&id="+calEvent.id+"" |
| 33 | }); |
| 34 | $dialogContent.dialog("close"); |
| 35 | }, |
| 36 | Zapisz : function() { |
| 37 | calEvent.start = new Date(startField.val()); |
| 38 | calEvent.end = new Date(endField.val()); |
| 39 | calEvent.title = titleField.val(); |
| 40 | calEvent.body = bodyField.val(); |
| 41 | |
| 42 | $calendar.weekCalendar("updateEvent", calEvent); |
| 43 | var $this=$(this); |
| 44 | $.ajax({ |
| 45 | type : "GET", |
| 46 | url: "kalendarz_do.php?co=edit&id="+ calEvent.id +"", |
| 47 | data: ({start: new Date(startField.val())/1000, end: new Date(endField.val())/1000, title: titleField.val(), body: bodyField.val()}) |
| 48 | }); |
| 49 | $dialogContent.dialog("close"); |
| 50 | } |
| 51 | } |
| 52 | }).show(); |
| 53 | |
| 54 | var startField = $dialogContent.find("select[name='start']").val(calEvent.start); |
| 55 | var endField = $dialogContent.find("select[name='end']").val(calEvent.end); |
| 56 | $dialogContent.find(".date_holder").text($calendar.weekCalendar("formatDate", calEvent.start)); |
| 57 | setupStartAndEndTimeFields(startField, endField, calEvent, $calendar.weekCalendar("getTimeslotTimes", calEvent.start)); |
| 58 | $(window).resize().resize(); |
| 59 | } |
Najważniejszymi elementami tej metody jest stworzenie okienka dialogowego w którym umieścimy dwie select listy z możliwością wyboru godzin i zaznaczoną godziną zdarzenia i polami tekstowymi z danymi. Po raz kolejny widzimy wywołanie funkcji setupStartAndEndTimeFields, wyglądającą:
| 01 | function setupStartAndEndTimeFields($startTimeField, $endTimeField, calEvent, timeslotTimes) { |
| 02 | |
| 03 | for (var i = 0; i < timeslotTimes.length; i++) { |
| 04 | var startTime = timeslotTimes[i].start; |
| 05 | var endTime = timeslotTimes[i].end; |
| 06 | var startSelected = ""; |
| 07 | if (startTime.getTime() === calEvent.start.getTime()) { |
| 08 | startSelected = "selected=\"selected\""; |
| 09 | } |
| 10 | var endSelected = ""; |
| 11 | if (endTime.getTime() === calEvent.end.getTime()) { |
| 12 | endSelected = "selected=\"selected\""; |
| 13 | } |
| 14 | $startTimeField.append("<option value=\"" + startTime + "\" " + startSelected + ">" + timeslotTimes[i].startFormatted + "</option>"); |
| 15 | $endTimeField.append("<option value=\"" + endTime + "\" " + endSelected + ">" + timeslotTimes[i].endFormatted + "</option>"); |
| 16 | |
| 17 | } |
| 18 | $endTimeOptions = $endTimeField.find("option"); |
| 19 | $startTimeField.trigger("change"); |
| 20 | } |
| 21 | |
| 22 | var $endTimeField = $("select[name='end']"); |
| 23 | var $endTimeOptions = $endTimeField.find("option"); |
To ona odpowiada za poprawne wyświetlenie czasów zdarzeń. Przyjrzyjmy się teraz przyciskom Usuń i Zapisz.
Przycisk Usuń
Usuń : function() { |
$calendar.weekCalendar("removeEvent", calEvent.id); |
$.ajax({ |
type : "GET", |
url: "kalendarz_do.php?co=del&id="+calEvent.id+"" |
}); |
$dialogContent.dialog("close"); |
} |
Ten przycisk przekazuje nam do pliku kalendarz_do.php akcje jaka ma być wykonana na tym zdarzeniu, czyli w tym wypadku del (usunięcie) i ID rekordu (zdarzenia) które ma być usunięte. I teraz kod który wykonany zostanie po stronie serwera, czyli samo usunięcie z bazy:
if ($_GET['co']=='del') |
{ |
"DELETE FROM kalnedarz WHERE id={$_GET['id']}" |
} |
Przycisk Zapisz
Zapisz : function() { |
calEvent.start = new Date(startField.val()); |
calEvent.end = new Date(endField.val()); |
calEvent.title = titleField.val(); |
calEvent.body = bodyField.val(); |
|
$calendar.weekCalendar("updateEvent", calEvent); |
var $this=$(this); |
$.ajax({ |
type : "GET", |
url: "kalendarz_do.php?co=edit&id="+ calEvent.id +"", |
data: ({start: new Date(startField.val())/1000, end: new Date(endField.val())/1000, title: titleField.val(), body: bodyField.val()}) |
}); |
$dialogContent.dialog("close"); |
} |
Po naćiśnięciu tego przycisku do pliku kalendarz_do.php przekazane zostają dwie zmienne jaka akcja ma być wykonywana – edit (edycja) i ID rekordu do zmiany. Teraz czas na obsługę tego zdarzenia po stronie serwera.
if ($_GET['action']=='edit') |
{ |
"UPDATE kalendarz SET start=('1970-01-01 00:00'::timestamp + interval '{$_GET['start']}')::timestamp at time zone 'GMT', |
koniec=('1970-01-01 00:00'::timestamp + interval '{$_GET['end']}')::timestamp at time zone 'GMT', |
title='{$_GET['title']}', body='{$_GET['body']}' WHERE id={$_GET['id']}"); |
} |
4. Epilog
Teraz już mamy w pełni obsłużone dodawanie, edycję, usuwanie i pokazywanie zdarzeń za pomocą kalendarza jQuery i dynamicznych danych pobieranych z bazy SQL.
9 lutego 2010 at 01:48
Tutorial bardzo fajny, jestem jednak nieco zawiedzony brakiem demonstracji efektu końcowego
Pozdrawiam.
9 lutego 2010 at 09:05
będzie pokazówka jak tylko uporam się z nawałem zajęć i postawię bazę + crona.
9 lutego 2010 at 19:18
Witam
Bardzo fajny artykuł, właśnie zastanawiałem się jak takie coś zrobić, bo na razie mam widok jednego dnia a obok kalendarz na cały miesiąc.
Czy można było umieścić gotowe pliki do pobrania bo próbuje te kawałki poskładać ale coś mi nie wychodzi.
Pozdrawiam
LaToZ
11 lutego 2010 at 20:40
Świetny tekst, więcej takich
Mam jednak małe pytanko, czy da się ten skrypt przerobić tak, żeby można było dodawać zdarzenia trwające dłużej niż jeden dzień ?
Pozdrawiam
11 lutego 2010 at 21:00
Narazie nic mi nie wiadomo o takiej funkcjonalności ale będę starał się coś wyszukać.