Giter VIP home page Giter VIP logo

forcal's Introduction

REDAXO AddOn: FOR calendar

Screenshot Screenshot mit Suche

Das AddOn ist ein variabel einsetzbarer Kalender(-Generator), Skedule, Newssystem, Event- und Terminplaner für REDAXO 5.x. Das AddOn kann nach Belieben angepasst werden. Es können jderzeit zusätzliche Eingabe-Felder hinzugefügt werden. Darüber hinaus unterstützt das AddOn mehrsprachige REDAXO-Installationen.

Features

  • Erfassung der Einträge
  • Wiederkehrende Ereignisse
  • Zyklen für wiederkehrende Ereignisse (z.B. alle x Monate, jeder x Wochentag im Monat, alle x Wochen)
  • Mehrfachkategorisierung der Einträge
  • Location-Verwaltung
  • Mehrsprachigkeit
  • Anpassbare Eingabeformulare, definierbar über custom yml-Dateien
  • Sprachspezifische Felder
  • Einfacher Abruf der Termine per PHP-Class-Methoden, Rückgabe als Objekte
  • API zur Ausgabe und Filterung der Events als JSON
  • forCalLink class für: data: link für .ics, Terminübergabe zu Google Calendar, Microsoft Outlook (web) möglich

FOR Calendars ist daher vielfältig einsetzbar und erweiterbar. Terminkalender, Veranstaltungskalender, Nachrichten… alles ist denkbar.

Eigene Felder definieren

Eigene Felder können im Ordner /redaxo/data/addons/forcal/definitions/ angelegt werden. Die nach Installation dort befindlichen .yml Dateien erzeugen die Standardfelder. Möchte man eigene Definitionen erstellen, erstellt man entsprechende yml-files mit dem Prefix custom_. Möchte man die Standardfelder behalten und weiternutzen, sollten diese auch in die custom Definitionen kopiert werden. Beispiele für mögliche Felder findet man auch in den mitgelieferten yml.

Feldtypen

  • media definiert ein Medienauswahfeld für Medien aus dem Medienpool
  • medialist definiert ein Mehrfach-Medienauswahfeld für Medien aus dem Medienpool
  • text stellt eine Texteingabe zur Veffügung
  • textarea stellt eine mehrzeilige Texteingabe zur Veffügung
  • Link stellt einen Auswahldialog zur Auswahl eines internen Links zur Verfügung
  • Linklist stellt einen Auswahldialog zur Mehrfach-Auswahl eines internen Links zur Verfügung
  • select fügt dem Formular eine Selectbox mit definierbaren Werten und ggf. Werte aus einer Tabelle hinzu
  • radio fügt dem Formular eine Radiobutton Group mit definierbaren Werten und ggf. Werte aus einer Tabelle hinzu
  • checkbox fügt dem Formular eine Checkbox mit definierbaren Werten hinzu
  • checkboxsql fügt dem Formular eine Checkbox mit Werten aus einer Tabelle hinzu

Beispiele

Bei Auslieferung vorhanden:

fields:
  - name: 'image'
    type: 'media'
    label_de: 'Bildelement'
    label_en: 'Image element'
  - name: 'file'
    type: 'media'
    label_de: 'Datei Anhang'
    label_en: 'File attachment'

langfields:
  - panel: 'images'
    label_de: 'Sprachbezogene Bildelemente'
    label_en: 'Language-related images elements'
    fields:
      - name: 'lang_image'
        type: 'media'
        label_de: 'Bild'
        label_en: 'Image'
      - name: 'lang_images'
        type: 'medialist'
        label_de: 'Bilder'
        label_en: 'Images'

Select

  - name: favfood
    type: select
    label_de: 'Lieblingsspeise'
    label_en: 'Favorite Food'
    options:
      lk: 'Leberkäse'
      pz: 'Pizza'
      tf: 'Tofu'

Mehrfachauswahl aus SQL Select:

  - name: favfood
    type: select
    label_de: 'Lieblingsspeise'
    label_en: 'Favorite Food'
    qry: 'SELECT id, name FROM rex_yourfoodtable'
    attribute:
      multiple: multiple
      size: 5

Checkbox

  - name: haircolor
    type: checkbox
    label_de: 'Haarfarbe'
    label_en: 'Hair Color'
    options:
      bl: 'Blau'
      gr: 'Grün'
      rt: 'Rot'

Radiobutton

  - name: haircolor
    type: radio
    label_de: 'Haarfarbe'
    label_en: 'Hair Color'
    options:
      bl: 'Blau'
      gr: 'Grün'
      rt: 'Rot'

