TimeIt

Guite edited this page Nov 12, 2014 · 5 revisions
Clone this wiki locally

TimeIt

TimeIt ist ein Kalender Modul, welches als Vorbild (das nicht mehr gepflegte) PostCalendar hat.

Features

  • Jahres,Monats,Wochen,Tages und listen Ansicht
  • Benutzung des Category-Modules
    • Multi-Kategorisation ist möglich
  • Workflows
    • Standard
    • Moderate
  • Content plugin
  • iCal Integration

(Export)

  • rss/atom feeds
  • hooks

werden Unterstützt

  • scribite Integration
  • Diverse Blöcke
  • Termine mit:
    • flexiblen Wiederholungen
    • Private und Öffentliche Termine
    • Mehrtägige Termine (Ohne Wiederholungen)
  • ContactList Integration(Keine Termine von Ignorierten Benutzern / Sichtbarkeit: Nur Freunde)
  • Benutzer können sich bei Terminen anmelden

Kommende Features

  • Neu Geschriebene ICal Integration (Import und Export)
  • Unterstützung der ICal RRULE Property (Wiederholungen)
  • Mehrere unabhängige Kalender

Installation

TimeIt wird wie jedes andere Modul installiert. Siehe: Module installieren

Berechtigungen

TimeIt ist im Bereich Berechtigungen sehr Flexibel. Folgend ein paar Beispiele wie man einige Probleme in TimeIt lösen kann. Eine genaue Beschreibung was die Berechtigungen in TimeIt machen gibt es unter Berechtigungen im Detail.

Bestimmten Gruppen Rechte für Bestimmte Termine geben (Mit Kategorien)

Allgemein

Man kann allen Terminen von bestimmten Kategorien Rechte setzen. Basis hierfür ist folgendes Recht:

{| border=1 class="wikitable"
! Recht
|}

Ansicht Verbieten

Sollen zum Beispiel die Gäste keine Termine in der Kategorie "Sport"(Id 1000) sehen, würde das Recht so aussehen:

{| border=1 class="wikitable"
! Kein
|}

Wenn man Kein durch Übersicht ersetzt kann man den Termin in den Ansichten und auch in der Detailseite sehen.

Hinzufügen verbieten (als Blacklist)

Das oben genannte recht greift auch beim erstellen von Terminen. Wenn wir folgendes Recht erstellen:

{| border=1 class="wikitable"
! Übersicht
|}

Dann kann zwar die Gruppe "Gruppe" die Termine in der Kategorie "Sport" sehen, aber kann keine Termine in diese Kategorie hinzufügen (Taucht in der DropDown nicht auf). Ab dem Recht Lesen ist auch das hinzufügen möglich.

Hinzufügen verbieten (als Whitelist)

Soll eine Gruppe Termine nur in bestimmte Kategorien hinzufügen dürfen, könnte man dies so lösen:

{| border=1 class="wikitable"
! Lesen
|}

{| border=1 class="wikitable"
! Übersicht
|}

Im Zweiten Recht wird das Hinzufügen in alle Kategorien verboten und im ersten Recht für bestimmte Kategorien wieder gestattet.

Bestimmten Gruppen Rechte für Bestimmte Termine geben (Mit Gruppenzuordnung)

Beim Erstellen eines Termins kann man angeben zu welcher Gruppe der Termin gehören soll. Falls man nur zu einer Gruppe gehört, passiert dies automatisch. Mit dem folgenden Recht kann man einstellen, welche Gruppe die Termine mit der Gruppe XY was machen können.

{| border=1 class="wikitable"
! Recht
|}

Nehmen wir an, Termin A hat eine Gruppenzuordnung "PrivateGruppe" und Termine B eine Gruppenzuordnung "Users". Wenn wir nun den Gästen die Termine mit der Gruppenzuordnung "PrivateGruppe" das recht den Termin zu sehen weg nehmen wollen, könnte man dies so lösen:

{| border=1 class="wikitable"
! Kein
|}

Die Gäste könnten jetzt den Termin A nicht mehr sehen.

Sollen die Benutzer in der Gruppe PrivateGruppe ihre Termine (= Gruppenzuordnung "PrivateGruppe") editieren können, geht dies so:

{| border=1 class="wikitable"
! Moderieren
|}

Soll auch löschen möglich sein, muss man das Moderieren in Löschen ändern.

Bestimmten Gruppen das Eintragen von Terminen in eine Kategorie verbieten

TODO

Anmeldung an Termine nur Bestimmten Gruppen erlauben

TODO

Features Genauer

