tbaddade / redaxo_url

REDAXO 5 AddOn zur URL-Generierung für eigene AddOns (ehemals Url Control, ehemals Frau Schultze)
MIT License
46 stars 22 forks source link

rex_exception bei Aufruf von rex_getUrl() wenn Datensatz nicht vorhanden ist #175

Closed TobiasKrais closed 4 years ago

TobiasKrais commented 4 years ago

$this->url = rex_getUrl('', $clang_id, ['machine_id' => $machine_id], "&"); erzeugt folgenden Fehler wenn die $clang_id oder $machine_id nicht im Datensatz vorhanden ist:

rex_exception: Your returned Url is not an instance of Url\Url File: redaxo/src/addons/url/lib/Url/Profile.php Line: 382

Stacktrace | Function | File | Line | | -------------------------------------------- | ---------------------------------------------------------- | -------- | | Url\Profile->createAndSaveUrls | redaxo/src/addons/url/lib/Url/Profile.php | 259 | | Url\Profile->buildUrlsByDatasetId | redaxo/src/addons/url/lib/Url/UrlManager.php | 356 | | Url\UrlManager::getRewriteUrl | redaxo/src/addons/url/boot.php | 78 | | rex_package->{closure} | redaxo/src/core/lib/extension.php | 45 | | rex_extension::registerPoint | redaxo/src/addons/structure/functions/function_rex_url.php | 39 | | rex_getUrl | redaxo/src/addons/d2u_machinery/lib/machine.php | 2062 | | Machine->getURL | redaxo/src/addons/d2u_machinery/lib/machine.php | 953 | | Machine->delete | redaxo/src/addons/d2u_machinery/pages/machine.php | 241 | | include | redaxo/src/core/lib/packages/package.php | 228 | | rex_package->includeFile | redaxo/src/core/lib/be/controller.php | 474 | | rex_be_controller::includePath | redaxo/src/core/lib/be/controller.php | 430 | | rex_be_controller::includeCurrentPageSubPath | redaxo/src/addons/d2u_machinery/pages/index.php | 8 | | include | redaxo/src/core/lib/packages/package.php | 228 | | rex_package->includeFile | redaxo/src/core/lib/be/controller.php | 474 | | rex_be_controller::includePath | redaxo/src/core/lib/be/controller.php | 413 | | rex_be_controller::includeCurrentPage | redaxo/src/core/backend.php | 215 | | require | redaxo/src/core/boot.php | 135 | | require | redaxo/index.php | 9 |
System report (REDAXO 5.8.1, PHP 7.3.11-nmm1) | REDAXO | | | ------------: | :--------- | | Version | 5.8.1 | | PHP | | | ------------: | :---------- | | Version | 7.3.11-nmm1 | | OPcache | no | | Xdebug | no | | Database | | | ------------: | :--------------------------- | | Version | 5.6.44-nmm1-log | | Character set | utf8mb4 (utf8mb4_general_ci) | | Server | | | ------------: | :--------- | | OS | Linux | | SAPI | fpm-fcgi | | Webserver | Apache | | Request | | | ------------: | :----------- | | Browser | Firefox/72.0 | | Protocol | HTTP/1.1 | | HTTPS | yes | | Packages | | | -----------------------------------------------: | :---------- | | accessdenied | 1.0.6 | | be_style | 2.8.1 | | be_style/customizer | 2.8.0 | | be_style/redaxo | 2.8.1 | | bloecks | 2.1.1 | | bloecks/status | 2.1.1 | | cookie_consent | 3.0.0-beta3 | | cronjob | 2.5.0 | | d2u_address | 1.1.2 | | d2u_helper | 1.6.1 | | d2u_helper/translation_helper | | | d2u_history | 1.0.0 | | d2u_jobs | 1.1.0 | | d2u_jobs/hr4you_import | 1.1.0 | | d2u_linkbox | 1.2.3 | | d2u_machinery | 1.3.2 | | d2u_machinery/industry_sectors | 1.3.2 | | d2u_machinery/machine_features_extension | 1.3.2 | | d2u_machinery/machine_steel_processing_extension | 1.3.2 | | d2u_machinery/used_machines | 1.3.2 | | d2u_news | 1.1.2 | | d2u_news/fairs | 1.1.2 | | d2u_partner | 1.0 | | d2u_references | 1.0.7 | | d2u_staff | 1.0.3 | | d2u_videos | 1.0.8 | | emailobfuscator | 3.0.0 | | install | 2.5.0 | | media_manager | 2.7.0 | | media_manager_autorewrite | 1.1.0 | | mediapool | 2.6.1 | | metainfo | 2.5.1 | | multinewsletter | 3.2.7 | | phpmailer | 2.6.0 | | sprog | 1.2.0 | | structure | 2.8.1 | | structure/content | 2.8.1 | | tinymce4 | 1.2.1 | | uploader | 2.0.5 | | url | 2.0.0-beta3 | | users | 2.5.3 | | ycom | 4.0 | | ycom/auth | 4.0 | | ycom/docs | 4.0 | | ycom/group | 4.0 | | ycom/media_auth | 4.0 | | yform | 3.3.1 | | yform/docs | 3.3.1 | | yform/email | 3.3.1 | | yform/manager | 3.3.1 | | yrewrite | 2.6 | | yrewrite_scheme | 3.1.1 |
tbaddade commented 4 years ago