Attribute

Zu allen Feldern können Attribute angegeben werden.

Beispiel für ein Textfeld, für das der Tinymce Editor verwendet werden soll. Das AddOn muss natürlich installiert sein damit das funktioniert.

  - name: extratext
    type: textarea
    label_de: Extratext
    label_en: Extratext
    attribute:
      class: 'tinyMCEEditor'

Ein Selectfeld mit mehrfacher Auswahlmöglichkeit und einer Höhe von 5 Elementen

  - name: blumenstrauss
    type: select
    label_de: 'Zusammenstellung'
    label_en: 'Collection'
    options:
      ro: 'Rosen'
      da: 'Dalien'
      tu: 'Tulpen'
    attribute:
      multiple: multiple
      size: 5

Text-Editor definieren

forCal erlaubt es einen beliebigen Editor für die Eingabe in den Textfeldern zu wählen. Die Standard Textfelder können über JSON-Definitionen eingestellt werden. Das Verfahren entspreicht der Lösung in yForm.

Teaser und Beschreibung

In den Einstellungen findet man zwei Felder zur Definition der individuellen Attribute für die Textfelder. Hier gibt man die gewünschten Attribute für den gewünschten Editor ein:

z.B.

{"class":"redactorEditor2-forcal_text"}

oder

{"class":"tinyMCEEditor-lite"}

Es können beliebige weitere Attribute hinzugefügt werden wie required , data-attribute, Zeichenlänge etc..

Eigene Textfelder

In den Eigenen Feldern können für jedes Feld Attribute angegeben werden, die die Textfelder beeinflussen und so auch Editoren einbinden.

Modulbeispiel

Hier ein Modul, das einige Filtermöglichkeiten zur Verfügung stellt.

Modul-Eingabe:

Es werden drei Filter-Dropdowns erstellt

  • Zeitraum
  • Kategorie (zieht die Werte aus der Datenbank)
  • Location (zieht die Werte aus der Datenbank) + 'Alle Locations'

Anhand der gesetzten Filter werden im Output die Kalendereinträge geladen

<?php
// Perioden zur Auswahl stellen. 
// ------------------------------------
$select_p = new rex_select();
$select_p->setId('period'); 
$select_p->setAttribute('class', 'selectpicker form-control');
$select_p->setName('REX_INPUT_VALUE[2]');
$select_p->addOption('Gesamter Zeitraum','all');
$select_p->addOption('Halbes Jahr','halfayear');
$select_p->addOption('Vierteljahr','quarter');
$select_p->setSelected('REX_VALUE[2]');
$periodselect = $select_p->get(); 

// forCal-Kategorien zur Auswahl stellen. 
// ------------------------------------
$select = new rex_select();
$select->setId('forcal_category');
$select->setAttribute('class', 'selectpicker form-control');
$select->setName('REX_INPUT_VALUE[3]');
$select->addOption('Alle','');
$select->addSqlOptions('SELECT `name_1`, `id` FROM `' . rex::getTablePrefix() . 'forcal_categories` ORDER BY `name_1` ASC');
$select->setSelected('REX_VALUE[3]');
$catselect = $select->get(); 

// Venues zur Auswahl stellen. 
// ------------------------------------
$select_v = new rex_select();
$select_v->setId('forcal_category');
$select_v->setAttribute('class', 'selectpicker form-control');
$select_v->addOption('Alle',null);
$select_v->setName('REX_INPUT_VALUE[4]');
$select_v->addSqlOptions('SELECT `name_1`, `id` FROM `' . rex::getTablePrefix() . 'forcal_venues` ORDER BY `name_1` ASC');
$select_v->setSelected('REX_VALUE[4]');
$venueselect = $select_v->get(); 
?>

<fieldset class="form-horizontal">
  <div class="form-group">
    <label class="col-sm-2 control-label" for="category">Kategorie</label>
    <div class="col-sm-10">
    <?= $catselect ?>
    </div>
  </div>
</fieldset>
<fieldset class="form-horizontal">
  <div class="form-group">
    <label class="col-sm-2 control-label" for="period">Zeitraum</label>
    <div class="col-sm-10">
	    <?= $periodselect ?>
    </div>
  </div>
</fieldset>
<fieldset class="form-horizontal">
  <div class="form-group">
    <label class="col-sm-2 control-label" for="venues">Location</label>
    <div class="col-sm-10">
	    <?= $venueselect ?>
    </div>
  </div>
</fieldset>

Modulausgabe:

<?php
// Sprache festlegen ... ggf. aus Sprachmetas auslesen 
setlocale (LC_ALL, 'de_DE.utf8');