Nachfolgend ein paar Features genauer erklärt.

Sichtbarkeit

TimeIt unterstützt folgende Sichtbarkeiten:

Privat

Der Termin ist nur für den Ersteller zu sehen.

Öffentlich

Der Termin ist für alle Benutzer sichtbar und wird standardmässig auch bei anderen eingeloggten Benutzern angezeigt. Wenn ein Benutzerfilter aktiv ist, werden nur Private und Öffentliche Termine des angegebenen Benutzers angezeigt.

Nur für Freunde

Es wird das Modul ContactList benötigt. Bei dieser Sichtbarkeit wird der Termin nur bei eingetragenen Freunden angezeigt.

Global

Der Termin gehört nicht einem speziellen Benutzer sondern gilt für alle und wird auch bei allen angezeigt.

Workflows

TimeIt unterstützt Workflows. Welcher Workflow man benutzen will, kann in den Einstellungen eingestellt werden. Falls man während dem Betrieb den Workflow umstellt, benutzen die vorhandenen Termine den alten und die neuen Termine den neuen Workflow.

Standard

Der Standard Workflow. Ein Termin ist nach dem Einreichen direkt Online.

Moderiert

Nach dem einreichen eines Termins muss dieser zuerst von einem Moderator freigeschaltet werden.

Blöcke

Mit TimeIt werden drei Blöcke ausgeliefert. Zwei von ihnen zeigen einen Monatskalender an und der andere Heutige und/oder kommende Termine.

Calendar Block

TODO

Calendar Navigation Block

TODO

Calendar Navigation Block 2(No JS)

TODO

Aussehen anpassen

CSS: TimeIt/pnstyle/style.css Durch verschiedene Klassen kann die Ansicht angepasst werden.

Templates der Ansichten: TimeIt/pntemplates/default/* und TimeIt/pntemplates/list/*

Farben für verschiedene Kategorien: Innerhalb des Zikula Kategorienmanagements können für die einzelnen Kategorien von TimeIT Farben vergeben werden, so dass z.B. eine einfache optisch ansprechende Ressourcenverwaltung (z.B. Vermietung Vereinsheim) möglich wird.

Hierzu in der Administration -> Kategorien-Management -> im Bereich Module -> TimeIT eine Kategorie (z.B. Vereinsheim) hinzufügen und dort im Bereich Attribute im Feld Name eintragen: color und im Feld Wert den gewünschten Farbwert, z.B. #FF0000 (für rot).

Im Kalender erscheint jetzt die Überschrift für alle Termine der Kategorie Vereinsheim in rot.

Probleme und deren Lösung

Kalender zeigt geänderte Termine nicht an

Das Problem lag bei mir in einem stark abgespeckten add/edit Template, da ich die Sharing Funktionalität nicht benutze. Man darf das sharing nicht ganz löschen, da sonst ein Wert in der Datenbank geändert wird, der nicht geändert werden soll. Also habe ich das Sharing komplett gelöscht und folgende anstelle dessen eingefügt:

<div style="display:none;">
    <!--[pnformdropdownlist id="share"]-->
    <!--[pnformdropdownlist id="group"]-->
</div>

Jetzt geht der Kalender wieder ohne das Sharing. Wer sich den Thread im Support Forum noch mal durchlesen möchte kann hier klicken.

Formicula: Gäste können sich nicht an Termine Anmelden (Meldung, wegen fehlender Rechte)

Damit auch Gäste das Formicula Formular benutzen können, muss man den Gästen bei Formicula entsprechende Rechte einräumen. Natürlich muss auch bei TimeIt den Gästen das Anmelden erlaubt werden.

Unregistrierte | TimeIt:subscribe: | ::     | Kommentieren
Unregistrierte | formicula::       | 10:.*: | Kommentieren

Addressbook: Die suche beim Formular geht nicht

Liegt an einem Bug in Addressbook 1.2. Siehe dazu mein Post hier in diesem Thread.

Sortierung der Termine nach Zeit

Herausforderung: In der Tagesansicht und im Block TimeIt/Calendar sollen Events nach Uhrzeit sortiert dargestellt werden.

Lösung: Etwas Programmierung in der Klasse TimeItEventManager. Diese Klasse befindet sich in der Datei modules/TimeIt/classes/domain/TimeItEventManager.class.php.

Zuerst benötigen wir eine neue Methode (function) mit der wir die Information allDayStart in einen ganzzahligen Wert umwandeln. Gelöst habe ich das so:

    /**
     * Returns allDayStart as int value.
     *
     * @param array $item
     * @return int
     */
    private function allDayStartToInt($item) {
        $result = 0;
        $temp = '';

        if ($item['allDay']) {
            return $result;
        }

        // Uhrzeit extrahieren
        $pos = strrpos($item['allDayStart'], ' ');
        if ($pos) {
            $temp = substr($item['allDayStart'], 0, $pos);
        } else {
            $temp = $item['allDayStart'];
        }

        // Stunde und Minute extrahieren
        $pos = strrpos($temp, ':');
        if ($pos) {
            $temp1 = substr($temp, 0, $pos);
            $temp2 = substr($temp, $pos + 1);
            $temp = $temp1 . $temp2;
        }

        // Stunde und Minute in Ganzzahl umwandeln
        $result = (int)$temp;
        return $result;

    }

