• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Symfony - kategorie, podkategorie i posty

Object Storage Arubacloud
0 głosów
82 wizyt
pytanie zadane 27 lutego w PHP przez Panelinio Gaduła (4,440 p.)
zamknięte 6 marca przez Panelinio

Witam, znowu przychodzę z pytaniem odnośnie Symfony.

Sprawa wygląda następująco: posiadam 3 tabelki (kategorie, podkategorie i posty). Posty są tworzone przez wbudowany formularz Symfony, czyli posiadają własną tabelkę. Do niej dorobiłem jedynie kolumnę podkategorie_id.
Dla zobrazowania tabelek:
 

Kategorie:
id | nazwa

Podkategorie:
id | nazwa | id_kategoria

Post:
id | title | content | id_podkategoria

Dla każdej tabelki jest kontroler. Wpadłem na pomysł aby wkleić zawartość kontrolera i entity podkategorii do kategorii, a potem taką formułką to sobie drukować:
Jest to plik kategorie/index.html.twig

{% for kategorie in kategories %}
                <li>
                    <a>{{ kategorie.nazwa }}</a>
                    {% for podkategorie in podkategories %}
                    <div class="podkat">
                        <a href="#">{{ podkategorie.nazwa }}</a>
                    </div>
                    {% endfor %}
                </li>
                {% endfor %}

I teraz pytanie, co mogę zrobić aby uzyskać żądany efekt? Chciałem operować na kilku tabelkach zamiast jednej ze względu na formularz do tworzenia postów. Szukałem tu i tu, jednak nie wiem czy to będzie pasować do nowego standardu symfony. Proszę aby mnie ktoś nakierował.

komentarz zamknięcia: Otrzymałem odpowiedzi i znalazłem rozwiązanie dla mojego problemu. Wystarczyło zmapować encje kategorii i podkategorii, następnie w kontrolerze kategorii renderować obie encje, a w twigu zawrzeć odpowiednią formułkę drukowania (dwie pętelki for)
komentarz 27 lutego przez Ehlert Ekspert (212,670 p.)
Nie za bardzo jestem w stanie zrozumieć, jaki mamy problem. Opisz proszę dokładniej.
komentarz 27 lutego przez Panelinio Gaduła (4,440 p.)
Wybacz, chciałbym aby dla kategorii drukowały się w menu przypisane do nich podkategorie. Z kolei po kliknięciu w podkategorie na stronie pojawią się przypisane do nich posty

1 odpowiedź

+2 głosów
odpowiedź 27 lutego przez Ehlert Ekspert (212,670 p.)
wybrane 6 marca przez Panelinio
 
Najlepsza
  1. Nie wiem czy potrzebujesz podkategorii jako osobnych encji. W końcu podkategoria to kategoria ze wskazaniem na parent.
  2. Domyślam się że chcesz mieć to jakoś łatwo dostępne więc stwórz twig extension. Tam wyciągałbym wszystkie kategorie i budował drzewo.
  3. W kodzie raczej używamy języka angielskiego. wink
komentarz 28 lutego przez Panelinio Gaduła (4,440 p.)
1. Po prostu chciałbym zrobić relację między tabelkami, aby łatwo drukować to co chcę.
2. Jasne, poczytam
3. Wiem, ale ze względu na to jak w szkole patrzyli na angielskie nazewnictwo (od razu podejrzenia o ściąganie z neta) to tak mi się przyjęło aby swoje nazwy wpisywać  Tak czy siak ten kodzik ma być tylko dla mnie do nauki Symfony
komentarz 28 lutego przez Panelinio Gaduła (4,440 p.)

@Ehlert, zrobiłem według poradnika, jednak pojawiają się błędy:
 

Controller "App\Controller\SubcategoryController::showSubcategories" requires that you provide a value for the "$id" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or there is a non-optional argument after this one.

W tabelkach mam wartości już przypisane, a tak wyglądają kontrolery i encje:
 

#[ORM\Entity(repositoryClass: CategoryRepository::class)]
class Category
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 255)]
    private ?string $name = null;

    #[ORM\OneToMany(targetEntity: Subcategory::class, mappedBy: 'category')]
    private Collection $subcategories;

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

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

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): static
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return Collection<int, Subcategory>
     */
    public function getSubcategories(): Collection
    {
        return $this->subcategories;
    }

    public function addSubcategory(Subcategory $subcategory): static
    {
        if (!$this->subcategories->contains($subcategory)) {
            $this->subcategories->add($subcategory);
            $subcategory->setCategory($this);
        }

        return $this;
    }

    public function removeSubcategory(Subcategory $subcategory): static
    {
        if ($this->subcategories->removeElement($subcategory)) {
            // set the owning side to null (unless already changed)
            if ($subcategory->getCategory() === $this) {
                $subcategory->setCategory(null);
            }
        }

        return $this;
    }
}
#[ORM\Entity(repositoryClass: SubcategoryRepository::class)]
class Subcategory
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\ManyToOne(inversedBy: 'subcategories')]
    #[ORM\JoinColumn(nullable: false)]
    private ?Category $category = null;

    #[ORM\Column(length: 255)]
    private ?string $name = null;

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

    public function getCategory(): ?Category
    {
        return $this->category;
    }

    public function setCategory(?Category $category): static
    {
        $this->category = $category;

        return $this;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): static
    {
        $this->name = $name;

        return $this;
    }
}
#[Route('/category')]
class CategoryController extends AbstractController
{
    public function index(CategoryRepository $categoryRepository): Response
    {
        return $this->render('category/index.html.twig', [
            'categories' => $categoryRepository -> findAll(),
        ]);
    }
}
#[Route('/subcategory')]
class SubcategoryController extends AbstractController
{   
    public function showSubcategories(CategoryRepository $categoryRepository, int $id): Response
    {
        $category = $categoryRepository->find($id);
        
        $subcategories = $category->getSubcategories();

        return $this->render('subcategory/index.html.twig', ['subcategories' => $subcategories]);
    }
    
    
}

 

Podobne pytania

0 głosów
0 odpowiedzi 127 wizyt
pytanie zadane 8 grudnia 2016 w PHP przez robb74 Początkujący (450 p.)
0 głosów
1 odpowiedź 233 wizyt
pytanie zadane 11 lutego 2022 w PHP przez Moonmaker05 Początkujący (410 p.)
0 głosów
1 odpowiedź 111 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...