$categoryId ='';
$filter_date = "";
$today       = date("Y-m-d H:i:s");
$today       = strtotime($today);

//init start date and get end date
$start = date("Y-m-d");
 $end = REX_VALUE[2];

//react to period filter
if ($end == 'all') {
    $start       = new DateTime("1900-08-09");
    $filter_date = ("2100-01-01");
}
if ($end == 'halfayear') {
    $halfayear = strtotime('+ 6 month', $today);
    $filter_date = date("Y-m-d", $halfayear);
}
if ($end == 'quarter') {
    $quarter     = strtotime('+ 3 month', $today);
    $filter_date = date("Y-m-d", $quarter);
}
//get CategoryID and VenueID
$categoryId = REX_VALUE[3];
if($categoryId==''){
$categoryId = null;
}
else {
    $categoryId = REX_VALUE[3];
}
$venues = REX_VALUE[4];
if ($venues == '') {
    $entries = \forCal\Handler\forCalHandler::getEntries($start, $filter_date, true, 'SORT_ASC', $categoryId);
}
if ($venues != '') {
    $entries = \forCal\Handler\forCalHandler::getEntries($start, $filter_date, true, 'SORT_ASC', $categoryId, $venues);
}

////////////////////////////////////////////////////////////
//////////You get the dates from every forCal entry//////////
//////////////////////////////////////////////////////////

foreach ($entries as $data) {
    // dump($data);   // Array ausgeben  
    $event                 = $data['entry'];
    //Format start and end date
    $end_date = rex_formatter::format(date_timestamp_get($event->entry_end_date),'strftime','%A, %d. %B %Y');   
    $start_date = rex_formatter::format(date_timestamp_get($event->entry_start_date),'strftime','%A, %d. %B %Y');
    //Format start time without seconds
    $entry_start_time      = $event->entry_start_time;
    $entry_start_time_date = new DateTime($entry_start_time);
    $start_time            = $entry_start_time_date->format('H:i');
    //Format end time without seconds
    $entry_end_time        = $event->entry_end_time;
    $entry_end_time_date   = new DateTime($entry_end_time);
    $end_time              = $entry_end_time_date->format('H:i');
    //dump($events);
    if ($event->entry_id != '0') {
        echo '<div id="wrapper_entry">';
        echo '<div class="entry_name"> ' . $event->entry_name . ' </div>';
        echo '<div class="entry_data"> ' . $event->venue_name . ' <i class="fa fa-map-marker" aria-hidden="true"></i></div>';
        echo '<div class="entry_data">', $start_date, ' ', ' bis ', $end_date, '</br>', $start_time, ' ', ' bis ', $end_time, '</div>';
        echo '<p class="entry_data">' . $event->type . '</p>';
        echo '<div class="entry_teaser">' . $event->entry_teaser . '</div>';
        echo '<div class="textbox entry_text">' . $event->entry_text . '</p></div>';
        echo '</div>';
    }
}

FOR calendar als FullCalendar im Frontend

inkl. Anzeige einer Detailseite

CSS und Javascript

Zunächst erstellt man ein Javascript zur Initialisierung des Kalenders. Dieses verwendet die API um sich die Termine des Kalenders zu holen. Es sucht auf der Website einen Container mit der ID #forcal in dem der Kalender ausgegeben wird. Hier wird ein Kalender inkl. Terminliste ausgegeben. Dies lässt sich leicht anpassen und den eigenen Wünschen entsprechend gestalten. Weitere Infos dazu hier: FullCalendar - JavaScript Event Calendar

Das Skript legt man z.B. unter /assets/js/forcal.js ab

$(function () {
    forcal_init();
});

function forcal_init() {
    var forcal = $('#forcal');

    if (forcal.length) {
        forcal_fullcalendar(forcal);
    }

}

function forcal_fullcalendar(forcal) {
    var base_link = forcal.data('link'),
        calendarEl = document.getElementById(forcal.attr('id'));

    let calendar = new FullCalendar.Calendar(calendarEl, {
        plugins: ['interaction', 'dayGrid', 'timeGrid'],
        
        header: {
            left: 'prev,next today',
            center: 'title',
            right: 'dayGridMonth,timeGridWeek,timeGridDay'
        },
        locale: 'de',
        weekNumbers: true,
        weekNumbersWithinDays:true,
        dragScroll: true,
        eventLimit: true, // allow "more" link when too many events
        eventDrop: function(event, delta, revertFunc) {
        },
        eventResize: function(event, delta, revertFunc) {
        },
        eventClick: function(info) {
            window.location.replace(base_link + '?event_id=' + info.event.id);
        },
        events: {
            url: '/?rex-api-call=forcal_exchange',
            cache: true,
            error: function(xhr, type, exception) {
                 console.log("Error: " + exception);
            },
            success: function(doc) {
                // add plus circle
            }
        }
    });
    
     calendar.render();
}

