Completed
Push — feature/model-restoration ( 71d832...e1e282 )
by Vladimir
02:47
created

TeamRestorationFormCreator   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 11

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 11
dl 0
loc 86
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
B build() 0 24 2
A checkAvailableLeader() 0 17 4
A create() 0 13 1
A enter() 0 13 2
1
<?php
2
3
namespace BZIon\Form\Creator;
4
5
use BZIon\Form\Constraint\NotBlankModel;
6
use BZIon\Form\Type\AdvancedModelType;
7
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
8
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
9
use Symfony\Component\Form\FormBuilderInterface;
10
use Symfony\Component\Form\FormError;
11
use Symfony\Component\Form\FormEvent;
12
use Symfony\Component\Form\FormEvents;
13
14
class TeamRestorationFormCreator extends ModelFormCreator
15
{
16
    /**
17
     * @var \Team
18
     */
19
    protected $editing;
20
21
    /**
22
     * @param FormBuilderInterface $builder
23
     *
24
     * @return FormBuilderInterface
25
     */
26
    protected function build($builder)
27
    {
28
        $previousLeader = $this->editing->getLeader();
29
30
        // The previous leader of the team being restored is already on a new team; we need to assign a new team leader
31
        if ($previousLeader->getTeam()->isValid()) {
32
            $playerModel = new AdvancedModelType('player');
33
34
            $builder->add('leader', $playerModel, [
35
                'constraints' => new NotBlankModel(),
36
                'required' => true,
37
            ]);
38
        }
39
40
        $builder
41
            ->add('cancel', ButtonType::class)
42
            ->add('submit', SubmitType::class, [
43
                'label' => 'Restore Team'
44
            ])
45
            ->addEventListener(FormEvents::POST_SUBMIT, [$this, 'checkAvailableLeader'])
46
        ;
47
48
        return $builder;
49
    }
50
51
    public function checkAvailableLeader(FormEvent $event)
52
    {
53
        $form = $event->getForm();
54
55
        if ($form->has('leader')) {
56
            /** @var \Player $proposedLeader */
57
            $proposedLeader = $form->get('leader')->getData();
58
59
            if ($proposedLeader === null) {
60
                return;
61
            }
62
63
            if ($proposedLeader->getTeam()->isValid()) {
64
                $form->addError(new FormError("{$proposedLeader->getName()} already belongs to a team; the leader must be a teamless player."));
65
            }
66
        }
67
    }
68
69
    /**
70
     * {@inheritdoc}
71
     */
72
    public function create()
73
    {
74
        $builder = \Service::getFormFactory()->createNamedBuilder(
75
            'TeamRestoration',
76
            'form',
77
            null,
78
            []
79
        );
80
81
        $form = $this->build($builder)->getForm();
82
83
        return $form;
84
    }
85
86
    public function enter($form)
87
    {
88
        $this->editing->restore();
89
90
        if ($form->has('leader')) {
91
            $newLeader = $form->get('leader')->getData();
92
93
            $this->editing->addMember($newLeader->getId());
94
            $this->editing->setLeader($newLeader->getId());
95
        }
96
97
        return $this->editing;
98
    }
99
}
100