Der PHP Code ist falsch oder hier ein Schreibfehler?

TobiasKrais commented 4 years ago

Oops. Hier der Originalcode: https://github.com/TobiasKrais/d2u_machinery/blob/dae7fd39d1eba0bd0972577d2931c8aa769a63a5/lib/machine.php#L2061

TobiasKrais commented 4 years ago

Wo müsste ich ansetzen um diesen Bug zu lösen? Ich habe leider nicht den geringsten Schimmer, obwohl ich das Addon ja schon ein wenig kenne.

tbaddade commented 4 years ago

Hängst du dich an diesem EP? https://github.com/tbaddade/redaxo_url/blob/master/lib/Url/Profile.php#L379

TobiasKrais commented 4 years ago

Ja, auf dieser Installation ist das so.

tbaddade commented 4 years ago

Dann ist dein Rückgabewert keine Instanz von Url\Url.

Nebenbei würde ich hier https://github.com/TobiasKrais/d2u_machinery/blob/dae7fd39d1eba0bd0972577d2931c8aa769a63a5/lib/machine.php#L2061

auf die Parameter article_id und clang_id verzichten. Das war noch in der 1er Version so.

TobiasKrais commented 4 years ago

Ja, ich weiß. Das hast du mir schon mal geschrieben. Mein Addon funktioniert mit Version 1 und 2 des Addons. Solange die 2er noch nicht final ist lass ich es noch drin. Danke für den Hinweis!

tbaddade commented 4 years ago

Dann ist dein Rückgabewert keine Instanz von Url\Url.

Konnte dir das weiterhelfen?

TobiasKrais commented 4 years ago

Nicht wirklich. Das Problem ist weitreichender. Angenommen ich habe kein url Addon installiert und möchte per rex_getUrl() einen Parameter an die URL dran hängen, also eine URL wie diese: /blabla/?version=3, dann sieht mein Code so aus: rex_getUrl($id_von_artikel_blabla, $clang_id, ['version' => 3], '&'). Wenn ich nun das url Addon installiert habe, bekomme ich mit dem gleichen Code einen fatal error. Und das sogar dann, wenn der Parameter in keinem Namespace des url Addons vorhanden ist. Sollte nicht wenigstens - wie die Methode es eigentlich vorsieht - der Parameter an die URL angehängt werden. Was denkst du?

tbaddade commented 4 years ago

Ich habe dich bisher so verstanden:

Du hängst dich an diesen URL_PRE_SAVE und irgendwann wird dadurch diese Zeile angestoßen. Die Rückgabe des EPs muss aber eben eine Instanz von Url sein was bei dir nicht der Fall ist.

Angenommen ich habe kein url Addon installiert

Dann dürfte die Zeile eigentlich nicht erreichbar sein, da der EP URL_PRE_SAVE nicht vorhanden ist wo dich normalerweise andockst.

Ich weiß nicht wirklich was ich jetzt hier machen soll. Für mich müsste das für mein Verständnis in deinem AddOn geklärt werden.

TobiasKrais commented 4 years ago

Ah, ich verstehe. Das stimmt. Der Fehler wird dann behoben.

Es handelt sich um dieses return Statement: https://github.com/TobiasKrais/d2u_machinery/blob/dae7fd39d1eba0bd0972577d2931c8aa769a63a5/boot.php#L214. Was sollte ich zurückgeben? Wenn ich eine URL zurück gebe wird ein Duplikat des Eintrags, bzw. eine zweite URL für die gleichen IDs erstellt.

tbaddade commented 4 years ago

Du müsstest das Objekt zurückgeben, welches dem EP übergeben wurde. Doppelt sollte nichts in der DB landen, oder nimmst du selbst Einträge vor?

TobiasKrais commented 4 years ago

Ja, das löst das Problem. Früher hat es nur auf diese Art und Weise funktioniert um Duplikate zu vermeiden. Offensichtlich hast du im Addon etwas verbesserst. Danke!