W poprzednim rozdziale SONATA ADMIN BUNDLE – INSTALACJA I KONFIGURACJA pokrótce opisałem pakiet Sonata. Teraz pokażę, jak zbudować „zaplecze” do edycji zwykłej strony opisowej (z polami: id, title, content, enabled, createdAt) – jak na obrazku powyżej. Aby osiągnąć taki efekt, naprawdę nie trzeba wiele 🙂 Większość katorżniczej pracy wykona za nas Sonata, o czym zaraz się przekonasz.
Na początek utworzymy bazę danych. Można to zrobić za pomocą aplikacji PHPMyadmin itp. Następnie musimy skonfigurować nasze połączenie z bazą w pliku .env. Plik ten znajduje się w katalogu głównym frameworka Symfony.
Wyedytuj zmienną środowiskową DATABASE_URL i zapisz dane do połączenia z bazą danych (username, password, dbname):
1 |
DATABASE_URL=mysql://username:password@127.0.0.1:3306/dbname |
Utwórz model Page.php z kontrolkami formularza:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
<?php // src/Entity/Page.php namespace App\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; /** * @ORM\Entity */ class Page { /** * @var int * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; /** * @var string * @ORM\Column(type="string") * @Assert\NotBlank */ private $title; /** * @var string * @ORM\Column(type="text") * @Assert\NotBlank(message="page.blank_content") * @Assert\Length(min=10, minMessage="page.too_short_content") */ private $content; /** * @var bool * @ORM\Column(type="boolean") */ private $enabled; /** * @var \DateTime * @ORM\Column(type="datetime") * @Assert\Type(type="\DateTime") */ private $createdAt; public function __construct() { $this->createdAt = new \DateTime(); } public function getId(): ?int { return $this->id; } public function setId(?int $id): void { $this->id = $id; } public function getTitle(): ?string { return $this->title; } public function setTitle(?string $title): void { $this->title = $title; } public function getContent(): ?string { return $this->content; } public function setContent(?string $content): void { $this->content = $content; } public function getEnabled(): ?bool { return $this->enabled; } public function setEnabled(?bool $enabled): void { $this->enabled = $enabled; } public function getCreatedAt(): \DateTime { return $this->createdAt; } public function setCreatedAt(?\DateTime $createdAt): void { $this->createdAt = $createdAt; } } |
Z konsoli wiersza poleceń generujemy tabelę o nazwie page (zgodnie z nazwą klasy):
1 |
$ bin/console doctrine:schema:update --force |
Tworzymy klasę PageAdmin.php (src/Admin/PageAdmin.php). W niej konfigurujemy postać panelu: widoczność pól na liście (configureListFields), w widoku siatki (configureDatagridFilters) oraz w widoku formularza do tworzenia / edycji strony (configureFormFields):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php namespace App\Admin; use Sonata\AdminBundle\Admin\AbstractAdmin; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Form\FormMapper; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\DateTimeType; class PageAdmin extends AbstractAdmin { protected function configureFormFields(FormMapper $formMapper) { $formMapper->add('title', TextType::class); $formMapper->add('content', TextareaType::class); $formMapper->add('createdAt', DateTimeType::class); $formMapper->add('enabled', CheckboxType::class); } protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper->add('title'); $datagridMapper->add('createdAt'); $datagridMapper->add('enabled'); } protected function configureListFields(ListMapper $listMapper) { $listMapper->addIdentifier('title'); $listMapper->addIdentifier('createdAt'); $listMapper->addIdentifier('enabled'); } } |
W konfiguracji listy i siatki pominąłem pole content, gdyż ono nie jest nam potrzebne w tych widokach. Efekt będzie taki jak na obrazku poniżej, ale to jeszcze nie koniec 🙂
Zarejestruj klasę Admina w pliku services.yaml (config/services.yaml):
1 2 3 4 5 6 7 8 9 |
services: # ... admin.page: class: App\Admin\PageAdmin arguments: [~, App\Entity\Page, ~] tags: - { name: sonata.admin, manager_type: orm, label: Page } public: true |
Czyścimy cache:
1 |
$ bin/console cache:clear |
i wchodzimy na adres panelu:
https://localhost/public/index.php/admin
Prawda, że imponujące ? 🙂
A ile czasu i wkładu własnej pracy zaoszczędziłeś; sam oceń 😉