Username für Kunden-Login einrichten

Wir möchten den Kunden eines mit Magento 2 implementierten Onlineshops den Login mit einem Usernamen ermöglichen (zusätzlich zu dem regulären Login mit E-Mail-Adresse). Hierzu gab es schon in Magento 1 eine schöne Extension "Diglin Username". Diese ist für Magento 2 aktuell im Beta-Stadium, aber recht gut zu verwenden. Hier zeigen wir Euch, wie:

 

  Schritt 1)

 

Download der Quelldateien unter https://github.com/diglin/Diglin_Username2 und Kopie nach

 

app/code/Diglin/Username/

 

Schritt 2)

 

In der Konsole:

 

bin/magento module:enable Diglin_Username

 

und

 

bin/magento setup:upgrade

 

Schritt 3)

 

Falls keine Fehlermeldung in der Kundenverwaltung bzw. im Frontend bei Neuregistrierung etc. erscheint: Fertig.

 

Wenn die Fehlermeldung erscheint:

 

Exception #0 (InvalidArgumentException): Unable to unserialize value.

 

Nicht fertig. Wir lösen diese Problematik durch die Ergänzung der folgenden Zeile in der Datei

 

app/etc/di.xml

 

die da lautet:

 

<preference for="Magento\Framework\Serialize\Serializer\Json" type="Diglin\Username\Serialize\Serializer\Json" />

 

mit der wir dann die Möglichkeit haben, die betreffenden Funktionen anzupassen. Dies geschieht durch die Ergänzung in der Datei

 

app\code\Diglin\Username\Serialize\Serializer\Json.php

 

die wir zu diesem Zwecke erstellen mit folgendem Inhalt:

 

<?php

namespace Diglin\Username\Serialize\Serializer;

class Json extends \Magento\Framework\Serialize\Serializer\Json

{

    public function unserialize($string)

    {

      if($this->is_serialized($string))

        {

            $string = $this->serialize($string);

        }

        $result = json_decode($string, true);

        if (json_last_error() !== JSON_ERROR_NONE) {

             throw new \InvalidArgumentException('Unable to unserialize value.');

        }

        return $result;

    }

    function is_serialized($value, &$result = null)

    {

    // Bit of a give away this one

        if (!is_string($value))

        {

            return false;

        }

        // Serialized false, return true. unserialize() returns false on an

        // invalid string or it could return false if the string is serialized

        // false, eliminate that possibility.

        if ($value === 'b:0;')

        {

            $result = false;

            return true;

        }

        $length = strlen($value);

        $end    = '';

        switch ($value[0])

        {

            case 's':

                if ($value[$length - 2] !== '"')

                {

                    return false;

                }

            case 'b':

            case 'i':

            case 'd':

                // This looks odd but it is quicker than isset()ing

                $end .= ';';

            case 'a':

            case 'O':

                $end .= '}';

                if ($value[1] !== ':')

                {

                    return false;

                }

                switch ($value[2])

                {

                    case 0:

                    case 1:

                    case 2:

                    case 3:

                    case 4:

                    case 5:

                    case 6:

                    case 7:

                    case 8:

                    case 9:

                        break;

                    default:

                        return false;

                }

            case 'N':

                $end .= ';';

                if ($value[$length - 1] !== $end[0])

                {

                    return false;

                }

                break;

            default:

                return false;

        }

        if (($result = @unserialize($value)) === false)

        {

            $result = null;

            return false;

        }

        return true;

    }

}

 

Damit funktioniert dann alles wunderbar. Gesehen unter https://magento.stackexchange.com/questions/194010/magento-2-2-unable-to-unserialize-value. Getestet in Magento CE 2.2.5.