Skip to content

Commit

Permalink
Merge pull request #65 from alexplusde/v6-namespace
Browse files Browse the repository at this point in the history
Namespace + Code-Verbesserungen
  • Loading branch information
alxndr-w authored Dec 9, 2024
2 parents c6c2fb5 + 89a7211 commit 2d10525
Show file tree
Hide file tree
Showing 62 changed files with 1,252 additions and 918 deletions.
43 changes: 33 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,24 +20,47 @@ Mit diesem Addon können Termine anhand von YForm und YOrm im Backend verwaltet
> **Steuere eigene Verbesserungen** dem [GitHub-Repository von events](https://github.com/alexplusde/events) bei. Oder **unterstütze dieses Addon:** Mit einer [Spende oder Beauftragung unterstützt du die Weiterentwicklung dieses AddOns](https://github.com/sponsors/alexplusde)
### Neu in `Events 5`

* Grundlegende Überarbeitung der Datenbanktabellen-Struktur, darunter Performance-Optimimerung mit Unique- und Index-Einstellungen an der Tabelle
* Vollständige Übersetzung des Backends
* Neue Icons für REDAXO 5.17
* Zusätzliche Einstellungsmöglichkeiten, z.B. Fallback-Bild
* Datenschutz: Auto-Löschen von Anmeldungen und Teilnehmer*innen nach 24 Monaten (erfordert Addon `auto_delete` mit aktiviertem Cronjob)
* Checkbox "ganztägig" setzt die Uhrzeit auf 00:00 Uhr zurück
* Verschiedene Bugfixes und Verbesserungen, z.B. Editoreinstellungen
### Neu in `Events 6`

* Nutzung des Namespace `ALexplusde\Events\` und damit Anpassung aller Klassen
* Neue Methoden an den jeweiligen Objekten für die Ausgabe von Events
* Vorgefertigtes Modul mit anpassbaren Fragmenten für die Ausgabe von Veranstaltungen, Kategorien, Terminen usw.
* Datensätze im Table Manager zeigen jetzt auf eine URL, falls online
* Verschiedene Bugfixes und Verbesserungen
* Zusätzliche Dokumentation und Beispiele

> Hinweis: Die Version 6 ist nicht abwärtskompatibel zu Version 5. Bitte prüfe vor dem Update die Änderungen und passe ggf. deine Anpassungen an.
### Vom Entwickler notwendige Anpassungen für Version ^5 -> ^6

* Die Klassen `Event`, `Category`, `Date`, `Registration`, `RegistrationPerson` und `RegistrationPersonFill` benötigen einen Namespace zur Verwendung. Die Klassen `event_date`, `event_category`, ... sind nicht mehr vorhanden.
* Die Tabellen `rex_event_category`, `rex_event_date`, ... haben Änderungen erfahren:
* * `rex_event_date.event_category_id` heißt jetzt `rex_event_date.category_id`. Diese vor dem Update anpassen.
* * Die meisten Tabellen haben jetzt ein Feld `uuid`. Felder, die bisher `uid` hießen, wurden in `uuid` umbenannt.
* * Das Status-Feld für `rex_event_date` ist jetzt an das Schema für <https://schema.org/EventStatusType> angepasst.
* Felder vom Typ `event_media` wurde durch den Typ `be_media_preview` (🧩 YForm Field) ersetzt.

## Installation

Im REDAXO-Installer das Addon `events` herunterladen und installieren. Anschließend erscheint ein neuer Menüpunkt `Veranstaltungen` sichtbar.

## Nutzung im Frontend

Siehe Dokumentation im Addon
> **Neu in Version 6:** Erstelle ein Modul mit folgendem Inhalt.
```php
<?php
use FriendsOfRedaxo\Neues\Neues;

$fragment = new rex_fragment();
$fragment->setVar('slice_id', 'REX_SLICE_ID');

echo $fragment->parse('bs5/events/index.php')

?>
```

Die Fragmente sind für eine Nutzung mit Bootstrap 5 ausgelegt und können bei Bedarf angepasst werden, zum Beispiel über das Project-Addon.

## Formulare

Expand Down
51 changes: 34 additions & 17 deletions boot.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
<?php

namespace Alexplusde\Events;

use rex_addon;
use rex;
use rex_extension;
use rex_yform_manager_dataset;
use rex_yform_manager_table;
use rex_config;
use rex_extension_point;
use rex_be_controller;
use rex_view;
use rex_cronjob_manager;
use rex_plugin;
use rex_csrf_token;
use rex_url;


if (rex::isBackend()) {
rex_extension::register('OUTPUT_FILTER', function (rex_extension_point $ep) {
$suchmuster = 'class="###events-settings-editor###"';
Expand Down Expand Up @@ -33,37 +50,37 @@

rex_yform_manager_dataset::setModelClass(
'rex_event_date',
event_date::class
Date::class
);
rex_yform_manager_dataset::setModelClass(
'rex_event_location',
event_location::class
Location::class
);
rex_yform_manager_dataset::setModelClass(
'rex_event_category',
event_category::class
Category::class
);
rex_yform_manager_dataset::setModelClass(
'rex_event_date_offer',
event_date_offer::class
Offer::class
);
rex_yform_manager_dataset::setModelClass(
'rex_event_date_registration',
event_registration::class
Registration::class
);

rex_yform_manager_dataset::setModelClass(
'rex_event_date_registration_person',
event_registration_person::class
RegistrationPerson::class
);
rex_yform_manager_dataset::setModelClass(
'rex_event_category_request',
event_category_request::class,
CategoryRequest::class,
);

rex_yform_manager_dataset::setModelClass(
'rex_event_date_lang',
event_date_lang::class,
DateLang::class,
);

}
Expand All @@ -78,8 +95,8 @@
[
'path' => '/v5.0/event/date/',
'auth' => '\rex_yform_rest_auth_token::checkToken',
'type' => \event_date::class,
'query' => \event_date::query(),
'type' => Date::class,
'query' => Date::query(),
'get' => [
'fields' => [
'rex_event_date' => [
Expand Down Expand Up @@ -142,8 +159,8 @@
[
'path' => '/v5.0/event/category/',
'auth' => '\rex_yform_rest_auth_token::checkToken',
'type' => \event_category::class,
'query' => \event_category::query(),
'type' => Category::class,
'query' => Category::query(),
'get' => [
'fields' => [
'rex_event_category' => [
Expand Down Expand Up @@ -178,8 +195,8 @@
[
'path' => '/v5.0/event/location/',
'auth' => '\rex_yform_rest_auth_token::checkToken',
'type' => \event_location::class,
'query' => \event_location::query(),
'type' => Location::class,
'query' => Location::query(),
'get' => [
'fields' => [
'rex_event_location' => [
Expand Down Expand Up @@ -241,7 +258,7 @@ function ($a) {
}
);
$list->setColumnFormat(
'event_category_id',
'category_id',
'custom',
function ($a) {
$_csrf_key = rex_yform_manager_table::get('rex_event_category')->getCSRFKey();
Expand All @@ -259,7 +276,7 @@ function ($a) {
$category_ids = array_filter(explode(",", $a['value']));

foreach ($category_ids as $category_id) {
$event = event_category::get($category_id);
$event = Category::get($category_id);
if ($event) {
$return[] = '<a href="'.rex_url::backendPage('events/category', $params) .'">'. $event->getName().'</a>';
}
Expand All @@ -286,7 +303,7 @@ function ($a) {
$return = [];

foreach ($location_ids as $location_id) {
$location = event_location::get($location_id);
$location = Location::get($location_id);
if ($location) {
$return[] = '<a href="'.rex_url::backendPage('events/location', $params) .'">'. $location->getValue('name').'</a>';
}
Expand Down
4 changes: 2 additions & 2 deletions docs/01_event_date.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

# Die Klasse `event_date`
# Die Klasse `Date`

Typ `rex_yform_manager_dataset`. Greift auf die Tabelle `rex_event_date` zu.

Expand All @@ -16,7 +16,7 @@ dump(event_date::get(3)); // Termin mit der id=3
| `getName()` | Titel der Veranstaltung |
| `getDescription()` | Beschreibungstext |
| `getTeaser()` | Unformatierter Teaser-Text |
| `getCategory()` | holt die passende Kategorie als `event_category`-Dataset. |
| `getCategory()` | holt die passende Kategorie als `Category` -Dataset. |
| `getLocation()` | holt den passenden Veranstaltungsort als `event_location`-Dataset. |
| `getOfferAll()` | holt die passenden Angebote / Preise als `event_offer`-Dataset |
| `getImage()` | gibt den Bild-Dateinamen aus dem Medienpool zurück |
Expand Down
4 changes: 2 additions & 2 deletions docs/02_event_category.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Klasse event_category

Die `event_category` Klasse repräsentiert eine Kategorie eines Events. Diese Klasse erweitert die
Die `Category` Klasse repräsentiert eine Kategorie eines Events. Diese Klasse erweitert die
`rex_yform_manager_dataset` Klasse und bietet spezifische Funktionen und Eigenschaften, die für die Verwaltung von
Event-Kategorien notwendig sind.

```php
$eventCategory = new event_category();
$eventCategory = new Category();
```

## Methoden
Expand Down
4 changes: 2 additions & 2 deletions docs/04_event_date_offer.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Dokumentation der `event_date_offer` Klasse
# Dokumentation der `Offer` Klasse

Die `event_date_offer` Klasse repräsentiert ein Angebot für ein bestimmtes Event-Datum. Sie erbt von der `rex_yform_manager_dataset` Klasse und bietet zusätzliche Methoden zur Interaktion mit den Angeboten eines Event-Datums.
Die `Offer` Klasse repräsentiert ein Angebot für ein bestimmtes Event-Datum. Sie erbt von der `rex_yform_manager_dataset` Klasse und bietet zusätzliche Methoden zur Interaktion mit den Angeboten eines Event-Datums.

```php
// Erstellt ein neues Angebot für ein Event-Datum
Expand Down
2 changes: 1 addition & 1 deletion docs/06_event_date_registration_person.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# event_registration_person

Die `event_registration_person` Klasse repräsentiert eine Person, die sich für ein Event registriert hat.
Die `RegistrationPerson` Klasse repräsentiert eine Person, die sich für ein Event registriert hat.

Sie erbt von der `rex_yform_manager_dataset` Klasse.

Expand Down
2 changes: 1 addition & 1 deletion docs/10_forcal_migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ name_1 AS name,
teaser_1 AS teaser,
text_1 AS description,
lang_1 AS lang_id,
category AS event_category_id,
category AS category_id,
start_date AS startDate,
start_time AS startTime,
full_time AS all_day,
Expand Down
2 changes: 1 addition & 1 deletion docs/11_yform_table_manager.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ In der Termin-Tabelle werden einzelne Daten festgehalten. Nach der Installation
| value | text | name | Name |
| validate | empty | name | |
| value | textarea | description | Beschreibung |
| value | be_manager_relation | event_category_id | Kategorie |
| value | be_manager_relation | category_id | Kategorie |
| value | be_manager_relation | location | Veranstaltungsort |
| value | be_media | image | Bild |
| value | text | url | URL |
Expand Down
62 changes: 62 additions & 0 deletions fragments/events/date-details.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php
namespace Alexplusde\Events;

/** @var rex_fragment $this */

$manager = \Url\Url::resolveCurrent();
if($manager) {
/** @var Date $date */
$date = $manager->getDataset();
?>
<div class="banner_title">
<div class="container">
<div class="row">
<div class="col-xl-8">

<p><?= $date->getFormattedStartDate() ?>,
<?= $date->getFormattedStartTime() ?> Uhr
</p>
<h1><?= $date->getName() ?></h1>
<p class="category-badges">
<?php
$categories = $date->getCategories();
foreach($categories as $category) {
/** @var Category $category */
?>
<span
class="badge bg-primary"><?= $category->getName() ?></span>
<?php
}
?>
</div>
</div>
</div>
</div>
<section class="module- events-date">
<div class="container">
<div class=" events-date row g-4">

<div class="col-md-6">
<h2 class="h3 text-primary">{{events.date.details}}</h2>
<p class="fw-bolder events-teaser">
<?= $date->getTeaser() ?>
</p>

<?= $date->getDescription() ?>
</div>
<div class="col-md-6">
<?php
$this->setVar('location', $date->getLocation());
echo $this->subfragment('bs5/events/location.php');
?>
</div>
</div>

<?= $this->getSubfragment('bs5/events/list-back.php'); ?>

</div>
</section>
<?php

}
?>
File renamed without changes.
31 changes: 31 additions & 0 deletions fragments/events/date.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

/** @var rex_fragment $this */
$date = $this->getVar('date');
$category = $date->getCategory();
?>
<div class=" event card mb-4">
<div class="card-body">

<p>
<?php
$categories = $date->getCategories();
foreach($categories as $category) {
?>
<span
class="badge bg-primary"><?= $category->getName() ?></span>
<?php
}
?>
<?= $date->getFormattedStartDate() ?>,
<?= $date->getFormattedStartTime() ?> Uhr
</p>
<h2 class="h4"><?= $date->getName() ?></h2>
<p class=" events-teaser">
<?= $date->getTeaser() ?>
</p>
<a href="<?= $date->getRegisterUrl() ?>"
class="btn btn-medium btn-primary">{{ events.date.more}}</a>
</div>

</div>
29 changes: 29 additions & 0 deletions fragments/events/index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Alexplusde\Events;

use Url\Url;

$event = null;
$manager = Url::resolveCurrent();
if ($manager) {
/** @var Date|Category $event */
$event = $manager->getDataset();

}
?>
<!-- BEGIN plus_bs5/fragments/events/index.php -->
<?php
if($event instanceof Category) {
echo $this->subFragment('bs5/events/list-category.php');
}

if($event instanceof Date) {
echo $this->subFragment('bs5/events/date-details.php', ['event' => $event]);
}

if($event === null) {
echo $this->subFragment('bs5/events/list.php');
}
?>
<!-- END plus_bs5/fragments/events/index.php -->
11 changes: 11 additions & 0 deletions fragments/events/list-back.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Alexplusde\Events;

/** @var rex_fragment $this */

use rex_config;
?>
<a class="btn btn-secondary" href="<?= rex_getUrl(rex_config::get('events', 'article_id')) ?>">
<i class="bi bi-arrow-left"></i> {{ events.list.back}}
</a>
Loading

0 comments on commit 2d10525

Please sign in to comment.