Passed
Pull Request — master (#192)
by Alexander
05:43 queued 02:47
created

BaseField::generateBeginContent()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Form\Field\Base;
6
7
use InvalidArgumentException;
8
use Yiisoft\Html\Html;
9
use Yiisoft\Html\Tag\CustomTag;
10
use Yiisoft\Widget\Widget;
11
12
abstract class BaseField extends Widget
13
{
14
    /**
15
     * @psalm-var non-empty-string
16
     */
17
    protected string $containerTag = 'div';
18
    protected array $containerTagAttributes = [];
19
    protected bool $useContainer = true;
20
21
    private bool $isStartedByBegin = false;
22
23 4
    final public function containerTag(string $tag): static
24
    {
25 4
        if ($tag === '') {
26 1
            throw new InvalidArgumentException('Tag name cannot be empty.');
27
        }
28
29 3
        $new = clone $this;
30 3
        $new->containerTag = $tag;
31 3
        return $new;
32
    }
33
34 5
    final public function containerTagAttributes(array $attributes): static
35
    {
36 5
        $new = clone $this;
37 5
        $new->containerTagAttributes = $attributes;
38 5
        return $new;
39
    }
40
41 171
    final public function useContainer(bool $use): static
42
    {
43 171
        $new = clone $this;
44 171
        $new->useContainer = $use;
45 171
        return $new;
46
    }
47
48 5
    final public function begin(): ?string
49
    {
50 5
        parent::begin();
51 5
        $this->isStartedByBegin = true;
52
53 5
        $this->beforeRender();
54
55 5
        $content = $this->generateBeginContent();
56
57 5
        $html = $this->renderOpenContainerAndContent($content);
58 5
        if ($html === '') {
59 1
            return '';
60
        }
61
62 4
        return $html;
63
    }
64
65 404
    final protected function run(): string
66
    {
67 404
        if ($this->isStartedByBegin) {
68 5
            $this->isStartedByBegin = false;
69 5
            return $this->renderEnd();
70
        }
71
72 400
        $this->beforeRender();
73
74 400
        $content = $this->generateContent();
75 382
        if ($content === null) {
76 1
            return '';
77
        }
78
79 381
        $result = $this->renderOpenContainerAndContent($content);
80
81 381
        if ($this->useContainer) {
82 209
            $result .= "\n" . Html::closeTag($this->containerTag);
83
        }
84
85 381
        return $result;
86
    }
87
88
    protected function beforeRender(): void
89
    {
90
    }
91
92
    abstract protected function generateContent(): ?string;
93
94 2
    protected function generateBeginContent(): string
95
    {
96 2
        return '';
97
    }
98
99 2
    protected function generateEndContent(): string
100
    {
101 2
        return '';
102
    }
103
104
    protected function prepareContainerTagAttributes(array &$attributes): void
105
    {
106
    }
107
108 5
    private function renderEnd(): string
109
    {
110 5
        $content = $this->generateEndContent();
111
112 5
        if (!$this->useContainer) {
113 1
            return $content;
114
        }
115
116 4
        $containerTag = CustomTag::name($this->containerTag);
117
118 4
        return ($content !== '' ? $content . "\n" : '') . $containerTag->close();
119
    }
120
121 385
    private function renderOpenContainerAndContent(string $content): string
122
    {
123 385
        if (!$this->useContainer) {
124 174
            return $content;
125
        }
126
127 213
        $containerTag = CustomTag::name($this->containerTag);
128
129 213
        $attributes = $this->containerTagAttributes;
130 213
        $this->prepareContainerTagAttributes($attributes);
131 213
        if ($attributes !== []) {
132 7
            $containerTag = $containerTag->attributes($attributes);
133
        }
134
135 213
        return $containerTag->open()
136 213
            . ($content === '' ? '' : ("\n" . $content));
137
    }
138
}
139