Search code examples
symfonysymfony4

how to affix multiple images Symfony


I have a two entities Portfolio and images relation ManyToOne, the photos are in the database I want to retrieve them and I get this result . Click Here

I want to show a photo in the portfolio list and be able to display a photo carousel on the project detail page. go to the portfolio section and click on the link (more detail). https://bootstrapmade.com/demo/Arsha/ but I have this error Click Here

Thank you.

Images.Php

<?php

namespace App\Entity;

use App\Repository\ImagesRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=ImagesRepository::class)
 */
class Images
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity=Portfolio::class, inversedBy="images")
     * @ORM\JoinColumn(nullable=false)
     */
    private $portfolios;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $nom;

    
    public function getId(): ?int
    {
        return $this->id;
    }

    public function getPortfolios(): ?Portfolio
    {
        return $this->portfolios;
    }

    public function setPortfolios(?Portfolio $portfolios): self
    {
        $this->portfolios = $portfolios;

        return $this;
    }

    public function getNom(): ?string
    {
        return $this->nom;
    }

    public function setNom(string $nom): self
    {
        $this->nom = $nom;

        return $this;
    }
}

Portfolio.php


   <?php

namespace App\Entity;

use App\Repository\PortfolioRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;


/**
 * @ORM\Entity(repositoryClass=PortfolioRepository::class) 
 */
class Portfolio
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $titre;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $web;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $description;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $contenu;
    
    /**
     * @Gedmo\Slug(fields={"titre"})
     * @ORM\Column(type="string", length=255)
     */
    private $slug;

    /**
     * @ORM\ManyToOne(targetEntity=Client::class, inversedBy="portfolios")
     */
    private $clients;


    /**
     * @ORM\ManyToMany(targetEntity=Categorie::class, inversedBy="portfolios")
     */
    private $categories;

    /**
     * @var \DateTime $created_at
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(type="datetime")
     */
    private $created_at;

    /**
     * @var \DateTime $updated_at
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $updated_at;

    /**
     * @ORM\OneToMany(targetEntity=Images::class, mappedBy="portfolios", orphanRemoval=true, cascade={"persist"})
     */
    private $images;

    public function __construct()
    {
        $this->categories = new ArrayCollection();
        $this->images = new ArrayCollection();
    }


    public function __toString()
    {
        return $this->titre;
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitre(): ?string
    {
        return $this->titre;
    }

    public function setTitre(string $titre): self
    {
        $this->titre = $titre;

        return $this;
    }

    public function getWeb(): ?string
    {
        return $this->web;
    }

    public function setWeb(?string $web): self
    {
        $this->web = $web;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(?string $description): self
    {
        $this->description = $description;

        return $this;
    }

    public function getContenu(): ?string
    {
        return $this->contenu;
    }

    public function setContenu(?string $contenu): self
    {
        $this->contenu = $contenu;

        return $this;
    }

    
    public function getSlug(): ?string
    {
        return $this->slug;
    }


    /**
     * @return Collection|Categorie[]
     */
    public function getCategories(): Collection
    {
        return $this->categories;
    }

    public function addCategory(Categorie $category): self
    {
        if (!$this->categories->contains($category)) {
            $this->categories[] = $category;
        }

        return $this;
    }

    public function removeCategory(Categorie $category): self
    {
        $this->categories->removeElement($category);

        return $this;
    }

    public function getCreatedAt(): ?\DateTimeInterface
    {
        return $this->created_at;
    }   

    public function getUpdatedAt(): ?\DateTimeInterface
    {
        return $this->updated_at;
    }    

    public function getClients(): ?Client
    {
        return $this->clients;
    }

    public function setClients(?Client $clients): self
    {
        $this->clients = $clients;

        return $this;
    }

    /**
     * @return Collection|Images[]
     */
    public function getImages(): Collection
    {
        return $this->images;
    }

    public function addImage(Images $image): self
    {
        if (!$this->images->contains($image)) {
            $this->images[] = $image;
            $image->setPortfolios($this);
        }

        return $this;
    }

    public function removeImage(Images $image): self
    {
        if ($this->images->removeElement($image)) {
            // set the owning side to null (unless already changed)
            if ($image->getPortfolios() === $this) {
                $image->setPortfolios(null);
            }
        }

        return $this;
    }
}

Twig portfolio list I have found the solution to part of my problem, I can retrieve a photo for the project list, but in the details page I have no error but the images are not displayed.

<div class="row portfolio-container">
            {% for portfolio in portfolios %}
            <div class="col-lg-4 col-md-6 portfolio-item filter-app">
                <div class="portfolio-wrap">
                    <img src="{{asset('assets/img/portfolio/' ~ portfolio.images[0].nom)}}" class="img-fluid" alt="">
                   
                    <div class="portfolio-info">
                        <h4>{{ portfolio.titre }}</h4>
                        {% for categorie in portfolio.categories %}
                        <p>{{ categorie.nom }}</p>
                        {% endfor %}
                        <div class="portfolio-links">
                            <a href="{{asset('assets/img/portfolio/portfolio-1.jpg')}}" data-gallery="portfolioGallery"
                                class="portfolio-lightbox" title="App 1"><i class="bx bx-plus"></i></a>
                                
                            <a href="{{ path('portfolio_detail', {'slug': portfolio.slug}) }}" title="Plus Details"><i class="bx bx-link"></i></a>
                        </div>
                    </div>
                </div>
            </div>
            {% endfor %}

Twig Portfolio Detail

<div class="col-lg-8">
          <div class="portfolio-details-slider swiper-container">
           
            <div class="swiper-wrapper align-items-center">
              {% for images in portfolio.images  %}
              <div class="swiper-slide">
                <img src="{{asset('assets/img/portfolio/' ~ images.nom)}}" alt="">
              </div>
              
              {% endfor %}             
                     
            </div>
           
            <div class="swiper-pagination"></div>
          
          </div>
        </div>

Controller

 <?php

namespace App\Controller;

use App\Entity\Portfolio;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class AccueilController extends AbstractController
{
    /**
     * @Route("/", name="accueil")
     */
    public function index(): Response
    {
        //lister portfolio
        $portfolios = $this->getDoctrine()->getRepository(Portfolio::class)->findBy(
            [],
            ['created_at' => 'desc']
        );
        return $this->render('accueil/index.html.twig', [
            'portfolios' => $portfolios,
        ]);
    }

    
    /**
     * @Route("/portfolio/{slug}", name="portfolio_detail", methods={"GET"})     
     */
    public function detail($slug): Response
    {
          // On récupère l'article correspondant au slug
          $portfolio = $this->getDoctrine()->getRepository(Portfolio::class)->findOneBy(['slug' => $slug]);
        return $this->render('accueil/detail.html.twig', [
            'portfolio' => $portfolio,
        ]);
    }

}

   

Solution

  • My code works, I hope I can help others.

    I leave you a link although this is french but it is great.

    https://nouvelle-techno.fr/actualites/live-coding-upload-dimages-multiples-avec-symfony-4-et-5