Закрыто Баг | Изменение аватарки

Добро пожаловать!

Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.

Зарегистрироваться!
Статус
В этой теме нельзя размещать новые ответы.
Профессионал
Регистрация
30 Ноя 2024
Сообщения
1,074
Приветствую!
Суть проблемы: решая изменить свою аватарку не из моего аккаунта, а из "окошечка на главной" я нажимаю на "изменить"(1) выбираю нужную фотку и нажимаю отправить(2) она добавляется и показывает как будет выглядеть(3), НО нажимая на крестик, то она должна сбросится и вернутся моя прежняя ава, но этого не происходит и остаётся новая моя выбранная фотка(4).
1740415332526.jpg
1740415353969.jpg
upload_2025_02_24_19_45_01_425.jpg
upload_2025_02_24_19_47_12_469.jpg
 
Последнее редактирование:
Снова в деле...
Активный
Регистрация
12 Фев 2025
Сообщения
241
Не баг, окошко нужно для изменения положения аватарки. А загрузка аватарки не подтверждается по скрипту форума
 
this the life that everydoby ask for
Активный
Регистрация
2 Ноя 2024
Сообщения
2,082
Приветствую!
Суть проблемы: решая изменить свою аватарку не из моего аккаунта, а из "окошечка на главной" я нажимаю на "изменить"(1) выбираю нужную фотку и нажимаю отправить(2) она добавляется и показывает как будет выглядеть(3), НО нажимая на крестик, то она должна сбросится и вернутся моя прежняя ава, но этого не происходит и остаётся новая моя выбранная фотка(4).
Нужно нажать ОК потом
 
𝚖𝚘𝚛𝚜 𝚌𝚎𝚛𝚝𝚊, 𝚑𝚘𝚛𝚊 𝚒𝚗𝚌𝚎𝚛𝚝𝚊.
Команда форума
Администратор
Регистрация
21 Янв 2023
Сообщения
1,346
Команда форума
Модератор
Регистрация
4 Ноя 2024
Сообщения
1,021
Приветствую!
Суть проблемы: решая изменить свою аватарку не из моего аккаунта, а из "окошечка на главной" я нажимаю на "изменить"(1) выбираю нужную фотку и нажимаю отправить(2) она добавляется и показывает как будет выглядеть(3), НО нажимая на крестик, то она должна сбросится и вернутся моя прежняя ава, но этого не происходит и остаётся новая моя выбранная фотка(4).
Достаточно посмотреть, как происходит смена аватара в файлах движка
PHP:
    public function updateAvatar()
    {
        if (!$this->fileName)
        {
            return $this->throwException(new \LogicException("No source file for avatar set"));
        }
        if (!$this->user->exists())
        {
            return $this->throwException(new \LogicException("User does not exist, cannot update avatar"));
        }

        $imageManager = $this->app->imageManager();

        $outputFiles = [];
        $baseFile = $this->fileName;

        $origSize = $this->sizeMap['o'];
        $shortSide = min($this->width, $this->height);

        if ($shortSide > $origSize)
        {
            $image = $imageManager->imageFromFile($this->fileName);
            if (!$image)
            {
                return false;
            }

            $image->resizeShortEdge($origSize);

            $newTempFile = \XF\Util\File::getTempFile();
            if ($newTempFile && $image->save($newTempFile, null, 95))
            {
                $outputFiles['o'] = $newTempFile;
                $baseFile = $newTempFile;
                $width = $image->getWidth();
                $height = $image->getHeight();
            }
            else
            {
                return $this->throwException(new \RuntimeException("Failed to save image to temporary file; check internal_data/data permissions"));
            }

            unset($image);
        }
        else
        {
            $outputFiles['o'] = $this->fileName;
            $width = $this->width;
            $height = $this->height;
        }

        $crop = [
            'm' => [0, 0]
        ];

        foreach ($this->sizeMap AS $code => $size)
        {
            if (isset($outputFiles[$code]))
            {
                continue;
            }

            $image = $imageManager->imageFromFile($baseFile);
            if (!$image)
            {
                continue;
            }

            $crop[$code] = $this->resizeAvatarImage($image, $size);

            $newTempFile = \XF\Util\File::getTempFile();
            if ($newTempFile && $image->save($newTempFile))
            {
                $outputFiles[$code] = $newTempFile;
            }
            unset($image);
        }

        if (count($outputFiles) != count($this->sizeMap))
        {
            return $this->throwException(new \RuntimeException("Failed to save image to temporary file; image may be corrupt or check internal_data/data permissions"));
        }

        foreach ($outputFiles AS $code => $file)
        {
            $dataFile = $this->user->getAbstractedCustomAvatarPath($code);
            \XF\Util\File::copyFileToAbstractedPath($file, $dataFile);
        }

        $user = $this->user;
        $user->bulkSet([
            'avatar_date' => \XF::$time,
            'avatar_width' => $width,
            'avatar_height' => $height,
            'avatar_highdpi' => ($width >= self::HIGH_DPI_THRESHOLD && $height >= self::HIGH_DPI_THRESHOLD),
            'gravatar' => ''
        ]);

        $profile = $user->getRelationOrDefault('Profile');
        $profile->bulkSet([
            'avatar_crop_x' => $crop['m'][0],
            'avatar_crop_y' => $crop['m'][1]
        ]);
        $user->addCascadedSave($profile);

        if ($this->logChange == false)
        {
            $user->getBehavior('XF:ChangeLoggable')->setOption('enabled', false);
        }

        $user->save();

        if ($this->logIp)
        {
            $ip = ($this->logIp === true ? $this->app->request()->getIp() : $this->logIp);
            $this->writeIpLog('update', $ip);
        }

        return true;
    }
