Projekt

Allgemein

Aktionen

GX-Bug #67138

geschlossen

Das hinzufügen von unterschiedlichen Artikeln in den Warenkorb und Merkzettel führt teilweise zur Hinzufügung des immer gleichen Artikels

Von Wilken Haase vor fast 5 Jahren hinzugefügt. Vor fast 5 Jahren aktualisiert.

Status:
Erledigt
Priorität:
Sofort
Zugewiesen an:
Ronald Loyko
Kategorie:
Core
Zielversion:
% erledigt:

0%

Geschätzter Aufwand:
Steps to reproduce:
Betroffene Versionen:
4.1.1.1
Release Notes Langtext:

Das Hinzufügen unterschiedlicher Artikel zum Warenkorb und Merkzettel funktioniert wieder zuverlässig


Beschreibung

Das Problem tritt vor allem bei einfachen Artikeln ohne Eigenschaften oder Attributen auf


Checkliste 0/0


Zugehörige Tickets

Beziehung mit GX-Entwicklung - GX-Abgewiesen #67130: Artikel ohne Artikelbild verursachen viele Probleme im MerkzettelAbgewiesenMoritz Bunjes

Aktionen
Aktionen #1

Von Timo Backhaus vor fast 5 Jahren aktualisiert

public function sanitizeProductidentifier(string $identifier): string
    {                                
        $propertyPart                = strrchr($identifier, 'x');
        $identifierWithoutPropertyId = $propertyPart ? substr($identifier, 0, strlen($propertyPart) * -1) : $identifier;
        $identifierParts             = str_replace('}', '{', $identifierWithoutPropertyId);
        $identifierParts             = explode('{', $identifierParts);

        foreach ($this->contents as $contentIdentifier => $value) {
            $matches                            = 0;
            $contentIdentifierPropertyPart      = strrchr($contentIdentifier, 'x');
            $contentIdentifierWithoutPropertyId = $contentIdentifierPropertyPart ? substr($contentIdentifier,
                                                                                          0,
                                                                                          strlen($contentIdentifierPropertyPart)
                                                                                          * -1) : $contentIdentifier;
            $contentIdentifierParts             = str_replace('}', '{', $contentIdentifierWithoutPropertyId);
            $contentIdentifierParts             = explode('{', $contentIdentifierParts);

            if ($propertyPart !== false && $contentIdentifierPropertyPart !== false && $propertyPart !== $contentIdentifierPropertyPart) {
                continue;
            }

            if ($contentIdentifierParts[0] === $identifierParts[0]) {
                for ($i = 1; $i < count($contentIdentifierParts); $i += 2) {
                    for ($j = 1; $j < count($identifierParts); $j += 2) {
                        if ($contentIdentifierParts[$i] === $identifierParts[$j]
                            && $contentIdentifierParts[$i + 1] === $identifierParts[$j + 1]) {
                            $matches++;
                        }
                    }
                }
            }

            if ($matches > 0 && $matches === (count($contentIdentifierParts) - 1) / 2) {   
                return $contentIdentifier;
            }
        }

        return $identifier;
    }

2 Korrekturen:

if ($propertyPart !== false && $contentIdentifierPropertyPart !== false && $propertyPart !== $contentIdentifierPropertyPart) {

Die Prüfung auf Eigenschaften war fehlerhaft. Die Inhaltsprüfung darf nur erfolgen, wenn beide Vergleichsartikel Eigenschaften besitzen ( !== false)

2.

if ($matches > 0 && $matches === (count($contentIdentifierParts) - 1) / 2) {   

$matches ist standardmäßig 0 und wird bei jedem Attributtreffer hochgezählt. Die Rückgabe einer gefundenen Attributartikelnummer darf nur erfolgen, wenn $matches größer 0 ist. Beim aktuellen Verhalten ist die Bedingung bei Artikeln ohne Attribute immer erfüllt, wodurch der erste Artikel aus dem Warenkorb als Treffer erkennt wird.

Aktionen #4

Von Moritz Bunjes vor fast 5 Jahren aktualisiert

Der Lösungsvorschlag von Timo ist ebenso fehlerhaft. Die richtige Korrektur ist im Commit.

Aktionen