wird kein Rewriter verwendet muss window.location.replace(base_link + '?event_id=' + info.event.id); in window.location.replace(base_link + '&event_id=' + info.event.id); geändert werden.

Anschließend bindet man die erforderlichen JS und CSS für die Frontendausgabe im Template ein.

CSS

<link rel="stylesheet" href="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/core/main.min.css') ?>">
<link rel="stylesheet" href="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/daygrid/main.min.css') ?>"> 
<link rel="stylesheet" href="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/list/main.min.css') ?>">
<link rel="stylesheet" href="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/timegrid/main.min.css') ?>">

Javascript

JQuery muss vor allen anderen Skripten eingebunden sein. Die Skripte sollten im Header oder vor dem schließenden body Tag eingebunden werden.

<script type="text/javascript" src="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/core/main.js') ?>"></script>
<script type="text/javascript" src="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/daygrid/main.js') ?>"></script>   
<script type="text/javascript" src="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/interaction/main.js') ?>"></script>   
<script type="text/javascript" src="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/timegrid/main.js') ?>"></script>    
<script type="text/javascript" src="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/list/main.js') ?>"></script> 
<script type="text/javascript" src="<?= rex_url::base('assets/addons/forcal/vendor/fullcalendar/packages/core/locales-all.min.js') ?>"></script>
<script type="text/javascript" src="<?= rex_url::base('assets/js/forcal.js') ?>"></script>

Das Modul für die Ausgabe.

Es besteht nur aus einem Ausgabecode. (Diesen ggf. den eigenen Stilen entsprechend anpassen)

<?php
// Ausgabe der Detail-Seite
if(!is_null(rex_request::get('event_id', 'integer', null))) {
    $data = \forCal\Handler\forCalHandler::exchangeEntry(rex_request::get('event_id'), false);
    // dump($data);
    $header = '<div class="forcal-title">';
    $header .= '<h1>'.$data['title'].'</h1>';
    $header .= '<span class="forcal-meta">' . \forCal\Utils\forCalDateTimeHelper::getFromToDate(new \DateTime($data['start']), new \DateTime($data['end'])) . ' ' . \forCal\Utils\forCalDateTimeHelper::getFromToTime(new \DateTime($data['start']), new \DateTime($data['end'])) . '</span> ';
    $header .= '<hr style="border-color:'.$data['color'].'"> ';
    // Backlink
    $header .= '<div class="pull-left">
    <a class="btn btn-primary" href="'.rex_getUrl('REX_ARTICLE_ID', rex_clang::getCurrentId()).'">Kalender</a>
    </div>';
    // Bild
    if (!empty($data['entries_image'])) {
        $media = rex_media::get($data['entries_image']);
        $header .= '<img class="forcal-img" src="'.$media->getUrl().'">';
    }
    $header .= '</div>';
    $teaser = '<div class="forcal-teaser">'.$data['teaser'].'</div>';
    echo $header.$teaser.'<article class="forcal-text">'.$data['text'].'</article>';
} 
// Kalender ausgeben
else {
?>
<div id="forcal" class="forcal" data-link="<?php echo rex_getUrl('REX_ARTICLE_ID', rex_clang::getCurrentId());?>"></div>
<?php } ?>

Terminlink erstellen

// Datum und Uhrzeit für Termin-Link holen und vorbereiten
$entry_start_time      	= $event->entry_start_time;
$entry_start_time_date	= new DateTime($entry_start_time);
$start_time		= $entry_start_time_date->format('H:i');
$entry_end_time        	= $event->entry_end_time;
$entry_end_time_date   	= new DateTime($entry_end_time);
$end_time             	= $entry_end_time_date->format('H:i');

// Daten und Uhrzeiten formatieren
$from_datetime 		= rex_formatter::format(date_timestamp_get($event->entry_start_date),'strftime','%Y-%m-%d').' '.$start_time;
$to_datetime 		= rex_formatter::format(date_timestamp_get($event->entry_end_date),'strftime','%Y-%m-%d').' '.$end_time;
$from 			= DateTime::createFromFormat('Y-m-d H:i', $from_datetime);
$to 			= DateTime::createFromFormat('Y-m-d H:i', $to_datetime);

