Neu In JTL-Shop 5.8.2 tritt beim Bearbeiten einer per „In Linkgruppe kopieren“ erzeugten Referenzseite reproduzierbar ein HTTP-500-Fehler auf

TDS2018

Sehr aktives Mitglied
25. Oktober 2018
639
103
Fehlerbeschreibung:
In JTL-Shop 5.8.2 tritt beim Bearbeiten einer per „In Linkgruppe kopieren“ erzeugten Referenzseite reproduzierbar ein HTTP-500-Fehler auf.

Ausgangssituation:
  • Es existiert eine normale CMS-Seite, z. B. kLink 378.
  • Diese Seite wird über „In Linkgruppe kopieren“ in eine weitere Linkgruppe kopiert.
  • JTL legt dafür korrekt einen Referenz-Link an, z. B.:
    • kLink = 469
    • nLinkart = 36
    • reference = 378
  • Der Referenz-Link besitzt dabei keine eigenen Einträge in tlinksprache.
Sobald man im Backend diese Referenz über „Bearbeiten“ öffnet, schlägt der Request

POST /admin/links
mit HTTP 500 fehl.

Im Apache-/PHP-Log erscheint dabei mehrfach:

PHP Warning: Attempt to read property "cISO" on null
in /var/www/jtlshop/includes/src/Link/Link.php on line 538
Die betroffene Stelle ist:

public function getURL(?int $idx = null): string
{
return $this->urls[$idx ?? $this->currentLanguageID]
?? '/?s=' . $this->getID()
. '&lang=' . Shop::Lang()->getIsoFromLangID($idx ?? $this->currentLanguageID)->cISO;
}
Ursache:
Die Referenz wird in Link::load() zunächst mit ihrer eigenen kLink geladen:

$links = $this->fetchLinkData($id);
fetchLinkData() verwendet jedoch einen INNER JOIN auf tlinksprache:

JOIN tlinksprache loc
ON tlink.kLink = loc.kLink
Da der Referenz-Link selbst keine Sprachdatensätze besitzt, kann er auf diesem Weg nicht vollständig geladen werden.

Erst danach versucht der Code, über das Feld reference auf die eigentliche Seite aufzulösen. Zu diesem Zeitpunkt ist es bereits zu spät.

Auswirkung:
  • Referenzlinks können im Backend nicht bearbeitet werden.
  • Der Request endet mit HTTP 500.
  • Die Referenz selbst kann im Frontend dennoch funktionieren.
  • Das Problem ist unabhängig vom verwendeten Child-Template.
  • Die Sprachkonfiguration des Shops war korrekt (ger, eng, fre).
Workaround / funktionierende Korrektur:
Die Referenz muss vor dem eigentlichen Laden der Sprach-/Linkdaten aufgelöst werden.

Statt:
$this->id = $id;
$links = $this->fetchLinkData($id);
funktioniert folgende Reihenfolge:

$this->id = $id;

$realID = $this->getRealID($id);
$links = $this->fetchLinkData($realID);

if (\count($links) === 0) {
throw new InvalidArgumentException(
'Provided link id ' . $this->id . ' not found.'
);
}

if ($realID !== $id) {
foreach ($links as $link) {
$link->reference = $realID;
}
}
Danach lässt sich die Referenzseite im Backend ohne HTTP 500 bearbeiten.

Getestet mit:
  • JTL-Shop 5.8.2
  • Referenz-Linktyp nLinkart = 36
  • Mehrsprachiger Shop: Deutsch, Englisch, Französisch
 

Ähnliche Themen