QUIQQER issueshttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues2023-07-31T21:58:08Zhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1276Rename QUI::getDataBase to QUI:getDatabase2023-07-31T21:58:08ZJan WennrichRename QUI::getDataBase to QUI:getDatabaseThere is a typo in the method name.
It's called `database` not `data base`, thus the method should be called `getDatabase`.
How to refactor:
1. introduce new method `getDatabase` that calls `getDataBase`
2. set method `getDataBase` as...There is a typo in the method name.
It's called `database` not `data base`, thus the method should be called `getDatabase`.
How to refactor:
1. introduce new method `getDatabase` that calls `getDataBase`
2. set method `getDataBase` as deprecated
3. introduce breaking change with the next major release:
1. copy method body of `getDataBase` to `getDatabase`
2. delete `getDataBase` method
/cc @henbug2.0 (* *)https://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1271Content Security Policy: nonce-Attribut zu inline Tags hinzufügen2023-07-28T15:39:06ZJan WennrichContent Security Policy: nonce-Attribut zu inline Tags hinzufügenWenn man eine strikte Content Security Policy (CSP) umsetzen möchte, sollten die CSP-Direktiven `script-src` und `style-src` nicht den Wert `unsafe-inline` haben.
Aktuell ist der Wert aber notwendig, damit inline `<style>`- und `<scrip...Wenn man eine strikte Content Security Policy (CSP) umsetzen möchte, sollten die CSP-Direktiven `script-src` und `style-src` nicht den Wert `unsafe-inline` haben.
Aktuell ist der Wert aber notwendig, damit inline `<style>`- und `<script>`-Tags erlaubt sind.
Damit dieser Wert nicht mehr gesetzt werden muss, können die besagten Tags mit dem `nonce`-Attribut versehen werden.
Der Wert des Attributs sollte ein kryptografisch sicherer und zufälliger Hash sein.
Alle verwendeten Hashes müssen dann mit im CSP-Header versendet werden, um zu definieren, dass diese Tags sicher sind.
Die Hashes müssten sich zudem bei jedem Request ändern.
Alternativ kann auch ein Hash des Inhalts der Tags gebildet werden und im Header übertragen werden.
Weitere Informationen und Beispiele dazu:
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#unsafe_inline_script
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src#unsafe_inline_stylesHenning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1264Design für den Einrichtungsassistent -> execution Schritt2023-09-12T06:23:53ZHenning LeutzDesign für den Einrichtungsassistent -> execution SchrittWährend der Einrichtungsassistent läuft, erscheinen verschiedene Informationen.
Meistens eine Info + Bild
Das muss schöner designed werden:
![image](/uploads/4cdd4e56f45b6f29a99c52414ce11499/image.png)
Dateien:
- https://dev.quiqqer....Während der Einrichtungsassistent läuft, erscheinen verschiedene Informationen.
Meistens eine Info + Bild
Das muss schöner designed werden:
![image](/uploads/4cdd4e56f45b6f29a99c52414ce11499/image.png)
Dateien:
- https://dev.quiqqer.com/quiqqer/quiqqer/-/blob/dev/bin/QUI/InstallationWizard.css?ref_type=heads
Background
```
data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 800 400'%3E%3Cdefs%3E%3CradialGradient id='a' cx='396' cy='281' r='514' gradientUnits='userSpaceOnUse'%3E%3Cstop offset='0' stop-color='%232C1EDD'/%3E%3Cstop offset='1' stop-color='%2300022D'/%3E%3C/radialGradient%3E%3ClinearGradient id='b' gradientUnits='userSpaceOnUse' x1='400' y1='148' x2='400' y2='333'%3E%3Cstop offset='0' stop-color='%2341AFFF' stop-opacity='0'/%3E%3Cstop offset='1' stop-color='%2341AFFF' stop-opacity='0.5'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect fill='url(%23a)' width='800' height='400'/%3E%3Cg fill-opacity='0.4'%3E%3Ccircle fill='url(%23b)' cx='267.5' cy='61' r='300'/%3E%3Ccircle fill='url(%23b)' cx='532.5' cy='61' r='300'/%3E%3Ccircle fill='url(%23b)' cx='400' cy='30' r='300'/%3E%3C/g%3E%3C/svg%3E
```Michael DanielczokMichael Danielczokhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1257Einführung von Dependency Injection2023-07-31T21:58:56ZJan WennrichEinführung von Dependency InjectionIch habe mich in der letzten Zeit mit Dependency Injection (in PHP) befasst und darin viele Vorteile gefunden.
_Aus der Feder von ChatGPT (von mir validiert):_
>>>
Dependency Injection (DI) ist ein weit verbreitetes Design-Muster, das ...Ich habe mich in der letzten Zeit mit Dependency Injection (in PHP) befasst und darin viele Vorteile gefunden.
_Aus der Feder von ChatGPT (von mir validiert):_
>>>
Dependency Injection (DI) ist ein weit verbreitetes Design-Muster, das das Prinzip der Inversion of Control (IoC) implementiert. Es bietet eine Reihe von Vorteilen gegenüber harten Abhängigkeiten, insbesondere in der PHP-Entwicklung:
1. Testbarkeit: Mit Dependency Injection kann man Abhängigkeiten durch "Mock"-Objekte ersetzen, was das Schreiben von Unit-Tests erheblich erleichtert. Bei harten Abhängigkeiten ist es oft schwierig, Teile des Codes zu isolieren, was das Schreiben von Tests erschwert.
1. Entkopplung von Komponenten: DI fördert eine lose Kopplung zwischen Klassen und Modulen. Statt dass eine Klasse eine andere instanziiert, werden die benötigten Abhängigkeiten als Parameter übergeben. Dies macht den Code flexibler und erlaubt es, Komponenten einfacher zu tauschen oder zu aktualisieren.
1. Vereinfachtes Refactoring: Da der Code weniger stark gekoppelt ist, ist es einfacher, Änderungen an einzelnen Komponenten vorzunehmen, ohne andere Teile des Codes beeinflussen zu müssen.
1. Bessere Lesbarkeit und Wartbarkeit: Da Abhängigkeiten explizit deklariert werden, ist es einfacher, den Code zu verstehen und zu warten. Man kann schnell sehen, welche Abhängigkeiten eine Klasse hat, ohne dass man den Code der Klasse durchsuchen muss.
1. Wiederverwendbarkeit: Da Komponenten weniger stark miteinander verknüpft sind, ist es leichter, sie in verschiedenen Kontexten wiederzuverwenden.
1. Konfigurierbarkeit: Es ist einfacher, die Konfiguration einer Anwendung zu ändern, indem man einfach verschiedene Implementierungen von Abhängigkeiten injiziert, anstatt Code zu ändern.
Insgesamt kann man sagen, dass Dependency Injection dazu beiträgt, den Code sauberer, modularer und testbarer zu machen, was zu einer besseren Softwarequalität führt. Es sollte jedoch mit Bedacht eingesetzt werden, da es auch zu Komplexität führen kann, wenn es nicht richtig gehandhabt wird.
>>>
Vor allem die bessere Testbarkeit (siehe dazu auch #1256) sowie die Inversion of Control (und die daraus resultierende Entkopplung) sehe ich als große Vorteile.
Außerdem lassen sich so fremde Frameworks und Libraries vermutlich leichter/schöner nutzen, ohne dass man dafür immer eigene Wrapper und/oder Factory-Methoden bauen muss.
Bei meinen eigenen Tests habe ich das [`PHP-DI`-Framework](https://php-di.org/) für Dependency Injection verwendet.
Es unterstützt [Autowiring](https://php-di.org/doc/autowiring.html) und hält sich an den [PSR-11 Standard für Container](https://www.php-fig.org/psr/psr-11/).
Das Framework findet und instanziiert die angeforderten Abhängigkeiten also selbst.
Mein Beispiel Projekt ist das hier: https://github.com/JanWennrich/PHP-Sorting-Algorithms/tree/main
Hier ist ein vergleichendes Beispiele für die Verwendung von Dependency Injection von ChatGPT (von mir validiert):
>>>
1. Harter Dependency-Code:
In diesem Fall erstellt die UserManager-Klasse eine Instanz der UserRepository-Klasse direkt in der Methode createUser.
```php
class UserRepository
{
public function save($data)
{
// Logic to save user data to the database
}
}
```
```php
class UserManager
{
public function createUser($data)
{
$repository = new UserRepository();
$repository->save($data);
}
}
```
Die Probleme hier sind:
- Die UserManager-Klasse ist stark an die UserRepository-Klasse gekoppelt.
- Es ist schwierig, die UserManager-Klasse zu testen, da Sie nicht einfach eine gemockte UserRepository-Instanz injizieren können.
- Wenn Sie die UserRepository-Klasse ändern möchten (z.B. die Art und Weise, wie Sie die Daten speichern), müssen Sie die UserManager-Klasse ebenfalls ändern.
2. Code mit Dependency Injection:
Hier wird die UserRepository-Instanz als Konstruktorparameter zur UserManager-Klasse hinzugefügt. Das bedeutet, dass Sie die Abhängigkeit "injizieren".
```php
class UserRepository
{
public function save($data)
{
// Logic to save user data to the database
}
}
```
```php
class UserManager
{
protected $repository;
public function __construct(UserRepository $repository)
{
$this->repository = $repository;
}
public function createUser($data)
{
$this->repository->save($data);
}
}
```
Die Vorteile sind:
- Die UserManager-Klasse ist nun weniger stark an die UserRepository-Klasse gekoppelt.
- Sie können eine andere Implementierung von UserRepository injizieren, solange diese das gleiche Interface verwendet.
- Es ist einfacher, die UserManager-Klasse zu testen, da Sie nun einfach eine gemockte UserRepository-Instanz injizieren können.
- Wenn Sie die UserRepository-Klasse ändern möchten, müssen Sie die UserManager-Klasse nicht mehr ändern.
Insgesamt erlaubt Ihnen die Dependency Injection, Ihren Code modularer und testbarer zu gestalten. Es reduziert die Kopplung zwischen Ihren Klassen und macht sie wiederverwendbarer und leichter zu warten.
>>>
Sehr ihr irgendwelche Probleme und/oder Nachteile an der Verwendung von Dependency Injection oder habt ihr schon damit Erfahrungen gemacht?
/cc @peat
/cc @henbug
/cc @morJan WennrichJan Wennrichhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1255monolog entfernen wenn umgesetzt2024-01-25T07:38:06ZHenning Leutzmonolog entfernen wenn umgesetztIn der quiqqer/quiqqer composer.json ist monolog referenziert. Wenn das Update und das Setup in separate Prozesse sind, kann dies raus. Mehr Informationen hier:
https://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1254In der quiqqer/quiqqer composer.json ist monolog referenziert. Wenn das Update und das Setup in separate Prozesse sind, kann dies raus. Mehr Informationen hier:
https://dev.quiqqer.com/quiqqer/quiqqer/-/issues/12541.11 (K* K*)https://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1248PSR-kompatible Caching Library verwenden2024-01-25T07:37:14ZJan WennrichPSR-kompatible Caching Library verwendenAktuell verwendet QUIQQER [`tedivm/stash`](https://github.com/tedious/Stash) als Library für das Caching.
Die Library gibt vor mit ["PSR-6: Caching Interface"](https://www.php-fig.org/psr/psr-6/) kompatibel zu sein.
Mit ["PSR-16: Commo...Aktuell verwendet QUIQQER [`tedivm/stash`](https://github.com/tedious/Stash) als Library für das Caching.
Die Library gibt vor mit ["PSR-6: Caching Interface"](https://www.php-fig.org/psr/psr-6/) kompatibel zu sein.
Mit ["PSR-16: Common Interface for Caching Libraries"](https://www.php-fig.org/psr/psr-16/#definitions) ist sie offiziell nicht kompatibel.
Allerdings wird die PSR-6 Kompatibilität nicht strikt umgesetzt, sodass man auch PSR-6 inkompatibles Caching durchführen kann: https://github.com/tedious/Stash/issues/349
Das erschwert den Austausch der Caching-Library in Zukunft.
Des Weiteren wurde die Library seit einem Jahr nicht weiterentwickelt und es existiert noch keine stabile Version (`v0.17.6` vs `1.*`).
Es sollte überlegt werden, ob wir auf eine stabilere sowie PSR-6 und PSR-16 kompatible Caching Library umsteigen wollen.
Das würde das Erweitern und/oder Austauschen der Caching Library in Zukunft vereinfachen.
Mögliche PSR-6 und PSR-16 kompatible Alternativen wären:
- https://github.com/symfony/cache
- https://www.php-cache.com/en/latest/ (empfiehlt selbst Symfony Cache zu verwenden)
/cc @peat @henbug @mor1.11 (K* K*)Jan WennrichJan Wennrichhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1246Ausführung von CRONs parallelisieren2023-06-09T08:13:28ZJan WennrichAusführung von CRONs parallelisierenCRONs werden sequentiell ausgeführt - also ein registrierter CRON nach dem nächsten.
Aktuell kommt es wohl teilweise vor, dass manche CRONs so viel Zeit benötigen, dass die übrigen CRONs nicht rechtzeitig oder gar nicht ausgeführt wer...CRONs werden sequentiell ausgeführt - also ein registrierter CRON nach dem nächsten.
Aktuell kommt es wohl teilweise vor, dass manche CRONs so viel Zeit benötigen, dass die übrigen CRONs nicht rechtzeitig oder gar nicht ausgeführt werden.
Da jeder CRON für sich eine eigene "Einheit" ist, die unabhängig vom Rest ist, könnten alle CRONs theoretisch auch parallel ausgeführt werden.
Mit PHP 8.1 wurden [Fibers](https://www.php.net/manual/de/language.fibers.php) eingeführt, mit denen Code "non-blocking" im Hintergrund ausgeführt werden kann.
Mit den Fibers selbst, oder einem vereinfachenden Framework wie bspw. [`amphp/parallel`](https://github.com/amphp/parallel), könnten die CRONs so parallel (im Hintergrund) ausgeführt werden.
Mit diesem Ticket kann diskutiert werden, ob es sinnvoll ist dies zu implementieren.
/cc @mor @henbug @peatJan WennrichJan Wennrichhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1243Wiki überarbeiten2023-10-19T09:14:18ZJan WennrichWiki überarbeitenDas Wiki besteht momentan aus vielen einzelnen Seiten, die teilweise nicht mehr aktuell sind.
Folgende Tasks sollten mindestens erledigt werden, um ein wenig Ordnung zu schaffen:
- [ ] Outdated Inhalte entfernen oder aktualisieren
- [ ]...Das Wiki besteht momentan aus vielen einzelnen Seiten, die teilweise nicht mehr aktuell sind.
Folgende Tasks sollten mindestens erledigt werden, um ein wenig Ordnung zu schaffen:
- [ ] Outdated Inhalte entfernen oder aktualisieren
- [ ] Ordner-Funktion des Wikis nutzen
- [x] Vorgehen für Composer Befehle auf das neue Konsole-Tool ändern (siehe quiqqer/quiqqer#1234)
- [ ] Verlinkung zum QUIQQER Stabilization Wiki hinzufügen: https://dev.quiqqer.com/quiqqer/stabilization/documentation/-/wikis/home
Dazu kann das Wiki-Repo lokal geklont und (per Gollum) bearbeitet werden, siehe: https://dev.quiqqer.com/quiqqer/quiqqer/-/wikis/git_accessJan WennrichJan Wennrichhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1309composer.phar entfernen2024-01-25T07:41:27ZJan Wennrichcomposer.phar entfernenIn quiqqer/quiqqer#1234 wurde QUIQQER so umgebaut, dass die `composer.phar` nicht mehr benötigt wird.
Bei einer Neuinstallation muss die `composer.phar` also nicht mehr im entsprechenden Verzeichnis abgelegt werden.In quiqqer/quiqqer#1234 wurde QUIQQER so umgebaut, dass die `composer.phar` nicht mehr benötigt wird.
Bei einer Neuinstallation muss die `composer.phar` also nicht mehr im entsprechenden Verzeichnis abgelegt werden.1.10 (Joyful Jutland)Henning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1242"minimum-stability" standardmäßig auf "stable" setzen2024-01-25T07:43:28ZJan Wennrich"minimum-stability" standardmäßig auf "stable" setzen_(Basiert auf der Diskussion aus quiqqer/quiqqer#1214)_
Installiert man QUIQQER in einer stabilen Version (bspw. `1.*`), könnten auch Pakete in instabilen Versionen installiert werden.
Die `composer.json` sagt nur, dass stabile Versio..._(Basiert auf der Diskussion aus quiqqer/quiqqer#1214)_
Installiert man QUIQQER in einer stabilen Version (bspw. `1.*`), könnten auch Pakete in instabilen Versionen installiert werden.
Die `composer.json` sagt nur, dass stabile Versionen bevorzugt werden sollen (`prefer-stable: true`). Wenn es aber keine (passende) stabile Version gibt, wird eine instabile Version installiert.
Aus meiner Sicht darf/sollte es in einer stabilen QUIQQER Installation keine instabilen Abhängigkeiten geben. Bei einem Update besteht sonst immer die Gefahr, dass instabile Änderungen das gesamte System lahmlegen. In der `composer.json` des Systems sollte daher die `minimum-stability` auf `stable` gesetzt werden.
Aktuell (QUIQQER Version 1.7) lässt sich das nicht umsetzen, da einige Pakete in instabilen Versionen required werden. Außerdem ist es bei der Installation möglich per Freitext ein bestimmtes Template und dessen Version zu wählen. Die Installation würde abbrechen, wenn man ein Template wählt, dass instabile Abhängigkeiten hat.
Ich könnte mir stattdessen folgenden Ablauf vorstellen, der die Installation vermutlich auch stark vereinfachen würde:
1. QUIQQER wird mit einem Standard-Template installiert. Man kann das Template also nicht mehr frei wählen.
2. Standardmäßig ist `minimum-stability: stable` gesetzt, sodass nur stabile Abhängigkeiten installiert werden können
3. Möchte man nun ein anderes Template nutzen, kann man es über die Administration oder die Konsole nachträglich installieren.
4. Nutzt das Template instabile Abhängigkeiten, kann es (richtigerweise) nicht installiert werden, da das System sonst instabil wird.
5. Wenn man das Risiko bewusst eingehen möchte, kann man die `minimum-stability` manuell anpassen (ggf. Setting in der Administration hinzufügen).
Dieses Ticket soll dazu dienen dieses Thema zu diskutieren.Jan WennrichJan Wennrichhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1235Nur Icon Auswahl in Media Input einabeun2023-05-07T09:17:58ZMichael DanielczokNur Icon Auswahl in Media Input einabeunMit dem Control `controls/projects/project/media/Input` ([Link](https://dev.quiqqer.com/quiqqer/quiqqer/-/blob/master/bin/QUI/controls/projects/project/media/Input.js)) könenn wir Bilder auswählen. Setzt man die Option `data-qui-options-...Mit dem Control `controls/projects/project/media/Input` ([Link](https://dev.quiqqer.com/quiqqer/quiqqer/-/blob/master/bin/QUI/controls/projects/project/media/Input.js)) könenn wir Bilder auswählen. Setzt man die Option `data-qui-options-cssclasses="1"`, wird auch Icon-Auswahl-Button eingeblendet. In vielen Fällen möchte in (in Brick) dem Benutzer erlauben, **nur die Icon** auszuwählen. Das ist im Moment nicht möglich (oder ich übersehe was).
Außerdem finde ich die Option `data-qui-options-cssclasses="1"`nicht klar genug. Mir ist jetzt klar, warum das so heißt (nach Auswahl wird in dem Input die FontAwesome CSS Klasse reingeschrieben). Ich finde man sollte neue Alias-Option hinzufügen, die das gleiche macht (umbenennen geht nicht, da die Option `data-qui-options-cssclasses="1"` schon in Benutzung ist). Mein Vorschlag wäre `data-qui-options-icon="1"`. Ich denke das wird viel verständlicher. Es sei denn es gibt Gründe, warum das `cssclasses` heißt :thinking:
1. [ ] Option einbauen "nur Icon Auswahl" oder ähnliches ("media Auswahl deaktivieren?"). Bin grade nicht sicher, was besser und nachvollziehbarer wär :thinking:
2. [ ] Alias Option für `data-qui-options-cssclasses="1"` einbauen, damit man klar weißt, das die Option die FontAwesome Icon Auswahl aktiviert.
Wenn du mit dem Feature einverstanden bist und mir eventuell kurz erläuterst, was ich bei der Umsetzung beachten soll, würde ich das gerne einbauen :thumbsup: Auch Vorschläge für die Benennung von Optionen sind gerne gesehen.Henning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1232Fallback Workspace wenn Backend Nutzer kein Workspace hat.2023-07-10T07:40:03ZMoritz ScholzFallback Workspace wenn Backend Nutzer kein Workspace hat.- Wenn NUtzer importiert werden bekommen diese kein Workspace zugeordnet, hier sollte als Fallback immer der 2er Workspace genutzt werden
- Automatisch angelegten Workspaces fehlt die Sprachvariable
![image](/uploads/c923afd1a4f524a3ec6...- Wenn NUtzer importiert werden bekommen diese kein Workspace zugeordnet, hier sollte als Fallback immer der 2er Workspace genutzt werden
- Automatisch angelegten Workspaces fehlt die Sprachvariable
![image](/uploads/c923afd1a4f524a3ec6c19b10bd8f54a/image.png)1.8.xHenning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1230XML Dateien validieren2023-07-31T21:56:29ZJan WennrichXML Dateien validierenUm XML Dateien zu validieren, können [`Document Type Definitions` (`DTD`)](https://wiki.selfhtml.org/wiki/XML/DTD) genutzt werden.
In einer `DTD`-Datei kann angegeben werden, welche Elemente es an welcher Stelle in der XML-Datei geben ...Um XML Dateien zu validieren, können [`Document Type Definitions` (`DTD`)](https://wiki.selfhtml.org/wiki/XML/DTD) genutzt werden.
In einer `DTD`-Datei kann angegeben werden, welche Elemente es an welcher Stelle in der XML-Datei geben darf.
Damit könnte beim Erstellen einer Version und bei der Installation geprüft werden, ob die Datei nicht nur "wohlgeformt" (gültiges XML) sondern auch gültig (der Spezifikation entsprechend) ist. Fehlerhafte XML Dateien können dann frühzeitig abgelehnt werden.
Das DTD für jede Art von XML Datei müsste an einer zentralen Stelle verfügbar sein (bspw. `https://www.quiqqer.de/xml/dtd/locale.dtd`) und wird dann wie folgt im Kopf der XML-Datei referenziert:
```xml
<!DOCTYPE locales SYSTEM "https://www.quiqqer.de/xml/dtd/locale.dtd">
```
Nach dem Laden der Datei kann dann in PHP auf dem [`DOMDocument` die `validate()`-Methode](https://www.php.net/manual/en/domdocument.validate.php) aufgerufen werden.
Diese gibt `true` zurück, wenn alles okay ist, oder wirft bei Fehlern eine Exception.
-------
Alternativ (oder besser) kann man auch [XML-Schema `1.0`](https://www.wilfried-grupe.de/XSD3_.html) verwenden.
Hierbei muss das Schema **NICHT** in jeder XML Datei referenziert werden und auch **NICHT** an einer zentralen online erreichbaren Stelle liegen.
Die verschiedenen Schemas für jede XML-Datei könnte man bspw. im `quiqqer/quiqqer` oder einem eigenen Repository ablegen.
Die Prüfung der per PHP in ein `DOMDocument` geladenen XML-Datei erfolgt dann per [`DOMDocument::schemaValidate($schemaPath)`](https://www.php.net/manual/en/domdocument.schemavalidate.php).Jan WennrichJan Wennrichhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1225Offizielles Issue für ein Admin Backend Darkmode2023-07-10T07:39:29ZAdrian MüllerOffizielles Issue für ein Admin Backend DarkmodeDas haben doch schon alle auf dem Plan, es muss nur noch kurz mit @henbug @mor und @michael.daniel konzeptioniert werden und dann kann es doch auch langsam in die Wege geleitet werden :) Alle wollen es :)Das haben doch schon alle auf dem Plan, es muss nur noch kurz mit @henbug @mor und @michael.daniel konzeptioniert werden und dann kann es doch auch langsam in die Wege geleitet werden :) Alle wollen es :)2.0 (* *)https://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1217Standard (Projekt) Einstellungen bei Paketinstallation in die (Projekt) Confi...2024-02-14T13:33:30ZJan WennrichStandard (Projekt) Einstellungen bei Paketinstallation in die (Projekt) Config schreiben_Aus: https://dev.quiqqer.com/quiqqer/matomo/-/issues/6#note_154009_
Beim Installieren eines Pakets ist mir aufgefallen, dass die in der `settings.xml` als Standard definierten Projekteinstellungen erst in die Projekt Config geschrieben..._Aus: https://dev.quiqqer.com/quiqqer/matomo/-/issues/6#note_154009_
Beim Installieren eines Pakets ist mir aufgefallen, dass die in der `settings.xml` als Standard definierten Projekteinstellungen erst in die Projekt Config geschrieben werden, wenn das Projekt gespeichert wird.
Das heißt bis dahin wird beim Auslesen dieser Config werte immer ein falscher Wert zurückgegeben.
Beim Ausführen des Setups sollten die Standardwerte in die Config geschrieben werden.
Möglicherweise betrifft das auch andere Configs als nur die Projekte.1.12 (L* L*)Henning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1208Layout Einstellungen überlegen und einbauen2024-02-28T12:00:53ZMichael DanielczokLayout Einstellungen überlegen und einbauenZusammenfassung des Brainstorms mit Mor:
**Problemstellung**
- Wir brauchen eine Einstellung für "Standardlayout" in **Projekt Einstellungen**.
1. Standardlayout = Auswahl von Layouts
2. Was passiert mit neuen / leeren Seiten? ...Zusammenfassung des Brainstorms mit Mor:
**Problemstellung**
- Wir brauchen eine Einstellung für "Standardlayout" in **Projekt Einstellungen**.
1. Standardlayout = Auswahl von Layouts
2. Was passiert mit neuen / leeren Seiten? Auswahl:
1. Vererben
2. Standardlayout nutzen (die obere Einstellung benutzen) - das hier vielleicht als **default**
- Die Einstellung soll in aktuellen Systemen nichts "kaputt" machen
- Jede Seite soll bestimmen können, welches Layout benutzt werden soll. Im besten Fall das bereits existierende Dropdown benutzen und hier weitere Optionen hinzufügen:
1. Leer
2. Neu: vererbt
3. Neu: Standardlayout
4. 5.6.7..... dann die vorhanden [Hier ein Beispiel](/uploads/a37b64b6ae0206b2507c45599d342f0e/image.png)
Hier die neue Optionen:
![image](/uploads/7fb6db8a4e80196e5cb8372077c3ab01/image.png)
@henbug wenn du mir kurz Tipp geben würdest, wo ich anfangen soll und eventuell was zu beachten ist, könnte ich versuchen das umzusetzen. Es sei denn die Erklärung dauert länger als deine Umsetzung, dann mach das gerne :smile:
Bei Fragen bitte den guten @mor nerven.1.12 (L* L*)Henning LeutzHenning Leutz2024-04-09https://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1202User::hasPermission und ::getPermission verhalten sich falsch/komisch2024-03-12T13:43:39ZJan WennrichUser::hasPermission und ::getPermission verhalten sich falsch/komisch**tl;dr:**
- `hasPermission` und `getPermission` in der `User`-Klasse prüfen nicht die Permissions der Gruppen des Benutzers.
- `checkPermission` prüft die Permission der Gruppen des Benutzers
- Das Verhalten ist inkonsistent und verwir...**tl;dr:**
- `hasPermission` und `getPermission` in der `User`-Klasse prüfen nicht die Permissions der Gruppen des Benutzers.
- `checkPermission` prüft die Permission der Gruppen des Benutzers
- Das Verhalten ist inkonsistent und verwirrend
**Ausführliche Informationen:**
Folgende Ausgangssituation:
1. `quiqqer/quiqqer` ist in der neuesten `dev-dev` Version installiert
1. Es gibt eine Boolean Permission `meine.permission`
1. Es gibt eine Gruppe `Händler`
1. Die Gruppe `Händler` hat die Permission `meine.permission` auf `true`
1. Die Standard-Gruppe `Everyone` hat die Permission `meine.permission` auf `false`
1. Es gibt einen Benutzer `Jan`
1. Der Benutzer `Jan` hat die Permission `meine.permission` auf `false`
1. Benutzer `Jan` ist Mitglied der Gruppen `Händler` und `Everyone`
Ich wollte nun herausfinden ob der Benutzer `Jan` die Permission `meine.permission` hat.
Dazu habe ich die folgenden Permission Methoden des Benutzers mit den dahinter stehenden Ergebnissen genutzt:
- `checkPermission('meine.permission')` -> `NULL`
- `hasPermission('meine.permission')` -> `false`
- `getPermission('meine.permission')` -> `false`
Dass `checkPermission` den Wert `NULL` zurückgibt, kann ich noch einigermaßen verstehen, da eine Exception geworfen wird, wenn er die Permission nicht hat.
Dass `hasPermission()` und `getPermission()` beide `false` zurückgeben finde ich allerdings seltsam.
Über die Gruppe `Händler` sollte der Benutzer `Jan` die Permission haben.
Wenn ich dem Benutzer die Permission direkt gebe, dann geben die beiden Methoden richtigerweise `true` zurück.
Die beiden Methoden `hasPermission` und `getPermission` prüfen also nur ob der Benutzer direkt die Permission hat und nicht ob er die Permission über eine Gruppe hat.
Man könnte argumentieren, dass die Methoden auf dem Benutzer Objekt aufgerufen werden und daher auch nur den Benutzer überprüfen sollen.
Dann sollte sich aber auch `checkPermission` konsistent verhalten und eine Permission-Exception werfen, wenn der Benutzer selbst die Permission nicht hat.
Am intuitivsten fände ich es, wenn alle drei Methoden auch die Permissions der Gruppen des Benutzers überprüfen würden.
Was meint ihr dazu, @henbug @peat @mor ?Jan WennrichJan Wennrich2024-01-15https://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1194Device Tokens einführen2022-11-03T09:10:49ZJan WennrichDevice Tokens einführen```
Neue Tabelle für Device Tokens "user_devices" in quiqqer/quiqqer
Synfony Device Token anschauen
Spalten: user_id, token, creation_date, last_use_date
Wenn Login erfolgreich war Device Token in die Tabelle legen
```
_Quelle: https...```
Neue Tabelle für Device Tokens "user_devices" in quiqqer/quiqqer
Synfony Device Token anschauen
Spalten: user_id, token, creation_date, last_use_date
Wenn Login erfolgreich war Device Token in die Tabelle legen
```
_Quelle: https://dev.quiqqer.com/pcsg/kunden/dishcircle/backbox-api/konzeption/-/issues/14_Jan WennrichJan Wennrichhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1191Security Updates + Update Flags2024-01-25T07:37:17ZHenning LeutzSecurity Updates + Update Flags![image](/uploads/1f7e7e7f28b7ee11aa1b4513d99d2dfe/image.png)
- [ ] Security und Fehlerbehebung Updates an / ausschaltbar machen
- [ ] Security und Fehlerbehebung Updates default aktivieren
- [ ] Standard Auto Updats nicht default
- [ ]...![image](/uploads/1f7e7e7f28b7ee11aa1b4513d99d2dfe/image.png)
- [ ] Security und Fehlerbehebung Updates an / ausschaltbar machen
- [ ] Security und Fehlerbehebung Updates default aktivieren
- [ ] Standard Auto Updats nicht default
- [ ] Checkboxen sollten den Cron an und ausschalten (so hat man zwei Sachen die geprüft werden müssen, besser wenn der Crode/aktiviert wird)
- [ ] Wenn Cron nicht vorhanden, anlegen
- [ ] Cron sollte nicht das Flag prüfen (Flags sind hinfällig wenn das obere Todo umgesetzt ist)1.11 (K* K*)Henning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1188QUIQQER Installation automatisiert testen2023-05-30T15:38:43ZJan WennrichQUIQQER Installation automatisiert testenHäufig kommt es vor, dass sich QUIQQER nicht installieren lässt.
Es soll ein Skript/Tool entwickelt werden, dass QUIQQER regelmäßig automatisch installiert und bei Problemen eine Mail verschickt oder ein Ticket anlegt.
Das genaue Vorge...Häufig kommt es vor, dass sich QUIQQER nicht installieren lässt.
Es soll ein Skript/Tool entwickelt werden, dass QUIQQER regelmäßig automatisch installiert und bei Problemen eine Mail verschickt oder ein Ticket anlegt.
Das genaue Vorgehen dazu muss noch konzeptioniert werden.Jan WennrichJan Wennrich