$link = forCalLink::create(rex_escape($event->entry_name), $from, $to)
	->description($event->entry_teaser) // Auskommentieren, falls kein Teaser vorhanden
	->address($location); // Auskommentieren, falls keine Location vorhanden

echo '<a href="'.$link->google().'">Google Calendar</a><br>';
echo '<a href="'.$link->yahoo().'">Yahoo</a><br>';
echo '<a href="'.$link->webOutlook().'">Outlook</a><br>';
echo '<a href="'.$link->ics().'">ICS</a>';

Bugtracker

Du hast einen Fehler gefunden oder ein nettes Feature parat? Lege ein Issue an. Bevor du ein neues Issue erstellst, suche bitte ob bereits eines mit deinem Anliegen existiert und lese die Issue Guidelines (englisch) von Nicolas Gallagher.

Lizenz

siehe LICENSE

Autor

Friends Of REDAXO

Development-Team / Autoren

Chief Developer Joachim Dörr

Mit freundlicher Unterstützung durch:

Deutsche Fußball-Route NRW e.V.

forcal's People

Contributors

aeberhard avatar bloep avatar danspringer avatar dependabot[bot] avatar eace avatar godsdog avatar schuer avatar skerbis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

forcal's Issues

SQL-Fehler bei Eingabe von "falschem Datum"

Description / Beschreibung
Gibt man ein Datum eines Termins manuell in das Feld ein und vertauscht Monat und Tag zB 2022-28-10 erhält man einen SQL Fehler. Die falsche Eingabe sollte vor dem Speichern abgefangen werden.

DateTime::__construct(): Failed to parse time string (2022-28-10 16:00:00) at position 6 (8): Unexpected character

Affected versions / Verwendete Versionen

REDAXO:
PHP:
Database:
Browser:
AddOns:

Did it whoops? / Whoops erhalten?

Eingrenzung der Termine auch nach Suchbegriff ermöglichen

Aktuell ist es nicht möglich, die vorliegenden Termine auch nach einem freien Suchbegriff einzugrenzen.

Eine einfache Lösung innerhalb der Ausgabe mittels "str_contains" einzugrenzen ist zwar möglich, aber bei vielen Termine nicht so performant und effektiv.

Es wäre daher toll, wenn man zu den vorhandenen Eingrenzungen auch noch optional nach einem Suchbegriff filtern könnte.

eigene felder/custom entries: attribute beim typ 'media' ermöglichen

während z.b. das der feldtyp 'textarea' mit eigenen attributen ausgestattet werden kann, funktioniert das beim typ 'media' nicht.
das wäre hilfreich um parameter wie 'preview' oder 'types' zu übermitteln.

weiterhin wäre es sehr schön hier auch den typ 'imagelist' zur verfügung zu haben.

keine termine im be fullcalendar wenn in yrewrite die option 'Startsprache automatisch gemäß Sprache des Client-Browsers' gewählt wurde

forcal addon: der kalender im backend zeigt keine termine. der firefox inspector zeigt das der rex api call per 302 auf den unterordner 'en' umgeleitet wird.
Screenshot 2022-02-11 084738

vermutlich leitet yrewrite weiter. dort ist die option 'Startsprache automatisch gemäß Sprache des Client-Browsers, bevorzugte Sprache als Fallback ' aktiviert.
vermutlich muss der api-call in der forcal.js anders definiert werden:

url: '../?rex-api-call=forcal_exchange&_csrf_token=' + csrf_token,

Kalender zeigt nichts an

Hey,

entschuldige bitte nochmal die Störung, aber kann mir bitte jemand helfen - mein Kalender zeigt keine Events an :/

LG Julian

Multiuser

  • Je Backend - User/Gruppe eigene Instanz oder Ansicht
  • Je User oder Gruppe eigene Kategorien
  • Eingabe-Felder für bestimmte Gruppen einblenden/ausblenden können

Die Checkbox "Ganztägiges Ereignis" scheint nicht zu greifen

Die Checkbox "Ganztägiges Ereignis" unter Einstellungen scheint nicht zu greifen. Egal welcher Zustand die Checkbox hat, ist "Ganztägiges Ereignis" immer aktiv, wenn man einen neuen Termin anlegen will.

REDAXO: 5.14.1
PHP: 7.3.33
Database: MySQL 5.7.37
Browser: Chrome 105.0.5195.53
AddOns: forcal 3.5.2

System report (REDAXO 5.14.1, PHP 7.3.33-nmm2, MySQL 5.7.37)

| REDAXO        |            |
| ------------: | :--------- |
|       Version | 5.14.1     |


