<?phpnamespace App\Entity;use App\Entity\Traits\Timestampable;use App\Repository\CapsuleBlockRepository;use Doctrine\ORM\Mapping as ORM;// Bloc pédagogique ordonné d'une Capsule. `type` détermine comment Flutter// (BlockRenderer) et le builder Web l'affichent : text|example|summary// utilisent `content` (texte), image|video|audio|document utilisent// `mediaPath`, activity porte un Activity (quiz/exercice) via la relation// `activity`. `document` = PDF/fichier joint (ex: fiche d'exercices// imprimable) — mis en cache local par le mobile comme les autres médias,// jamais juste ouvert en streaming (voir CapsuleMediaCache côté Flutter).#[ORM\HasLifecycleCallbacks]#[ORM\Entity(repositoryClass: CapsuleBlockRepository::class)]class CapsuleBlock{ use Timestampable; public const TYPE_TEXT = 'text'; public const TYPE_IMAGE = 'image'; public const TYPE_VIDEO = 'video'; public const TYPE_AUDIO = 'audio'; public const TYPE_DOCUMENT = 'document'; public const TYPE_EXAMPLE = 'example'; public const TYPE_SUMMARY = 'summary'; public const TYPE_ACTIVITY = 'activity'; #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; #[ORM\ManyToOne(inversedBy: 'blocks')] #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')] private ?Capsule $capsule = null; #[ORM\Column(length: 20)] private ?string $type = null; #[ORM\Column] private int $position = 0; #[ORM\Column(type: 'text', nullable: true)] private ?string $content = null; #[ORM\Column(length: 255, nullable: true)] private ?string $mediaPath = null; #[ORM\OneToOne(inversedBy: 'block', cascade: ['persist', 'remove'])] #[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')] private ?Activity $activity = null; public function getId(): ?int { return $this->id; } public function getCapsule(): ?Capsule { return $this->capsule; } public function setCapsule(?Capsule $capsule): static { $this->capsule = $capsule; return $this; } public function getType(): ?string { return $this->type; } public function setType(string $type): static { $this->type = $type; return $this; } public function getPosition(): int { return $this->position; } public function setPosition(int $position): static { $this->position = $position; return $this; } public function getContent(): ?string { return $this->content; } public function setContent(?string $content): static { $this->content = $content; return $this; } public function getMediaPath(): ?string { return $this->mediaPath; } public function setMediaPath(?string $mediaPath): static { $this->mediaPath = $mediaPath; return $this; } public function getActivity(): ?Activity { return $this->activity; } public function setActivity(?Activity $activity): static { $this->activity = $activity; return $this; }}