Completed
Branch dev-master (f3e1e5)
by Derek Stephen
20:25
created

AbstractFormRenderer::addRequiredAsterisk()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 7
cts 7
cp 1
rs 9.6666
c 0
b 0
f 0
cc 1
eloc 7
nc 1
nop 1
crap 1
1
<?php
2
/**
3
 * User: delboy1978uk
4
 * Date: 07/12/2016
5
 * Time: 01:54
6
 */
7
8
namespace Del\Form\Renderer;
9
10
use Del\Form\Collection\FieldCollection;
11
use Del\Form\AbstractForm;
12
use Del\Form\Field\FieldInterface;
13
use Del\Form\FormInterface;
14
use Del\Form\Renderer\Error\DefaultErrorRender;
15
use Del\Form\Renderer\Error\ErrorRendererInterface;
16
use DOMDocument;
17
use DomElement;
18
use DOMText;
19
20
abstract class AbstractFormRenderer implements FormRendererInterface
21
{
22
    /** @var DOMDocument $dom */
23
    protected $dom;
24
25
    /** @var DomElement $form */
26
    protected $form;
27
28
    /** @var bool $displayErrors */
29
    protected $displayErrors;
30
31
    /** @var ErrorRendererInterface $errorRenderer */
32
    protected $errorRenderer;
33
34
    /** @var DomElement $label The label element*/
35
    protected $label;
36
37
    /** @var DomElement $element the field element */
38
    protected $element;
39
40
    /** @var DomElement $errors The error block html*/
41
    protected $errors;
42
43
    /** @var DomElement $block The containing html block */
44
    protected $block;
45
46
    /** @var FieldInterface $field The current field being processed */
47
    protected $field;
48
49 24
    public function __construct()
50
    {
51 24
        $this->dom = new DOMDocument();
52 24
        $this->form = $this->dom->createElement('form');
53 24
        $this->errorRenderer = new DefaultErrorRender($this->dom);
54 24
    }
55
56
    /**
57
     * @param FormInterface $form
58
     * @param bool $displayErrors
59
     * @return string
60
     */
61 11
    public function render(FormInterface $form, $displayErrors = true)
62
    {
63 11
        $this->displayErrors = $displayErrors;
64 11
        $this->setFormAttributes($form);
65
66 11
        $fields = $form->getFields();
67 11
        $this->processFields($fields);
68
69 10
        $this->dom->appendChild($this->form);
70 10
        return $this->dom->saveHTML();
71
    }
72
73
    /**
74
     * @param FormInterface $form
75
     */
76 11
    private function setFormAttributes(FormInterface $form)
77
    {
78 11
        $attributes = $form->getAttributes();
79 11
        foreach ($attributes as $key => $value) {
80 11
            $this->form->setAttribute($key, $value);
81
        }
82
83
        // set Id as name or method as post if not set
84 11
        $method = $this->getMethod($form);
85 11
        $id = $this->getId($form);
86
87 11
        $this->form->setAttribute('id', $id);
88 11
        $this->form->setAttribute('method', $method);
89 11
    }
90
91
    /**
92
     * @param FormInterface $form
93
     * @return string
94
     */
95 11
    private function getMethod(FormInterface $form)
96
    {
97 11
        return $form->getMethod() ?: AbstractForm::METHOD_POST;
98
    }
99
100
    /**
101
     * @param FormInterface $form
102
     * @return string
103
     */
104 11
    private function getId(FormInterface $form)
105
    {
106 11
        return $form->getId() ?: $this->form->getAttribute('name');
107
    }
108
109 11
    private function processFields(FieldCollection $fields)
110
    {
111 11
        $fields->rewind();
112 11
        while ($fields->valid()) {
113 10
            $this->block = $this->dom->createElement('div');
114 10
            $this->field = $fields->current();
115 10
            $this->label = $this->renderFieldLabel();
116 10
            $this->element = $this->field->getRenderer()->render($this->dom, $this->field);
117 9
            $this->errors = $this->field->isValid() ? null : $this->renderError();
118 9
            $this->block = $this->renderFieldBlock();
119 9
            $this->form->appendChild($this->block);
120 9
            $fields->next();
121
        }
122 10
        $fields->rewind();
123 10
    }
124
125
126
127
    /**
128
     * @return \DOMElement|null
129
     */
130 5
    public function renderError()
131
    {
132 5
        $errorBlock = null;
133 5
        if ($this->errorRenderer->shouldRender($this->field) && $this->displayErrors === true) {
134 3
            $this->block->setAttribute('class', 'has-error ');
135 3
            $errorBlock = $this->errorRenderer->render($this->field);
136
        }
137 5
        return $errorBlock;
138
    }
139
140
    /**
141
     * @return \DOMElement
142
     */
143 10
    protected function createLabelElement()
144
    {
145 10
        $label = $this->dom->createElement('label');
146 10
        $label->setAttribute('for', $this->field->getId());
147 10
        if ($this->field->isRequired()) {
148 3
            $label = $this->addRequiredAsterisk($label);
149
        }
150 10
        return $label;
151
    }
152
153
154 3
    public function addRequiredAsterisk(DomElement $label)
155
    {
156 3
        $span = $this->dom->createElement('span');
157 3
        $span->setAttribute('class', 'text-danger');
158 3
        $text = new DOMText('* ');
159 3
        $span->appendChild($text);
160 3
        $label->appendChild($span);
161 3
        return $label;
162
    }
163
164
}