В коде нет предпросмотра, либо проверки, требующей от пользователя подтвердить изменения. Как только был выбран файл и он прошел проверку, то он сразу обрабатывается, записывается в файловую систему, потом данные обновляются в базе.
PHP:
$user->save();
Думаю, что лучше было это написать на официальном форуме XenForo, о предложение добавить подтверждения перед установкой аватара. Если они это одобрят, то добавят, может быть, на 2.4, либо на 2.3
 
Заблокированный
Регистрация
26 Апр 2022
Сообщения
852
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки. Мы не несем ответственности за действия пользователя вне форума.
Если они это одобрят, то добавят, может быть, на 2.4, либо на 2.3
а кто обновляться то будет на эти версии? 2.3 по прежнему не пользуется спросом, 2.4 уж тем более не будет.
да и предложить им, одобрят допустим, но введут это минимум через 3 месяца.
 
Команда форума
Модератор
Регистрация
4 Ноя 2024
Сообщения
1,021
а кто обновляться то будет на эти версии? 2.3 по прежнему не пользуется спросом, 2.4 уж тем более не будет.
да и предложить им, одобрят допустим, но введут это минимум через 3 месяца.
OFFTOP

Сейчас большинство форумов остается на XenForo 2.2, потому что 2.3 не особо прижились, прошло +- год. Многие опасаются обновляться из-за возможных проблем с несовместимостью аддонов и стилей.

А про 2.4 вообще пока рано говорить, если эту версию до конца обновят, протестируют и выпустят,
форумы будут обновляться на неё очень медленно. Обычно админы ждут пару месяцев после выхода новой версии, чтобы убедиться, что она стабильна, а потом ещё столько же, пока разработчики обновят свои аддоны.

 
Профессионал
Регистрация
30 Ноя 2024
Сообщения
1,074
Достаточно посмотреть, как происходит смена аватара в файлах движка
PHP:
    public function updateAvatar()
    {
        if (!$this->fileName)
        {
            return $this->throwException(new \LogicException("No source file for avatar set"));
        }
        if (!$this->user->exists())
        {
            return $this->throwException(new \LogicException("User does not exist, cannot update avatar"));
        }

        $imageManager = $this->app->imageManager();

        $outputFiles = [];
        $baseFile = $this->fileName;

        $origSize = $this->sizeMap['o'];
        $shortSide = min($this->width, $this->height);

        if ($shortSide > $origSize)
        {
            $image = $imageManager->imageFromFile($this->fileName);
            if (!$image)
            {
                return false;
            }

            $image->resizeShortEdge($origSize);

            $newTempFile = \XF\Util\File::getTempFile();
            if ($newTempFile && $image->save($newTempFile, null, 95))
            {
                $outputFiles['o'] = $newTempFile;
                $baseFile = $newTempFile;
                $width = $image->getWidth();
                $height = $image->getHeight();
            }
            else
            {
                return $this->throwException(new \RuntimeException("Failed to save image to temporary file; check internal_data/data permissions"));
            }

            unset($image);
        }
        else
        {
            $outputFiles['o'] = $this->fileName;
            $width = $this->width;
            $height = $this->height;
        }

        $crop = [
            'm' => [0, 0]
        ];

        foreach ($this->sizeMap AS $code => $size)
        {
            if (isset($outputFiles[$code]))
            {
                continue;
            }

            $image = $imageManager->imageFromFile($baseFile);
            if (!$image)
            {
                continue;
            }

            $crop[$code] = $this->resizeAvatarImage($image, $size);

            $newTempFile = \XF\Util\File::getTempFile();
            if ($newTempFile && $image->save($newTempFile))
            {
                $outputFiles[$code] = $newTempFile;
            }
            unset($image);
        }

        if (count($outputFiles) != count($this->sizeMap))
        {
            return $this->throwException(new \RuntimeException("Failed to save image to temporary file; image may be corrupt or check internal_data/data permissions"));
        }

        foreach ($outputFiles AS $code => $file)
        {
            $dataFile = $this->user->getAbstractedCustomAvatarPath($code);
            \XF\Util\File::copyFileToAbstractedPath($file, $dataFile);
        }

        $user = $this->user;
        $user->bulkSet([
            'avatar_date' => \XF::$time,
            'avatar_width' => $width,
            'avatar_height' => $height,
            'avatar_highdpi' => ($width >= self::HIGH_DPI_THRESHOLD && $height >= self::HIGH_DPI_THRESHOLD),
            'gravatar' => ''
        ]);

        $profile = $user->getRelationOrDefault('Profile');
        $profile->bulkSet([
            'avatar_crop_x' => $crop['m'][0],
            'avatar_crop_y' => $crop['m'][1]
        ]);
        $user->addCascadedSave($profile);

        if ($this->logChange == false)
        {
            $user->getBehavior('XF:ChangeLoggable')->setOption('enabled', false);
        }

        $user->save();

        if ($this->logIp)
        {
            $ip = ($this->logIp === true ? $this->app->request()->getIp() : $this->logIp);
            $this->writeIpLog('update', $ip);
        }

        return true;
    }
В коде нет предпросмотра, либо проверки, требующей от пользователя подтвердить изменения. Как только был выбран файл и он прошел проверку, то он сразу обрабатывается, записывается в файловую систему, потом данные обновляются в базе.
PHP:
$user->save();
Думаю, что лучше было это написать на официальном форуме XenForo, о предложение добавить подтверждения перед установкой аватара. Если они это одобрят, то добавят, может быть, на 2.4, либо на 2.3
@Kolpak спасибо за объяснение.
Тема закрыта.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху