diff options
| author | polo <ordipolo@gmx.fr> | 2025-10-14 17:24:28 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2025-10-14 17:24:28 +0200 |
| commit | 50a54e1a9682652d3dcea4fae117d7f456f77e19 (patch) | |
| tree | af72b44f8e833bb47f563f6e6806deb8c9c2364a /src | |
| parent | 596ce6f78e37c901d9b4ed464918b0294ba8dd2a (diff) | |
| download | cms-50a54e1a9682652d3dcea4fae117d7f456f77e19.tar.gz cms-50a54e1a9682652d3dcea4fae117d7f456f77e19.tar.bz2 cms-50a54e1a9682652d3dcea4fae117d7f456f77e19.zip | |
nouvelle entité Asset, assets séparés de Image
Diffstat (limited to 'src')
| -rw-r--r-- | src/model/entities/Asset.php | 88 | ||||
| -rw-r--r-- | src/model/entities/Image.php | 3 | ||||
| -rw-r--r-- | src/model/entities/NodeData.php | 20 | ||||
| -rw-r--r-- | src/view/HeadBuilder.php | 8 | ||||
| -rw-r--r-- | src/view/HeaderBuilder.php | 25 |
5 files changed, 119 insertions, 25 deletions
diff --git a/src/model/entities/Asset.php b/src/model/entities/Asset.php new file mode 100644 index 0000000..df8c98b --- /dev/null +++ b/src/model/entities/Asset.php | |||
| @@ -0,0 +1,88 @@ | |||
| 1 | <?php | ||
| 2 | // src/model/entities/Asset.php | ||
| 3 | |||
| 4 | declare(strict_types=1); | ||
| 5 | |||
| 6 | namespace App\Entity; | ||
| 7 | |||
| 8 | use Doctrine\ORM\Mapping as ORM; | ||
| 9 | |||
| 10 | #[ORM\Entity] | ||
| 11 | #[ORM\Table(name: TABLE_PREFIX . "asset")] | ||
| 12 | class Asset | ||
| 13 | { | ||
| 14 | #[ORM\Id] | ||
| 15 | #[ORM\GeneratedValue] | ||
| 16 | #[ORM\Column(type: "integer")] | ||
| 17 | private int $id_asset; | ||
| 18 | |||
| 19 | #[ORM\Column(type: "string", length: 255, unique: true)] // nom d'image UNIQUE | ||
| 20 | private string $file_name; | ||
| 21 | |||
| 22 | // choisir un répertoire du genre /var/www/html/uploads/ de préférence hors de /src | ||
| 23 | #[ORM\Column(type: "string", length: 255, unique: true, nullable: true)] | ||
| 24 | private ?string $file_path; | ||
| 25 | |||
| 26 | #[ORM\Column(type: "string", length: 255, unique: true, nullable: true)] | ||
| 27 | private ?string $file_path_mini; | ||
| 28 | |||
| 29 | #[ORM\Column(type: "string", length: 255, nullable: true)] | ||
| 30 | private string $mime_type; // image/jpeg, image/png, etc | ||
| 31 | |||
| 32 | #[ORM\Column(type: "string", length: 255, nullable: true)] | ||
| 33 | private string $alt; // texte alternatif | ||
| 34 | |||
| 35 | // autre champs optionnels: file_size, date (default current timestamp) | ||
| 36 | |||
| 37 | /* étapes au téléchargement: | ||
| 38 | => Validation du type de fichier : On vérifie que le fichier est bien une image en utilisant le type MIME. On peut aussi vérifier la taille du fichier. | ||
| 39 | => Création d'un répertoire structuré : On génère un chemin dynamique basé sur la date (uploads/2024/12/24/) pour organiser les images. | ||
| 40 | => Génération d'un nom de fichier unique : On utilise uniqid() pour générer un nom unique et éviter les conflits de nom. | ||
| 41 | => Déplacement du fichier sur le serveur : Le fichier est déplacé depuis son emplacement temporaire vers le répertoire uploads/. | ||
| 42 | => Enregistrement dans la base de données : On enregistre les informations de l'image dans la base de données. */ | ||
| 43 | |||
| 44 | #[ORM\ManyToMany(targetEntity: NodeData::class, mappedBy: "assets")] | ||
| 45 | private $node_data; | ||
| 46 | |||
| 47 | public function __construct(string $name, ?string $path, ?string $path_mini, string $mime_type, string $alt) | ||
| 48 | { | ||
| 49 | $this->file_name = $name; | ||
| 50 | $this->file_path = $path; | ||
| 51 | $this->file_path_mini = $path_mini; | ||
| 52 | $this->mime_type = $mime_type; | ||
| 53 | $this->alt = $alt; | ||
| 54 | } | ||
| 55 | |||
| 56 | public function getFileName(): string | ||
| 57 | { | ||
| 58 | return $this->file_name; | ||
| 59 | } | ||
| 60 | public function getFilePath(): string | ||
| 61 | { | ||
| 62 | return $this->file_path; | ||
| 63 | } | ||
| 64 | public function getFilePathMini(): string | ||
| 65 | { | ||
| 66 | return $this->file_path_mini; | ||
| 67 | } | ||
| 68 | public function getAlt(): string | ||
| 69 | { | ||
| 70 | return $this->alt; | ||
| 71 | } | ||
| 72 | |||
| 73 | |||
| 74 | // pour ViewBuilderController? | ||
| 75 | /*public function displayImage($imageId): void | ||
| 76 | { | ||
| 77 | //$imageId = 1; // Exemple d'ID d'image | ||
| 78 | $stmt = $pdo->prepare("SELECT file_path FROM images WHERE id = ?"); | ||
| 79 | $stmt->execute([$imageId]); | ||
| 80 | $image = $stmt->fetch(); | ||
| 81 | |||
| 82 | if ($image) { | ||
| 83 | echo "<img src='" . $image['file_path'] . "' alt='Image'>"; | ||
| 84 | } else { | ||
| 85 | echo "Image non trouvée."; | ||
| 86 | } | ||
| 87 | }*/ | ||
| 88 | } | ||
diff --git a/src/model/entities/Image.php b/src/model/entities/Image.php index 302a27f..e867a5f 100644 --- a/src/model/entities/Image.php +++ b/src/model/entities/Image.php | |||
| @@ -41,9 +41,6 @@ class Image | |||
| 41 | => Déplacement du fichier sur le serveur : Le fichier est déplacé depuis son emplacement temporaire vers le répertoire uploads/. | 41 | => Déplacement du fichier sur le serveur : Le fichier est déplacé depuis son emplacement temporaire vers le répertoire uploads/. |
| 42 | => Enregistrement dans la base de données : On enregistre les informations de l'image dans la base de données. */ | 42 | => Enregistrement dans la base de données : On enregistre les informations de l'image dans la base de données. */ |
| 43 | 43 | ||
| 44 | #[ORM\ManyToMany(targetEntity: NodeData::class, mappedBy: "images")] | ||
| 45 | private $node_data; | ||
| 46 | |||
| 47 | #[ORM\ManyToMany(targetEntity: Article::class, mappedBy: "images")] | 44 | #[ORM\ManyToMany(targetEntity: Article::class, mappedBy: "images")] |
| 48 | private $article; | 45 | private $article; |
| 49 | 46 | ||
diff --git a/src/model/entities/NodeData.php b/src/model/entities/NodeData.php index d8281c0..5938eca 100644 --- a/src/model/entities/NodeData.php +++ b/src/model/entities/NodeData.php | |||
| @@ -40,21 +40,21 @@ class NodeData | |||
| 40 | private ?int $pagination_limit = null; // pour les post_block et news_block | 40 | private ?int $pagination_limit = null; // pour les post_block et news_block |
| 41 | 41 | ||
| 42 | // liaison avec table intermédiaire | 42 | // liaison avec table intermédiaire |
| 43 | #[ORM\ManyToMany(targetEntity: Image::class, inversedBy: "node_data")] | 43 | #[ORM\ManyToMany(targetEntity: Asset::class, inversedBy: "node_data")] |
| 44 | #[ORM\JoinTable( | 44 | #[ORM\JoinTable( |
| 45 | name: TABLE_PREFIX . "node_image", | 45 | name: TABLE_PREFIX . "node_asset", |
| 46 | joinColumns: [new ORM\JoinColumn(name: "node_data_id", referencedColumnName: "id_node_data", onDelete: "CASCADE")], | 46 | joinColumns: [new ORM\JoinColumn(name: "node_data_id", referencedColumnName: "id_node_data", onDelete: "CASCADE")], |
| 47 | inverseJoinColumns: [new ORM\JoinColumn(name: "image_id", referencedColumnName: "id_image", onDelete: "CASCADE")] | 47 | inverseJoinColumns: [new ORM\JoinColumn(name: "asset_id", referencedColumnName: "id_asset", onDelete: "CASCADE")] |
| 48 | )] | 48 | )] |
| 49 | private Collection $images; | 49 | private Collection $assets; |
| 50 | 50 | ||
| 51 | private int $nb_pages = 1; | 51 | private int $nb_pages = 1; |
| 52 | 52 | ||
| 53 | public function __construct(array $data, Node $node, Collection $images = new ArrayCollection, ?string $presentation = null, ?bool $chrono_order = null) | 53 | public function __construct(array $data, Node $node, Collection $assets = new ArrayCollection, ?string $presentation = null, ?bool $chrono_order = null) |
| 54 | { | 54 | { |
| 55 | $this->data = $data; | 55 | $this->data = $data; |
| 56 | $this->node = $node; | 56 | $this->node = $node; |
| 57 | $this->images = $images; | 57 | $this->assets = $assets; |
| 58 | if(!empty($presentation) && $presentation === 'grid'){ | 58 | if(!empty($presentation) && $presentation === 'grid'){ |
| 59 | $this->grid_cols_min_width = 250; | 59 | $this->grid_cols_min_width = 250; |
| 60 | } | 60 | } |
| @@ -133,12 +133,12 @@ class NodeData | |||
| 133 | { | 133 | { |
| 134 | $this->node = $node; | 134 | $this->node = $node; |
| 135 | }*/ | 135 | }*/ |
| 136 | public function getImages(): Collection | 136 | public function getAssets(): Collection |
| 137 | { | 137 | { |
| 138 | return $this->images; | 138 | return $this->assets; |
| 139 | } | 139 | } |
| 140 | public function setImages(Collection $images): void | 140 | public function setAssets(Collection $assets): void |
| 141 | { | 141 | { |
| 142 | $this->images = $images; | 142 | $this->assets = $assets; |
| 143 | } | 143 | } |
| 144 | } | 144 | } |
diff --git a/src/view/HeadBuilder.php b/src/view/HeadBuilder.php index ad6e4ba..f7c437b 100644 --- a/src/view/HeadBuilder.php +++ b/src/view/HeadBuilder.php | |||
| @@ -51,14 +51,18 @@ class HeadBuilder extends AbstractBuilder | |||
| 51 | $description = Model::$page_path->getLast()->getDescription(); | 51 | $description = Model::$page_path->getLast()->getDescription(); |
| 52 | 52 | ||
| 53 | // favicon | 53 | // favicon |
| 54 | foreach($node->getNodeData()->getImages() as $image) | 54 | /*foreach($node->getNodeData()->getImages() as $image) |
| 55 | { | 55 | { |
| 56 | if(str_contains($image->getFileName(), 'favicon')) | 56 | if(str_contains($image->getFileName(), 'favicon')) |
| 57 | { | 57 | { |
| 58 | $favicon = rtrim($image->getFilePathMini(), '/'); | 58 | $favicon = rtrim($image->getFilePathMini(), '/'); |
| 59 | $alt = $image->getAlt(); | 59 | $alt = $image->getAlt(); |
| 60 | } | 60 | } |
| 61 | } | 61 | }*/ |
| 62 | |||
| 63 | // en dur temporairement | ||
| 64 | $favicon = 'assets/favicon48x48.png'; | ||
| 65 | $alt = 'favicon'; | ||
| 62 | 66 | ||
| 63 | ob_start(); | 67 | ob_start(); |
| 64 | require $viewFile; | 68 | require $viewFile; |
diff --git a/src/view/HeaderBuilder.php b/src/view/HeaderBuilder.php index 87dc2f2..470074f 100644 --- a/src/view/HeaderBuilder.php +++ b/src/view/HeaderBuilder.php | |||
| @@ -51,7 +51,7 @@ class HeaderBuilder extends AbstractBuilder | |||
| 51 | $keys = array_keys($social); | 51 | $keys = array_keys($social); |
| 52 | $social_networks = ''; | 52 | $social_networks = ''; |
| 53 | $head_logo = ''; | 53 | $head_logo = ''; |
| 54 | foreach($node->getNodeData()->getImages() as $image) | 54 | /*foreach($node->getNodeData()->getImages() as $image) |
| 55 | { | 55 | { |
| 56 | for($i = 0; $i < count($keys); $i++) | 56 | for($i = 0; $i < count($keys); $i++) |
| 57 | { | 57 | { |
| @@ -62,18 +62,23 @@ class HeaderBuilder extends AbstractBuilder | |||
| 62 | break; | 62 | break; |
| 63 | } | 63 | } |
| 64 | // logo en-tête | 64 | // logo en-tête |
| 65 | /*if(str_contains($image->getFileName(), 'header_logo')){ | 65 | //if(str_contains($image->getFileName(), 'header_logo')){ |
| 66 | $header_logo = rtrim($image->getFilePathMini(), '/'); | 66 | //$header_logo = rtrim($image->getFilePathMini(), '/'); |
| 67 | break; | 67 | //break; |
| 68 | }*/ | 68 | //} |
| 69 | // image de fond | 69 | // image de fond |
| 70 | /*if(str_contains($image->getFileName(), 'header_background')){ | 70 | //if(str_contains($image->getFileName(), 'header_background')){ |
| 71 | $header_background = rtrim($image->getFilePath(), '/'); | 71 | //$header_background = rtrim($image->getFilePath(), '/'); |
| 72 | break; | 72 | //break; |
| 73 | }*/ | 73 | //} |
| 74 | } | 74 | } |
| 75 | }*/ | ||
| 76 | // chemin du ficher dans node_data, à déplacer dans asset | ||
| 77 | foreach($keys as $one_key){ | ||
| 78 | $social_networks .= '<a href="' . $social[$one_key] . '" target="_blank" rel="noopener noreferrer"> | ||
| 79 | <img src="assets/' . $one_key . '.svg" alt="' . $one_key . '_alt"></a>'; | ||
| 75 | } | 80 | } |
| 76 | 81 | ||
| 77 | ob_start(); | 82 | ob_start(); |
| 78 | require $viewFile; | 83 | require $viewFile; |
| 79 | $this->html .= ob_get_clean(); | 84 | $this->html .= ob_get_clean(); |