| PHP           |                                |
| ------------: | :----------------------------- |
|       Version | 7.3.33-nmm2                    |
|       OPcache | no                             |
|        Xdebug | no                             |
|       Warning | Das Setup wird unverschlüsselt durchgeführt. Frontend und Backend sollten grundsätzlich durch HTTPS verschlüsselt aufgerufen werden, um die Privatsphäre zu schützen und den Datenschutz zu gewährleisten.<br/>Die verwendete PHP-Version 7.3.33-nmm2 wird nicht mehr vom Hersteller gepflegt und sollte aktualisiert werden. |


| Database      |              |
| ------------: | :----------- |
|       Version | MySQL 5.7.37 |
| Character set | utf8         |


| Server        |            |
| ------------: | :--------- |
|            OS | Linux      |
|          SAPI | fpm-fcgi   |
|     Webserver | Apache     |


| Request       |                  |
| ------------: | :--------------- |
|       Browser | Chrome/105.0.0.0 |
|      Protocol | HTTP/1.1         |
|         HTTPS | no               |


| Packages                    |            |
| --------------------------: | :--------- |
|                      backup | 2.8.2      |
|                    be_style | 3.1.0      |
|         be_style/customizer | 3.1.0      |
|             be_style/redaxo | 3.1.0      |
|                      forcal | 3.5.2      |
|                     install | 2.10.0     |
|               media_manager | 2.13.0     |
|                   mediapool | 2.12.0     |
|                    metainfo | 2.9.0      |
|                       mform | 6.0.5      |
|                  mform/docs | 1.1        |
|               modulsammlung | 4.15.2     |
| modulsammlung/documentation | 1.0        |
|                   phpmailer | 2.11.2     |
|                        plyr | 3.15.3     |
|                     project | dev        |
|                   redactor2 | 4.2.1      |
|                   search_it | 6.9.0      |
|     search_it/documentation | 6.9.0      |
|         search_it/plaintext | 6.9.0      |
|             search_it/stats | 6.9.0      |
|                   structure | 2.14.1     |
|           structure/content | 2.14.1     |
|                    uploader | 2.3.0      |
|                       users | 2.9.0      |
|                      watson | 2.2.0      |
|                       yform | 3.4.2      |
|                  yform/docs | 3.3.1      |
|                 yform/email | 3.4.2      |
|               yform/manager | 3.4.2      |
|                 yform/tools | 3.4.2      |
|            yform_quick_edit | 1.0.0      |
|             yform_usability | 1.4        |

Kalender Front End

Hey erstmals :)

ich wollte fragen ob ihr eine Idee habt warum der Kalender bei mir in der Bearbeitungsansicht so aussieht:
image

jedoch in der "echten Ansicht" nichts vorhanden ist, da ist einfach nichts.

Ich würde mich voll freuen wenn mir jemand bitte helfen kann.

Vielen Dank und Liebe Grüße

Julian

Massig Fehler im Log: forCal\Handler\forCalHandler::decorateEntry(): Argument #1 ($entry) must be of type stdClass, null given

Mit der aktuellen version werden bei mir massig Fehler geworfen:

forCal\Handler\forCalHandler::decorateEntry(): Argument #1 ($entry) must be of type stdClass, null given, called in /var/www/web1841/html/sub_homepage/redaxo/src/addons/forcal/lib/forcal/Handler/forcalHandler.php on line 634

Der Aufruf kommt darüber: $data = \forCal\Handler\forCalHandler::exchangeEntry($eid, false);
Die übergebene $eid ist dabei größer "0", aber anscheinend nicht in der DB vorhanden.

In der besagten Zeile müsste man das $entry[0] vorher prüfen.

REDAXO: 5.17.1
PHP: 8.2.6
Forcal: 4.0

Sortierung der Calendar-Entries innerhalb eines Datums z.B. nach Titel ermöglichen

Momentan ist es so, dass einzelne Einträge, die am selben Datum stattfinden z.B. per
\forCal\Handler\forCalHandler::getEntries($start, $filter_date, true, 'SORT_ASC', $categoryId); korrekt nach dem Datum sortiert werden.
Hat man nun aber 3 Einträge z.B. am 01.01.2022 werden diese dann anschließend (glaube ich, ich habe nicht nachgesehen) nach id sortiert.

Hier wäre es wünschenswert, dass man noch eine weitere Sortierung zB nach Titel (name_1) vornehmen könnte.

Momentan:

  • 01.01.2022 - Frohes neues Jahr {id:1}
  • 01.01.2022 - Xmas ist vorbei {id:2}
  • 01.01.2022 - Alles Gute zum neuen Jahr {id:3}

Gewünscht zB:

  • 01.01.2022 - Alles Gute zum neuen Jahr {id:3}
  • 01.01.2022 - Frohes neues Jahr {id:1}
  • 01.01.2022 - Xmas ist vorbei {id:2}

Mit folgendem Code habe ich es entsprechend sortiert bekommen:

 $entries = \forCal\Handler\forCalHandler::getEntries($start, $filter_date, true, 'SORT_ASC', $categoryId);
// Sortierung damit innerhalb gleicher Tage noch der Titel nach alphabet sortiert wird
    usort($entries, function($a, $b) {
        /*
         When the $a value is on the left of the spaceship operator and the $b value is on the right, ASCending sorting is used.
         When the $b value is on the left of the spaceship operator and the $a value is on the right, DESCending sorting is used.
         * */
        return
            [$a['entry']->entry_start_date, $a['entry']->entry_name]
            <=>
            [$b['entry']->entry_start_date, $b['entry']->entry_name];
    });

https://stackoverflow.com/a/54647220

Evtl. könnte man hier andenken die Sortierung nach dem Datum noch nach mehreren Gesichtspunkten vorzunehmen (Titel, Venue, Kategorie).

Termin kopieren - "Kopie" anhängen und deaktivieren

Wenn man einen Termin klont, wird er 1:1 übernommen (bis auf die id).
Das ist sehr unübersichtlich, zumal ebenfalls der Status übernommen wird.

Ein kopierter Termin sollte im Titel noch die Kennzeichnung " - Kopie" bekommen und der Status sollte erstmal inaktiv sein.

entry_name enthält auch die Kategorie

Nach allem, was ich bisher rausgefunden und ausprobiert habe, ist es nicht möglich, den reinen Titel auszugeben.
$event->entry_name gibt immer das format "Veranstaltungstitel - Kategoriename" aus. Auch via dump($events) kann ich nicht den reinen Titel finden.

Kann Termine nicht speichern.

Wenn ich über das Termine-Tab versuche einen neuen Termin einzutragen, kann ich diesen nicht speichern.
Es kommt die leider wenig hilfreiche Fehlermeldung "Fehler beim Speichern!"
Wenn ich vom Kalender her komme funktioniert alles einwandfrei.

Mein erster Gedanke war, dass es in einer Form mit den verschiedenen GET-Parametern zusammen hängt.
Von der Termineseite: "/redaxo/index.php?page=forcal/entries&func=add&list=e175387d"
Vom Kalender aus: ".../redaxo/index.php?page=forcal/entries&func=add&itemdate=2021-10-13"
Ohne den itemdate-Parameter scheint etwas zu fehlen.

Dafür kommt, wenn man vom Kalender kommt, keine Bestätigung, dass die Eingaben gespeichert wurden.

