私はすでにEasyAdmin 3を使用しているSymfonyプロジェクトでファイルをアップロードするためにVichUploaderを使っています。
私はすべてを正しく設定しました、しかし私はこのエラーを得ています:
「PixeJointeFile」イメージフィールドは、setUploadDir()メソッドを使用して画像がアップロードされるディレクトリを定義する必要があります。
<?php
namespace App\Entity;
use App\Repository\InventaireRepository;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
My entity
/**
* @ORM\Entity(repositoryClass=InventaireRepository::class)
* @Vich\Uploadable
*/
class Inventaire
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Conducteur::class, inversedBy="inventaires")
*/
private $conducteur;
/**
* @ORM\Column(type="date")
*/
private $dateInventaire;
/**
* @ORM\Column(type="string", length=255)
*/
private $pieceJointe;
/**
* @Vich\UploadableField(mapping="pieceJointe", fileNameProperty="pieceJointe")
*/
private $pieceJointeFile;
/**
* @ORM\Column(type="datetime")
*/
private $updatedAt;
public function __construct()
{
$this->updatedAt = new DateTime();
}
public function getId(): ?int
{
return $this->id;
}
public function getConducteur(): ?Conducteur
{
return $this->conducteur;
}
public function setConducteur(?Conducteur $conducteur): self
{
$this->conducteur = $conducteur;
return $this;
}
public function getDateInventaire(): ?\DateTimeInterface
{
return $this->dateInventaire;
}
public function setDateInventaire(\DateTimeInterface $dateInventaire): self
{
$this->dateInventaire = $dateInventaire;
return $this;
}
public function getPieceJointeFile() {
return $this->pieceJointeFile;
}
public function setPieceJointeFile($pieceJointeFile): void
{
$this->pieceJointeFile = $pieceJointeFile;
if($pieceJointeFile) {
$this->updatedAt = new DateTime();
}
}
public function getPieceJointe() {
return $this->pieceJointe;
}
public function setPieceJointe($pieceJointe):self
{
$this->pieceJointe = $pieceJointe;
return $this;
}
public function getUpdatedAt()
{
return $this->updatedAt;
}
}
_
vichアップローダの設定
vich_uploader:
db_driver: orm
mappings:
pieceJointe:
uri_prefix: /files/pieceJointe
upload_destination: '%kernel.project_dir%/public/files/pieceJointe'
_
そして最後に私のcrudコントローラ
<?php
namespace App\Controller\Admin;
use App\Entity\Inventaire;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ImageField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use Vich\UploaderBundle\Form\Type\VichFileType;
use Vich\UploaderBundle\Form\Type\VichImageType;
class InventaireCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Inventaire::class;
}
public function configureFields(string $pageName): iterable
{
return [
DateField::new('dateInventaire'),
AssociationField::new('conducteur'),
TextField::new('pieceJointeFile')->setFormType(VichFileType::class, [
'delete_label' => 'supprimer?'
])->onlyOnForms(),
ImageField::new('pieceJointe')->setBasePath('/files/pieceJointe')->onlyOnDetail(),
ImageField::new('pieceJointeFile')->setFormType(VichImageType::class)
];
}
public function configureActions(Actions $actions): Actions
{
return $actions
->add(Crud::PAGE_INDEX, Action::DETAIL);
}
}
_
最後に、TextField
を使用するときは、正しく機能するときに明確にしたいと思います。
同じ問題があります。私はバージョン "easycorp/easyadmin-bundle": "3.1.6"のバージョンに戻すことによって解決しました
幸運を!
簡単なフィールドクラスを作成することでこの問題を解決できます。
<?PHP
namespace App\Field;
use App\Form\MetaDataType;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface;
use EasyCorp\Bundle\EasyAdminBundle\Field\FieldTrait;
use Vich\UploaderBundle\Form\Type\VichImageType;
final class VichImageField implements FieldInterface
{
use FieldTrait;
public static function new(string $propertyName, ?string $label = 'Image'): self
{
return (new self())
->setProperty($propertyName)
->setLabel($label)
// this template is used in 'index' and 'detail' pages
->setTemplatePath('admin/field/vich_image.html.twig')
// this is used in 'edit' and 'new' pages to edit the field contents
// you can use your own form types too
->setFormType(VichImageType::class)
->addCssClass('field-vich-image')
;
}
}
_
それからあなたのCrud Controllersで使用してください
use App\Field\VichImageField;
...
yield VichImageField::new('image')->hideOnForm();
yield VichImageField::new('imageFile')->onlyOnForms();
_
ここで2回image
フィールドをレンダリングする必要があるため、フォーム上のimageFile