Nun müssen wir die neue Methode an geeigneter Stelle aufrufen: Das ist die Methode getDailySortedEvents_addToArray(&$array, $tmestamp, $obj), die wir entsprechend modifizieren. Hier der passende Codeschnipsel:

    private function getDailySortedEvents_addToArray(&$array, $tmestamp, $obj)
    {
        ...
        ...
        if(count($array[$tmestamp][$catID]['data']) > 1) {
            // search best pos in $array
            for ($i=count($array[$tmestamp][$catID]['data'])-1; $i > 0; $i--) {
                $item = $array[$tmestamp][$catID]['data'][$i];
                $itembe = $array[$tmestamp][$catID]['data'][$i-1];
                // 2011-12-01 RW compare allDayStart using int values
                $start = $this->allDayStartToInt($item);
                $startbe = $this->allDayStartToInt($itembe);
                // if($itembe['allDayStart'] > $item['allDayStart']) {
                if($startbe > $start) {
                    $objbe = $array[$tmestamp][$catID]['data'][$i-1];
                    $array[$tmestamp][$catID]['data'][$i-1] = $array[$tmestamp][$catID]['data'][$i];
                    $array[$tmestamp][$catID]['data'][$i] = $objbe;
                }
            }
        }

    }

Liste Angemeldeter Teilnehmer zeigt Teilnehmer aller Termine an

Problem: In der Liste der angemeldeten Teilnehmer eines Termins werden die Teilnehmer aller Termine angezeigt. In der Download.csv sind die Teilnehmer aller Termine aufgelistet.

Lösung: in der user.php ab ca. Zeile 149 ( in der gettext-Version 3.0.x) heisst es:

// load data
            $objectData = $domain->getUserOfAReg($id, false, $hasExtendedPerms? true : false);
            $calendar = TimeItDomainFactory::getInstance('calendar')->getObject($dheobj['cid']);

Dort muss man $id in $eid ändern, und es werden nur die Teilnehmer des jeweiligen Termins angezeigt, bzw. in der download.csv dargestellt.

Die entspechenden Zeilen sehen dann so aus:

// load data
            $objectData = $domain->getUserOfAReg($eid, false, $hasExtendedPerms? true : false);
            $calendar = TimeItDomainFactory::getInstance('calendar')->getObject($dheobj['cid']);

Tweaks

Default Kategorie für neue Termine

Man kann neuen Terminen eine Standard Kategorie zuweisen. Dazu editiert man die Datei modules/TimeIt/common.php Man sucht sich folgenden Stelle:

$this->mode = "create";
$render->assign('allDay', 1);
$render->assign('repeat', 0);
$render->assign('text_type', 0);
$render->assign('subscribeLimit', pnModGetVar('TimeIt', 'subscribeLimit', 0));
$render->assign('subscribeWPend', pnModGetVar('TimeIt', 'subscribePending', 0));

und fügt dann eine neue Zeile ein, die folgenden Code enthält:

$render->assign('cats', array('cat_<catname>'=><catID>));

Beachte dass die Werte und von dir geändert werden müssen. catname: Name der Eigenschaft bei der Kategoriezuweisung. Zb. Main catID: ID einer Kategorie (ID einer Kat. welche eine Unterkategorie von der zugewisenen Kategorie ist). Wenn deine Kategorie zum beispiel so aussieht:

ID  35
Pfad /<u>SYSTEM</u>/Modules/global/meineKategorie
IPfad /1/2/30/35

dann musst du folgende Zeile in die common.php einfügen:

$render->assign('cats', array('cat_Main'=>35));

Wie mach ich einen ...

... Belegunsplan

Diese Anleitung soll zeigen, wie man mit TimeIt einen Belegungsplan machen kann. Anleitung