SQL-Fehler bei Duplizierung von Termin mirt doppelten Hochkommas im Titel (")

rex_sql_exception thrown with message "Error while executing statement "UPDATE rex_forcal_entries SET name_1 = "Geschichte des Klubhauses "Joliot-Curie" - Kopie", status = 0 WHERE id = 4" using params []! SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Joliot-Curie" - Kopie", status = 0 WHERE id = 4' at line 1"

Stacktrace:
#19 rex_sql_exception in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/sql/sql.php:418
#18 PDOException in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/sql/sql.php:414
#17 PDOStatement:execute in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/sql/sql.php:414
#16 rex_sql:execute in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/sql/sql.php:461
#15 rex_sql:setQuery in /var/www/web97/html/sub_ruhlander/redaxo/src/addons/forcal/lib/forcal/Utils/forcalListHelper.php:116
#14 forCal\Utils\forCalListHelper:cloneData in /var/www/web97/html/sub_ruhlander/redaxo/src/addons/forcal/pages/entries.php:27
#13 require in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/packages/package.php:280
#12 rex_package:includeFile in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/be/controller.php:489
#11 rex_be_controller:{closure} in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/util/timer.php:57
#10 rex_timer:measure in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/be/controller.php:490
#9 rex_be_controller:includePath in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/be/controller.php:439
#8 rex_be_controller:includeCurrentPageSubPath in /var/www/web97/html/sub_ruhlander/redaxo/src/addons/forcal/pages/index.php:10
#7 require in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/packages/package.php:280
#6 rex_package:includeFile in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/be/controller.php:489
#5 rex_be_controller:{closure} in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/util/timer.php:57
#4 rex_timer:measure in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/be/controller.php:490
#3 rex_be_controller:includePath in /var/www/web97/html/sub_ruhlander/redaxo/src/core/lib/be/controller.php:422
#2 rex_be_controller:includeCurrentPage in /var/www/web97/html/sub_ruhlander/redaxo/src/core/backend.php:239
#1 require in /var/www/web97/html/sub_ruhlander/redaxo/src/core/boot.php:143
#0 require in /var/www/web97/html/sub_ruhlander/redaxo/index.php:9

js error in Übersicht: < > heute

TypeError: undefined is not an object (evaluating '$addEntry[0].accessKeyLabel')

Ausprobiert in frischer 5.12 redaxo Version mit forcal 3.0.0-beta2 ohne sonstige Addons.

Sonst: herrlichst! Vielen Dank Skerbis

Bildschirmfoto 2021-03-11 um 16 16 04

Jahresansicht

Schön wäre noch eine Jahresansicht oder dass mehrere Monate gleichzeitig darstellbar sind.

Termine werden falsch ausgelesen weil Enddatum falsch gesetzt wird

In der aktuelle forCal-Version wird das Enddatum innerhalb der Funktion loadEntries falsch gesetzt.
Es wird einfach stumpf um einen Tag erhöht, wodurch z.B. Termine aus dem nächsten Monat mit angezeigt werden.
$endDate->modify("+1 days");

Das Enddatum sollte schon so eingestellt werden, wie es der Nutzer auch definiert hat.

Bsp:
$end = "2022-09-30";
liefert auch Termine vom 01.10.2022

Update auf Grund Abhängigkeiten nicht möglich

Beim Versuch auf die neueste Version zu updaten wird ein Fehler geworfen:

AddOn forcal konnte aus folgendem Grund nicht aktualisiert werden:
Es kann nicht gemeinsam mit dem AddOn quick_navigation mit der Versionsbedingung <6.0.0 aktiviert sein!

Problem dabei ist, dass parallel Quick-Navigation dies bringt:

AddOn quick_navigation konnte aus folgendem Grund nicht aktualisiert werden:
Es kann nicht gemeinsam mit dem AddOn forcal mit der Versionsbedingung <3.7.0 aktiviert sein!

Termine werden nicht ausgelesen weil Datumsprüfung in der Query-Erstellung falsch ist

In der aktuelle forCal scheint die Erstellung des Querys zur Abfrage der Termine falsch zu sein.
Wenn ein repeat-Termin mit Beginn am gleichen Tag wie der Beginn des Auslesens der Termine erstellt wird, dann wird dieser nicht ausgegeben, obwohl dieser innerhalb des gewünschten Start-End-Zeitfensters liegt.

Bsp:
Terminbereich:
Start: 22.09.2022
Ende: 30.04.2023

repeat-Termin:
22.09.2022 - 22.09.2022
Wiederholung: monatlich jeden 1. Monat
Enddatum: 22.04.2023

Termin wird erst im Oktober angezeigt, jedoch nicht bei den Septemberterminen, was er aber müsste.

UPDATE 1:
betrifft übrigens auch nicht wiederkehrende Termin, wenn Sie das Datum von heute (22.09.2022) haben.

UPDATE 2:
setzt man das Datum des Termins auf den 23.09.2022 - 23.09.2022, dann wird er heute mit angezeigt.
Irgendwo ist da der Wurm drin.

UPDATE 3:
Ich vermute, dass die MySQL-Abfrage nicht greifen kann, weil z.B. auf
...BETWEEN '2022-09-22 13:57:55' AND '2022-09-30 23:59:59')...
geprüft wird, aber in der DB nur das Datumsformat hinterlegt ist '2022-09-2022'.
Ändert man es nämlich auf
...BETWEEN '2022-09-22' AND '2022-09-30')...
werden alle Einträge korrekt ausgegeben.

UPDATE 4:
In der Funktion decorateEntryRepeats in der Datei https://github.com/FriendsOfREDAXO/forcal/blob/main/lib/forcal/Handler/forcalHandler.php wird das Vergleichsdatum falsch gesetzt, wodurch bei sich wiederholenden Terminen z.B. das Termin-Startdatum älter ist als das aktuelle Startdatum der Eingrenzung ($startSearchDate).

Bsp:
Termin-Startdatum ist: 2022-09-22 00:00:00.0
Wird aber in forCalDateTimeHelper::isDateRangeBetweenDateRange
verglichen mit: 2022-09-22 14:37:04.0 -> Ergebnis = false

Entweder müsste in der DB auch die Zeit beim Datum mit gespeichert werden oder die Prüfung müsste sich auf den korrekten Tagesbeginn ab 0:00 Uhr beziehen, da sonst ein sich wiederholender Termin am gleichen Tag nicht angezeigt wird.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.