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.