QUIQQER issueshttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues2023-10-31T08:16:53Zhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/51Tests für das Setup schreiben2023-10-31T08:16:53ZHenning LeutzTests für das Setup schreibenEs müssen tests geschrieben die das Setup kontrollieren
D.h. die neuste Version wird täglich kontrolliert und geprüft.Es müssen tests geschrieben die das Setup kontrollieren
D.h. die neuste Version wird täglich kontrolliert und geprüft.https://dev.quiqqer.com/quiqqer/quiqqer/-/issues/201Admin - Spalten lassen sich nicht an angegebener Position einfügen2023-10-31T08:16:19ZPatrick MüllerAdmin - Spalten lassen sich nicht an angegebener Position einfügenBeim Hinzufügen einer Spalte kann man zwar "davor einfügen" und "danach einfügen" wählen, aber eine neue Spalte wird immer nur ganz rechts eingefügt.Beim Hinzufügen einer Spalte kann man zwar "davor einfügen" und "danach einfügen" wählen, aber eine neue Spalte wird immer nur ganz rechts eingefügt.Henning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/202Admin - Neue Spalte, kein refresh2023-10-31T08:16:14ZPatrick MüllerAdmin - Neue Spalte, kein refreshNach dem Hinzufügen einer neuen Spalte wird die Seite nicht refresht und man kann entsprechend die Spalte nicht bearbeiten.Nach dem Hinzufügen einer neuen Spalte wird die Seite nicht refresht und man kann entsprechend die Spalte nicht bearbeiten.Henning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/653E-Mail Änderung mit Verifizierung im Backend2023-10-31T08:14:49ZPatrick MüllerE-Mail Änderung mit Verifizierung im BackendEs wäre sinnvoll, wenn Benutzer auch im Backend eine neue E-Mail-Adresse bestätigen müssen, wenn die geändert wird (ja, hatten wir schonmal besprochen!). Vor allem beim Passwort-Manager, wo wir die Wiederherstellung der Zugangsdaten auch...Es wäre sinnvoll, wenn Benutzer auch im Backend eine neue E-Mail-Adresse bestätigen müssen, wenn die geändert wird (ja, hatten wir schonmal besprochen!). Vor allem beim Passwort-Manager, wo wir die Wiederherstellung der Zugangsdaten auch von einem Code abhängig machen, der per E-Mail verschickt wird. Wenn ich da natürlich willkürlich die E-Mail-Adresse ändern kann, bringt die ganze Maßnahme nichts.
@mor Es wäre gut, wenn du hier einen Meilenstein festlegen würdest.https://dev.quiqqer.com/quiqqer/quiqqer/-/issues/910Version change in package manager2023-10-31T08:14:20ZPatrick MüllerVersion change in package managerWhere?
---
QUIQQER Backend -> `QUIQQER -> System administration -> Installed extensions`
What?
---
It should be possible to change the package version **here** (via dropdown):
![image](/uploads/0fe8550408a289efbcfa6a822622eef5/image.pn...Where?
---
QUIQQER Backend -> `QUIQQER -> System administration -> Installed extensions`
What?
---
It should be possible to change the package version **here** (via dropdown):
![image](/uploads/0fe8550408a289efbcfa6a822622eef5/image.png)
---
Further discussions can be conducted with @morhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1285Emojis2023-10-27T12:06:31ZMark LeibleinEmojisQuiqqer scheint noch Probleme mit der Darstellung von Emojis zu haben. Zumindest wird auf namestorm.de, wenn man 😇 reinkopiert, es zwar zunächst im Editor angezeigt, aber nach dem Speichern als "?" angezeigt. Ich hab versucht, es hier ei...Quiqqer scheint noch Probleme mit der Darstellung von Emojis zu haben. Zumindest wird auf namestorm.de, wenn man 😇 reinkopiert, es zwar zunächst im Editor angezeigt, aber nach dem Speichern als "?" angezeigt. Ich hab versucht, es hier einzutragen:
https://www.namestorm.de/naming-knowhow/marken-umbenennungen-sammlung-namensaenderungen (also eine News-Seite).Henning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1297Benutzer im Admin werden fälschlicherweise automatisch gespeichert2023-10-27T10:14:47ZJan WennrichBenutzer im Admin werden fälschlicherweise automatisch gespeichertIch konnte in der Administration das folgende Verhalten beobachten:
1. Administration besuchen
2. "Einstellungen > QUIQQER > System" öffnen (Panel offen lassen für die nächsten Schritte)
3. Einen Benutzer öffnen (Panel offen lassen für d...Ich konnte in der Administration das folgende Verhalten beobachten:
1. Administration besuchen
2. "Einstellungen > QUIQQER > System" öffnen (Panel offen lassen für die nächsten Schritte)
3. Einen Benutzer öffnen (Panel offen lassen für die nächsten Schritte)
4. Benutzer wird beim Öffnen des Panels automatisch gespeichert
5. Administration (Browser-Tab) neu laden
6. Benutzer wird beim Laden der Administration automatisch gespeichertHenning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/904Centralized QUIQQER Wiki2023-10-19T09:14:23ZJan WennrichCentralized QUIQQER WikiAt the moment a (new) user may have to check all repositories' wikis in order to find the information he needs.
For example: setting up CRONs in the Unix-system. He would check the `quiqqer/quiqqer`-wiki first and then maybe also check...At the moment a (new) user may have to check all repositories' wikis in order to find the information he needs.
For example: setting up CRONs in the Unix-system. He would check the `quiqqer/quiqqer`-wiki first and then maybe also check the `quiqqer/package-cron`'s wiki. The problem there is that the wiki page isn't linked on the wiki's start-page, which makes it even harder to find.
It would be nice if there would be a website (e.g. `wiki.quiqqer.com`) which has a searchable index of all wikis in the `quiqqer/`-group.
This could be implemented by using the GitLab API or making use of the fact that every repository's wiki is a repository itself, which can be cloned and indexed.
-------
This could be a task for an intern or an apprentice.https://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/1296Update scheitert, wenn composer/composer aktualisiert wird2023-10-02T08:42:07ZJan WennrichUpdate scheitert, wenn composer/composer aktualisiert wirdIch hatte jetzt schon zwei mal das folgende Problem bei einem Update:
1. Ich führe `./console update` aus
2. Es wird ein Update des `composer/composer` Pakets durchgeführt
3. Das Update bricht mit einer Exception ab
<details><summary>L...Ich hatte jetzt schon zwei mal das folgende Problem bei einem Update:
1. Ich führe `./console update` aus
2. Es wird ein Update des `composer/composer` Pakets durchgeführt
3. Das Update bricht mit einer Exception ab
<details><summary>Log</summary>
```
root@[redacted] /var/www/vhosts/[redacted].de/staging.[redacted].de # sudo -u www-data ./console update
[...]
- Starte Update:
- Filesystem check ...
You have changes in the following dependencies:
packages/quiqqer/quiqqer
- ./index.php
The update has found inconsistencies in the system!
Should the update be executed anyway? [y,N]: y
QUIQQER Update ...
Changed CWD to /var/www/vhosts/[redacted].de/staging.[redacted].de/var/composer
Running 2.6.1 (2023-09-01 13:53:08) with PHP 8.1.20 on Linux / 5.15.0-78-generic
Loading config file ./composer.json (/var/www/vhosts/[redacted].de/staging.[redacted].de/var/composer/composer.json)
Loading plugin Composer\Installers\Plugin_composer_tmp0 (from composer/installers, installed globally)
Loading plugin OomphInc\ComposerInstallersExtender\Plugin_composer_tmp1 (from oomphinc/composer-installers-extender, installed globally)
Loading plugin Http\Discovery\Composer\Plugin_composer_tmp2 (from php-http/discovery, installed globally)
> pre-command-run: QUI\Package\Composer\CommandEvents::preCommandRun
> pre-update-cmd: QUI\Package\Composer\CommandEvents::preUpdate
Loading composer repositories with package information
Skipped tag 1.5.1, tag (1.5.1.0) does not match version (1.5.0.0) in composer.json
[200] https://license.quiqqer.com/packages.json
Built pool.
Running pool optimizer.
Pool optimizer completed in 0.296 seconds
Found 6,179 package versions referenced in your dependency graph. 5,177 (84%) were optimized away.
Updating dependencies
Generating rules
Resolving dependencies through SAT
Looking at all rules.
Dependency resolution completed in 0.012 seconds
Analyzed 1002 packages to resolve dependencies
Analyzed 4478 rules to resolve dependencies
Lock file operations: 0 installs, 7 updates, 0 removals
Updates:
[...]
- composer/composer:2.6.2
[...]
Installing dependencies from lock file
Package operations: 0 installs, 7 updates, 0 removals
Updates:
[...]
- composer/composer:2.6.2
[...]
[200] https://composer.quiqqer.com//build/cache/composer/composer/composer-composer-623e5e1de055e65bc6c3c61b8348dc4662d75e2b-zip-bd2e0d.tar
[...]
> pre-package-update: QUI\Package\Composer\PackageEvents::prePackageUpdate
Could not scan for classes inside "/var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/quiqqer/lib/classmap/" which does not appear to be a file nor a folder
[...]
> pre-package-update: QUI\Package\Composer\PackageEvents::prePackageUpdate
Checking out d1622afe8646a6fbe22654bc829733b30cde89c8 from cache
[201] https://packagist.org/downloads/
In FilesystemRepository.php line 165:
[ErrorException]
file_get_contents(/var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Repository/../InstalledVersions.php): Faile
d to open stream: No such file or directory
Exception trace:
at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Repository/FilesystemRepository.php:165
Composer\Util\ErrorHandler::handle() at n/a:n/a
file_get_contents() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Repository/FilesystemRepository.php:165
Composer\Repository\FilesystemRepository->write() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Installer/InstallationManager.php:381
Composer\Installer\InstallationManager->Composer\Installer\{closure}() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/react/promise/src/Internal/FulfilledPromise.php:47
React\Promise\Internal\FulfilledPromise->then() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Installer/InstallationManager.php:386
Composer\Installer\InstallationManager->executeBatch() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Installer/InstallationManager.php:319
Composer\Installer\InstallationManager->downloadAndExecuteBatch() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Installer/InstallationManager.php:218
Composer\Installer\InstallationManager->execute() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Installer.php:789
Composer\Installer->doInstall() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Installer.php:614
Composer\Installer->doUpdate() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Installer.php:288
Composer\Installer->run() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Command/UpdateCommand.php:247
Composer\Command\UpdateCommand->execute() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/symfony/console/Command/Command.php:326
Symfony\Component\Console\Command\Command->run() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/symfony/console/Application.php:1063
Symfony\Component\Console\Application->doRunCommand() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/symfony/console/Application.php:320
Symfony\Component\Console\Application->doRun() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Console/Application.php:382
Composer\Console\Application->doRun() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/symfony/console/Application.php:174
Symfony\Component\Console\Application->run() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/composer/composer/src/Composer/Console/Application.php:145
Composer\Console\Application->run() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/composer/src/QUI/Composer/Web.php:620
QUI\Composer\Web->executeComposer() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/composer/src/QUI/Composer/Web.php:211
QUI\Composer\Web->update() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/composer/src/QUI/Composer/Composer.php:174
QUI\Composer\Composer->update() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/quiqqer/lib/QUI/Package/Manager.php:2072
QUI\Package\Manager->composerUpdateOrInstall() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/quiqqer/lib/QUI/Package/Manager.php:1993
QUI\Package\Manager->update() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/quiqqer/lib/QUI/System/Console/Tools/Update.php:274
QUI\System\Console\Tools\Update->execute() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/quiqqer/lib/QUI/System/Console.php:862
QUI\System\Console->executeSystemTool() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/quiqqer/lib/QUI/System/Console.php:260
QUI\System\Console->__construct() at /var/www/vhosts/[redacted].de/staging.[redacted].de/packages/quiqqer/quiqqer/quiqqer.php:85
require() at /var/www/vhosts/[redacted].de/staging.[redacted].de/console:26
update [--with WITH] [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--dry-run] [--dev] [--no-dev] [--lock] [--no-install] [--no-audit] [--audit-format AUDIT-FORMAT] [--no-autoloader] [--no-suggest] [--no-progress] [-w|--with-dependencies] [-W|--with-all-dependencies] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--apcu-autoloader-prefix APCU-AUTOLOADER-PREFIX] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [-i|--interactive] [--root-reqs] [--] [...]
[error]
Etwas ist schief gelaufen::Something went wrong
Wenn das Setup nicht richtig funktioniert hat, nutze bitte den folgenden Befehl für das Update:
php var/composer/composer.phar --working-dir="/var/www/vhosts/[redacted].de/staging.[redacted].de/var/composer" update
Everything is done. Thank you for using QUIQQER
```
</details>Henning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1301Mailversand beschleunigen/optimieren2023-09-28T13:13:55ZJan WennrichMailversand beschleunigen/optimierenAuf einem Kundensystem sind alle Operationen, die (unter anderem) mehrere Mails versenden sehr langsam (> 5 Sekunden).
Ich habe die Vermutung, dass es am Mailversand liegt, da dieser synchron geschieht und damit auf den erfolgreichen V...Auf einem Kundensystem sind alle Operationen, die (unter anderem) mehrere Mails versenden sehr langsam (> 5 Sekunden).
Ich habe die Vermutung, dass es am Mailversand liegt, da dieser synchron geschieht und damit auf den erfolgreichen Versand jeder Mail gewartet wird.
Sollte das die Ursache sein, sollte man den Mailversand optimieren (siehe bspw. https://github.com/PHPMailer/PHPMailer/wiki/Sending-to-lists).
Ich sehe folgende Optimierungsmöglichkeiten:
* `SMTPKeepAlive` in PHPMailer verwenden
* (PHPMailer Instanz am Leben halten)
* (Mails über lokalen Mailserver relayen; nur für Kundensysteme sinnvoll)
* Mails nur in die Mailqueue schreiben und den CRON später das Versenden übernehmen lassen
Das Thema müsste einmal besprochen und konzeptioniert werden.
/cc @mor
/cc @henbugJan WennrichJan Wennrichhttps://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/1295Mailqueue: Abarbeitung entspricht nicht einer Queue2023-09-05T16:16:14ZJan WennrichMailqueue: Abarbeitung entspricht nicht einer QueueDie Mailqueue arbeitet nicht wie eine richtige Queue (Warteschlange).
Von einer Warteschlange würde ich erwarten, dass der erste hinzugefügte Eintrag auch als erstes bearbeitet wird (First in, First Out; FIFO).
Es gibt damit folgende ...Die Mailqueue arbeitet nicht wie eine richtige Queue (Warteschlange).
Von einer Warteschlange würde ich erwarten, dass der erste hinzugefügte Eintrag auch als erstes bearbeitet wird (First in, First Out; FIFO).
Es gibt damit folgende Probleme:
- [ ] Die `send()`-Methode der Mailqueue liest die zu versendenden Mails in beliebiger (nicht definierter) Reihenfolge aus.
Hier sollte nach dem Erstellungsdatum aufsteigend vorgegangen werden.
- [ ] Außerdem muss geprüft werden, ob neu zu versendende Mails direkt verschickt werden, oder erst durch die Queue müssen.
Nach dem allgemeinen Verständnis einer Warteschlange, sollten neue Mails so lange warten müssen, bis sie an der Reihe sind - die Queue also abgearbeitet wurde.Henning LeutzHenning Leutzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1291PHP Foundation durch Spenden unterstützen2023-08-29T22:01:35ZJan WennrichPHP Foundation durch Spenden unterstützen>>>
The PHP Foundation is a collective of people and organizations relying on the PHP language. Its mission is to ensure the long-term prosperity of the PHP language.
The PHP Foundation focuses on providing financial support and guidanc...>>>
The PHP Foundation is a collective of people and organizations relying on the PHP language. Its mission is to ensure the long-term prosperity of the PHP language.
The PHP Foundation focuses on providing financial support and guidance to PHP language developers to support its goals of improving the language for its users, providing high-quality maintenance, and improving the PHP language project to retain current contributors and to integrate new contributors.
>>>
Die PHP Foundation wurde vor kurzem gegründet. Sie stellt sicher, dass es immer genug Entwickler gibt, die am PHP Core arbeiten. Dies wird erreicht, indem den Entwicklern marktübliche Gehälter gezahlt werden. Auf diese Weise wird die Wahrscheinlichkeit gering gehalten, dass das PHP Projekt dadurch scheitert, dass wichtige Personen Ausfallen/Weggehen (sog. "Bus-Faktor"). Ein Beispiel für eine solche wichtige Person ist bspw. Nikita Popov, der sehr viel zu den neuesten PHP Versionen beigetragen hat, aber bald nicht mehr (so viel) am PHP Core arbeiten wird.
Die PHP Foundation wird durch Spenden finanziert.
Um das Fortbestehen und Wachstum von PHP zu sichern, sollte die Foundation durch eine (kleine) Spende unterstützt werden.
Weitere Informationen:
- https://thephp.foundation/
- https://blog.jetbrains.com/de/phpstorm/2022/01/the-php-foundation/
/cc @mor
/cc @henbugMoritz ScholzMoritz Scholzhttps://dev.quiqqer.com/quiqqer/quiqqer/-/issues/1288Console: Abfrage zum Zulassen von Plugins wird nicht angezeigt2023-08-25T08:52:40ZJan WennrichConsole: Abfrage zum Zulassen von Plugins wird nicht angezeigtIch habe per `console update` ein Update durchgeführt.
Durch eine neue Abhängigkeit kam ein Composer Plugin hinzu.
Bevor das Plugin ausgeführt wird, fragt Composer nach einer expliziten Bestätigung.
Die Abfrage hat der Update Prozes...Ich habe per `console update` ein Update durchgeführt.
Durch eine neue Abhängigkeit kam ein Composer Plugin hinzu.
Bevor das Plugin ausgeführt wird, fragt Composer nach einer expliziten Bestätigung.
Die Abfrage hat der Update Prozess nicht angezeigt und blieb damit beim ersten Schritt "Filesystem check" stehen.
Möglicherweise werden alle Abfragen von Composer nicht angezeigt?
Bei dem Plugin handelt es sich um `php-http/discovery`.Henning LeutzHenning Leutzhttps://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/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/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/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/1160Host und unterschiedliche Sprachen Problem2023-07-10T07:40:58ZHenning LeutzHost und unterschiedliche Sprachen ProblemProblem:
- Projekt besitzt zwei Sprachen (de, en)
- Es ist nur ein vhost eingerichtet (nur de)
- en ist leer (Sprachzuweisung)
![image](/uploads/223f9402354bb06f90243d5d91be34ae/image.png)
Bei Englischsprachigen Links wird dadurch dir...Problem:
- Projekt besitzt zwei Sprachen (de, en)
- Es ist nur ein vhost eingerichtet (nur de)
- en ist leer (Sprachzuweisung)
![image](/uploads/223f9402354bb06f90243d5d91be34ae/image.png)
Bei Englischsprachigen Links wird dadurch direkt auf HOST gegangen.
Der richtige Weg wäre, das auf die Domain des de vhosts gegangen wird
![image](/uploads/515224d55d3467a1b14739de3afd3eb1/image.png)1.8.xHenning LeutzHenning Leutz