THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline

#1 [PR 3194] Mise à jour image

(10-03-2024 11:34:44)


Hello...

Dans un module, je permet d'uploader une image à la place d'une image déjà existante.

J'ai mis :

$fileBeingUploaded = $data['file'];

if(null !== $fileBeingUploaded){
	
	$fileCreateOrUpdateEvent = new FileCreateOrUpdateEvent(1);
	$fileCreateOrUpdateEvent->setModel($masonryBrick);
	$fileCreateOrUpdateEvent->setUploadedFile($fileBeingUploaded);

	$eventDispatcher->dispatch(
		$fileCreateOrUpdateEvent,
		TheliaEvents::IMAGE_UPDATE
	);
	
}

qui déclenche dans BaseCachedFile.php, la fonction suivante

public function updateFile(FileCreateOrUpdateEvent $event): void
{
	// Copy and save file
	if ($event->getUploadedFile()) {
		// Remove old picture file from file storage
		$url = $event->getModel()->getUploadDir().'/'.$event->getOldModel()->getFile();
		unlink(str_replace('..', '', $url));

		$newUploadedFile = $this->fileManager->copyUploadedFile($event->getModel(), $event->getUploadedFile());
		$event->setUploadedFile($newUploadedFile);
	}

	// Update image modifications
	$event->getModel()->save();

	$event->setModel($event->getModel());
}

Mais ça me sort une erreur :

Call to a member function getFile() on array

En effet, getOldModel() retourne un array vide...

Last edited by Elyos (02-05-2024 18:27:44)


Aide les autres, ils t'aideront en retour.

Offline


Okay !

Il faut en fait clone le model et faire un setOldModel.


Aide les autres, ils t'aideront en retour.

Offline


Mais ça ne supprime pas le symlink (ou autres?) dans web/cache/ par contre...
Juste l'original dans local/media/

Last edited by Elyos (10-03-2024 11:52:58)


Aide les autres, ils t'aideront en retour.

Offline


Fausse joie.
J'obtiens

Failed to update model after copy of uploaded file

dans mes logs...

Last edited by Elyos (11-03-2024 15:18:50)


Aide les autres, ils t'aideront en retour.

Offline


Je pense que le problème vient de cette fonction dans FileManager :

    public function copyUploadedFile(FileModelInterface $model, UploadedFile $uploadedFile)
    {
        $newUploadedFile = null;

        if ($uploadedFile !== null) {
            $fileSystem = new Filesystem();

            $directory = $model->getUploadDir();

            if (!$fileSystem->exists($directory)) {
                $fileSystem->mkdir($directory);
            }

            $fileName = $this->renameFile($model->getId(), $uploadedFile);

            $fileSystem->rename($uploadedFile->getPathname(), $directory.DS.$fileName);
            $newUploadedFile = new UploadedFile($directory.DS.$fileName, $fileName);
            $model->setFile($fileName);

            if (!$model->save()) {
                throw new ImageException(
                    sprintf(
                        'Failed to update model after copy of uploaded file %s to %s',
                        $uploadedFile,
                        $model->getFile()
                    )
                );
            }
        }

        return $newUploadedFile;
    }
$model->save()

retourne 0 car rien n'est modifié si on upload un fichier avec le même non...

si je fais un upload avec un fichier dont le nom est différent, ça marche... pas d'erreur....

donc je ne suis pas sûr que cette condition de vérification soit judicieuse...


Aide les autres, ils t'aideront en retour.

Offline


Finalement j'ai laissé cette condition.

Mais en amont j'ai modifié le core dans le fichier Thelia/Action/BaseCachedFile.php

public function updateFile(FileCreateOrUpdateEvent $event): void
    {
        // Copy and save file
        if ($event->getUploadedFile()) {
            // Remove old picture file from file storage
            $url = $event->getModel()->getUploadDir().'/'.$event->getOldModel()->getFile();
            unlink(str_replace('..', '', $url));
            $event->getModel()->setFile('')->save(); //ajout

            $newUploadedFile = $this->fileManager->copyUploadedFile($event->getModel(), $event->getUploadedFile());
            $event->setUploadedFile($newUploadedFile);
        }

        // Update image modifications
        $event->getModel()->save();

        $event->setModel($event->getModel());
    }

J'ai fait un nouveau commit

Last edited by Elyos (11-03-2024 16:24:05)


Aide les autres, ils t'aideront en retour.