Импорт администраторов Magento1 в Magento2 - PullRequest
0 голосов
/ 24 января 2019

Я выполнил миграцию данных с помощью инструмента переноса данных из magento 1.9.x в 2.2.4, но он не импортирует пользователей-администраторов, как указано в документации, и нам нужно вручную скопировать пользователей-администраторов.

Я просто скопировал пользователей из magento1DB.admin_user в таблицу magento2DB.admin_user. Я вижу, что пользователи теперь появляются в бэкенде Magento2, но когда я пытаюсь редактировать любого администратора, он выдает исключение.

Exception #0 (InvalidArgumentException): Unable to unserialize value

Кроме того, я не могу войти под учетной записью администратора Magento1 в панели администрирования Magento2.

Не можете найти помощь, у кого-нибудь есть идея?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Изменение в основном файле не является хорошей идеей, поэтому я бы рекомендовал просто идентифицировать таблицу, просмотрев исключение, а затем описать эту таблицу, чтобы увидеть, какое поле может содержать поисковое значение, найти его по запросу select, как только вы идентифицируете сериализованное поле в преобразование таблицы в json и обновление в таблицу. Вот код для преобразования сериализованных данных в данные json:

// Pull serialized data 
$serializeddata = 'a:2:{i:6517;a:2:{i:0;a:5:{s:10:"first_name";s:5:"Roger";s:9:"last_name";s:6:"Rabbit";s:5:"email";s:19:"roger@test.org";s:7:"is_lead";b:1;s:12:"is_cancelled";b:0;}i:1;a:5:{s:10:"first_name";s:7:"Jessica";s:9:"last_name";s:6:"Rabbit";s:5:"email";s:21:"Jessica@test.org";s:7:"is_lead";b:0;s:12:"is_cancelled";b:0;}}i:6518;a:2:{i:0;a:5:{s:10:"first_name";s:6:"Mickey";s:9:"last_name";s:5:"Mouse";s:5:"email";s:20:"mickey@test.org";s:7:"is_lead";b:0;s:12:"is_cancelled";b:0;}i:1;a:5:{s:10:"first_name";s:6:"Donald";s:9:"last_name";s:4:"Duck";s:5:"email";s:20:"donald@test.org";s:7:"is_lead";b:0;s:12:"is_cancelled";b:0;}}}';

// Unserialize it into a standard array
$array = unserialize($serializeddata);

$jsonData = json_encode($array);

// Print Array
echo $jsonData;
0 голосов
/ 28 февраля 2019

Проблема в /vendor/magento/framework/Serialize/Serializer/Json.php есть функция unserialize ($ string)

Есть обходной путь - вы можете проверить, если строкасериализуется, а затем использовать serialize($string).Измените десериализацию на:

public function unserialize($string)
{
    /* Workaround: serialize first if is serialized */
    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;
}
...