Add field in event for themes

This commit is contained in:
Julie Lenaerts 2025-04-29 10:03:42 +02:00
parent 055765956a
commit bc555ce3f5
7 changed files with 108 additions and 12 deletions

View File

@ -11,6 +11,7 @@ declare(strict_types=1);
namespace Chill\EventBundle\Entity;
use Chill\EventBundle\Repository\EventThemeRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
@ -19,8 +20,8 @@ use Doctrine\ORM\Mapping as ORM;
/**
* Class EventTheme.
*/
#[ORM\Entity]
#[ORM\HasLifecycleCallbacks]
#[ORM\Entity(repositoryClass: EventThemeRepository::class)]
#[ORM\Table(name: 'chill_event_event_theme')]
class EventTheme
{
@ -82,7 +83,6 @@ class EventTheme
/**
* Set active.
*
* @param bool $active
* @return EventTheme
*/
public function setIsActive(bool $active): static
@ -95,7 +95,6 @@ class EventTheme
/**
* Set label.
*
* @param array $label
* @return EventTheme
*/
public function setName(array $label): static

View File

@ -14,7 +14,10 @@ namespace Chill\EventBundle\Form;
use Chill\DocStoreBundle\Entity\StoredObject;
use Chill\DocStoreBundle\Form\StoredObjectType;
use Chill\EventBundle\Entity\Event;
use Chill\EventBundle\Entity\EventTheme;
use Chill\EventBundle\Form\Type\PickEventThemeType;
use Chill\EventBundle\Form\Type\PickEventTypeType;
use Chill\EventBundle\Repository\EventThemeRepository;
use Chill\MainBundle\Entity\Center;
use Chill\MainBundle\Form\Type\ChillCollectionType;
use Chill\MainBundle\Form\Type\ChillDateTimeType;
@ -22,14 +25,19 @@ use Chill\MainBundle\Form\Type\CommentType;
use Chill\MainBundle\Form\Type\PickUserDynamicType;
use Chill\MainBundle\Form\Type\PickUserLocationType;
use Chill\MainBundle\Form\Type\ScopePickerType;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Contracts\Translation\TranslatorInterface;
class EventType extends AbstractType
{
public function __construct(private readonly EventThemeRepository $eventThemeRepository, private readonly TranslatorInterface $translator, private readonly TranslatableStringHelperInterface $translatableStringHelper) {}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
@ -49,6 +57,9 @@ class EventType extends AbstractType
'class' => '',
],
])
->add('themes', PickEventThemeType::class, [
'multiple' => true,
])
->add('moderator', PickUserDynamicType::class, [
'label' => 'Pick a moderator',
])

View File

@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\EventBundle\Form\Type;
use Chill\EventBundle\Entity\EventTheme;
use Chill\EventBundle\Repository\EventThemeRepository;
use Chill\EventBundle\Templating\Entity\EventThemeRender;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
class PickEventThemeType extends AbstractType
{
public function __construct(private readonly EventThemeRender $eventThemeRender, private readonly EventThemeRepository $eventThemeRepository) {}
public function configureOptions(OptionsResolver $resolver)
{
$resolver
->setDefaults([
'class' => EventTheme::class,
'choices' => $this->eventThemeRepository->findByActiveOrdered(),
'choice_label' => fn (EventTheme $et) => $this->eventThemeRender->renderString($et, []),
'placeholder' => 'event.form.Select one or more themes',
'required' => true,
'attr' => ['class' => 'select2'],
'label' => 'event.theme.label',
'multiple' => false,
])
->setAllowedTypes('multiple', ['bool']);
}
public function getParent(): string
{
return EntityType::class;
}
}

View File

@ -23,10 +23,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
*/
class PickEventTypeType extends AbstractType
{
/**
* @var TranslatableStringHelper
*/
protected $translatableStringHelper;
protected TranslatableStringHelper $translatableStringHelper;
public function __construct(TranslatableStringHelper $helper)
{

View File

@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\EventBundle\Repository;
use Chill\EventBundle\Entity\EventTheme;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<EventTheme>
*/
class EventThemeRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, EventTheme::class);
}
public function findByActiveOrdered(): array
{
return $this->createQueryBuilder('t')
->select('t')
->where('t.isActive = True')
->orderBy('t.ordering', 'ASC')
->getQuery()
->getResult();
}
}

View File

@ -47,18 +47,18 @@ class EventThemeRender implements ChillEntityRenderInterface
* @throws SyntaxError
* @throws LoaderError
*/
public function renderBox($eventTheme, array $options): string
public function renderBox($entity, array $options): string
{
$options = array_merge(self::DEFAULT_ARGS, $options);
// give some help to twig: an array of parents
$parents = $this->buildParents($eventTheme);
$parents = $this->buildParents($entity);
return $this
->engine
->render(
'@ChillEvent/Entity/event_theme.html.twig',
[
'eventTheme' => $eventTheme,
'eventTheme' => $entity,
'parents' => $parents,
'options' => $options,
]
@ -76,7 +76,7 @@ class EventThemeRender implements ChillEntityRenderInterface
while ($entity->hasParent()) {
$entity = $entity->getParent();
$titles[] = $this->translatableStringHelper->localize(
$entity->getTitle()
$entity->getName()
);
}

View File

@ -32,6 +32,12 @@ services:
tags:
- { name: form.type }
Chill\EventBundle\Form\EventThemeType:
Chill\EventBundle\Form\Type\PickEventThemeType:
tags:
- { name: form.type }
Chill\EventBundle\Form\EventType:
tags:
- { name: form.type }