diff --git a/src/Controller/Admin/BlogCrudController.php b/src/Controller/Admin/BlogCrudController.php new file mode 100644 index 0000000..15284b4 --- /dev/null +++ b/src/Controller/Admin/BlogCrudController.php @@ -0,0 +1,32 @@ +autocomplete(), + TextField::new('title'), + TextEditorField::new('teaser'), + TextEditorField::new('content'), + DateTimeField::new('createdAt'), + AssociationField::new('editedBy') + ->autocomplete() + ]; + } +} diff --git a/src/Controller/Admin/CommentCrudController.php b/src/Controller/Admin/CommentCrudController.php new file mode 100644 index 0000000..8c5a4d7 --- /dev/null +++ b/src/Controller/Admin/CommentCrudController.php @@ -0,0 +1,35 @@ +autocomplete(), + AssociationField::new('blog') + ->autocomplete(), + TextField::new('title'), + TextEditorField::new('content'), + DateTimeField::new('createdAt'), + AssociationField::new('editedBy') + ->autocomplete(), + DateTimeField::new('editedAt'), + + ]; + } +} diff --git a/src/Controller/Admin/DashboardController.php b/src/Controller/Admin/DashboardController.php new file mode 100644 index 0000000..aea86db --- /dev/null +++ b/src/Controller/Admin/DashboardController.php @@ -0,0 +1,43 @@ +setTitle('24unix'); + } + + public function configureMenuItems(): iterable + { + yield MenuItem::linktoRoute('Back to the website', 'fas fa-home', 'blog'); + yield MenuItem::linktoDashboard('Dashboard', 'fas fa-tachometer-alt'); + yield MenuItem::linkToCrud('User', 'fas fa-user', User::class); + yield MenuItem::linkToCrud('Sections', 'fas fa-book', Section::class); + yield MenuItem::linkToCrud('Blogs', 'fas fa-blog', Blog::class); + yield MenuItem::linkToCrud('Comments', 'fas fa-comments', Comment::class); + } +} diff --git a/src/Controller/Admin/SectionCrudController.php b/src/Controller/Admin/SectionCrudController.php new file mode 100644 index 0000000..95fa81f --- /dev/null +++ b/src/Controller/Admin/SectionCrudController.php @@ -0,0 +1,25 @@ +comments = new ArrayCollection(); } + public function __toString() + { + return $this->title; + } + + public function getId(): ?int { return $this->id; diff --git a/src/Entity/User.php b/src/Entity/User.php index 9c93efc..4efe002 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -6,6 +6,7 @@ use App\Repository\UserRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; +use JetBrains\PhpStorm\Pure; use Symfony\Component\Security\Core\User\UserInterface; /** @@ -13,263 +14,268 @@ use Symfony\Component\Security\Core\User\UserInterface; */ class User implements UserInterface { - /** - * @ORM\Id - * @ORM\GeneratedValue - * @ORM\Column(type="integer") - */ - private $id; - - /** - * @ORM\Column(type="string", length=180, unique=true) - */ - private $username; - - /** - * @ORM\Column(type="json") - */ - private $roles = []; - - /** - * @var string The hashed password - * @ORM\Column(type="string") - */ - private $password; - - /** - * @ORM\Column(type="string", length=255, nullable=true) - */ - private $firstName; - - /** - * @ORM\Column(type="string", length=255, nullable=true) - */ - private $lastName; - - /** - * @ORM\Column(type="string", length=255) - */ - private $email; - - /** - * @ORM\Column(type="datetime") - */ - private $createdAt; - - /** - * @ORM\Column(type="datetime", nullable=true) - */ - private $lastLoginAt; - - /** - * @ORM\OneToMany(targetEntity=Blog::class, mappedBy="author") - */ - private $blogs; - - /** - * @ORM\OneToMany(targetEntity=Comment::class, mappedBy="author") - */ - private $comments; - - public function __construct() - { - $this->blogs = new ArrayCollection(); - $this->comments = new ArrayCollection(); - } - - public function getId(): ?int - { - return $this->id; - } - - /** - * A visual identifier that represents this user. - * - * @see UserInterface - */ - public function getUsername(): string - { - return (string) $this->username; - } - - public function setUsername(string $username): self - { - $this->username = $username; - - return $this; - } - - /** - * @see UserInterface - */ - public function getRoles(): array - { - $roles = $this->roles; - // guarantee every user at least has ROLE_USER - $roles[] = 'ROLE_USER'; - - return array_unique($roles); - } - - public function setRoles(array $roles): self - { - $this->roles = $roles; - - return $this; - } - - /** - * @see UserInterface - */ - public function getPassword(): string - { - return $this->password; - } - - public function setPassword(string $password): self - { - $this->password = $password; - - return $this; - } - - /** - * Returning a salt is only needed, if you are not using a modern - * hashing algorithm (e.g. bcrypt or sodium) in your security.yaml. - * - * @see UserInterface - */ - public function getSalt(): ?string - { - return null; - } - - /** - * @see UserInterface - */ - public function eraseCredentials() - { - // If you store any temporary, sensitive data on the user, clear it here - // $this->plainPassword = null; - } - - public function getFirstName(): ?string - { - return $this->firstName; - } - - public function setFirstName(?string $firstName): self - { - $this->firstName = $firstName; - - return $this; - } - - public function getLastName(): ?string - { - return $this->lastName; - } - - public function setLastName(?string $lastName): self - { - $this->lastName = $lastName; - - return $this; - } - - public function getEmail(): ?string - { - return $this->email; - } - - public function setEmail(string $email): self - { - $this->email = $email; - - return $this; - } - - public function getCreatedAt(): ?\DateTimeInterface - { - return $this->createdAt; - } - - public function setCreatedAt(\DateTimeInterface $createdAt): self - { - $this->createdAt = $createdAt; - - return $this; - } - - public function getLastLoginAt(): ?\DateTimeInterface - { - return $this->lastLoginAt; - } - - public function setLastLoginAt(?\DateTimeInterface $lastLoginAt): self - { - $this->lastLoginAt = $lastLoginAt; - - return $this; - } - - /** - * @return Collection|Blog[] - */ - public function getBlogs(): Collection - { - return $this->blogs; - } - - public function addBlog(Blog $blog): self - { - if (!$this->blogs->contains($blog)) { - $this->blogs[] = $blog; - $blog->setAuthor($this); - } - - return $this; - } - - public function removeBlog(Blog $blog): self - { - if ($this->blogs->removeElement($blog)) { - // set the owning side to null (unless already changed) - if ($blog->getAuthor() === $this) { - $blog->setAuthor(null); - } - } - - return $this; - } - - /** - * @return Collection|Comment[] - */ - public function getComments(): Collection - { - return $this->comments; - } - - public function addComment(Comment $comment): self - { - if (!$this->comments->contains($comment)) { - $this->comments[] = $comment; - $comment->setAuthor($this); - } - - return $this; - } - - public function removeComment(Comment $comment): self - { - if ($this->comments->removeElement($comment)) { - // set the owning side to null (unless already changed) - if ($comment->getAuthor() === $this) { - $comment->setAuthor(null); - } - } - - return $this; - } + /** + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + */ + private $id; + + /** + * @ORM\Column(type="string", length=180, unique=true) + */ + private $username; + + /** + * @ORM\Column(type="json") + */ + private $roles = []; + + /** + * @var string The hashed password + * @ORM\Column(type="string") + */ + private $password; + + /** + * @ORM\Column(type="string", length=255, nullable=true) + */ + private $firstName; + + /** + * @ORM\Column(type="string", length=255, nullable=true) + */ + private $lastName; + + /** + * @ORM\Column(type="string", length=255) + */ + private $email; + + /** + * @ORM\Column(type="datetime") + */ + private $createdAt; + + /** + * @ORM\Column(type="datetime", nullable=true) + */ + private $lastLoginAt; + + /** + * @ORM\OneToMany(targetEntity=Blog::class, mappedBy="author") + */ + private $blogs; + + /** + * @ORM\OneToMany(targetEntity=Comment::class, mappedBy="author") + */ + private $comments; + + #[Pure] public function __construct() + { + $this->blogs = new ArrayCollection(); + $this->comments = new ArrayCollection(); + } + + public function __toString() + { + return $this->username; + } + + public function getId(): ?int + { + return $this->id; + } + + /** + * A visual identifier that represents this user. + * + * @see UserInterface + */ + public function getUsername(): string + { + return (string)$this->username; + } + + public function setUsername(string $username): self + { + $this->username = $username; + + return $this; + } + + /** + * @see UserInterface + */ + public function getRoles(): array + { + $roles = $this->roles; + // guarantee every user at least has ROLE_USER + $roles[] = 'ROLE_USER'; + + return array_unique($roles); + } + + public function setRoles(array $roles): self + { + $this->roles = $roles; + + return $this; + } + + /** + * @see UserInterface + */ + public function getPassword(): string + { + return $this->password; + } + + public function setPassword(string $password): self + { + $this->password = $password; + + return $this; + } + + /** + * Returning a salt is only needed, if you are not using a modern + * hashing algorithm (e.g. bcrypt or sodium) in your security.yaml. + * + * @see UserInterface + */ + public function getSalt(): ?string + { + return null; + } + + /** + * @see UserInterface + */ + public function eraseCredentials() + { + // If you store any temporary, sensitive data on the user, clear it here + // $this->plainPassword = null; + } + + public function getFirstName(): ?string + { + return $this->firstName; + } + + public function setFirstName(?string $firstName): self + { + $this->firstName = $firstName; + + return $this; + } + + public function getLastName(): ?string + { + return $this->lastName; + } + + public function setLastName(?string $lastName): self + { + $this->lastName = $lastName; + + return $this; + } + + public function getEmail(): ?string + { + return $this->email; + } + + public function setEmail(string $email): self + { + $this->email = $email; + + return $this; + } + + public function getCreatedAt(): ?\DateTimeInterface + { + return $this->createdAt; + } + + public function setCreatedAt(\DateTimeInterface $createdAt): self + { + $this->createdAt = $createdAt; + + return $this; + } + + public function getLastLoginAt(): ?\DateTimeInterface + { + return $this->lastLoginAt; + } + + public function setLastLoginAt(?\DateTimeInterface $lastLoginAt): self + { + $this->lastLoginAt = $lastLoginAt; + + return $this; + } + + /** + * @return Collection|Blog[] + */ + public function getBlogs(): Collection + { + return $this->blogs; + } + + public function addBlog(Blog $blog): self + { + if (!$this->blogs->contains($blog)) { + $this->blogs[] = $blog; + $blog->setAuthor($this); + } + + return $this; + } + + public function removeBlog(Blog $blog): self + { + if ($this->blogs->removeElement($blog)) { + // set the owning side to null (unless already changed) + if ($blog->getAuthor() === $this) { + $blog->setAuthor(null); + } + } + + return $this; + } + + /** + * @return Collection|Comment[] + */ + public function getComments(): Collection + { + return $this->comments; + } + + public function addComment(Comment $comment): self + { + if (!$this->comments->contains($comment)) { + $this->comments[] = $comment; + $comment->setAuthor($this); + } + + return $this; + } + + public function removeComment(Comment $comment): self + { + if ($this->comments->removeElement($comment)) { + // set the owning side to null (unless already changed) + if ($comment->getAuthor() === $this) { + $comment->setAuthor(null); + } + } + + return $this; + } }