Completed
Pull Request — master (#57)
by Wilmer
02:10
created

Block::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
declare(strict_types = 1);
3
4
namespace Yiisoft\Widget;
5
6
use Yiisoft\View\WebView;
7
8
/**
9
 * Block records all output between {@see begin()} and {@see end()} calls and stores it in
10
 * {@see \Yiisoft\View\View::$blocks}.
11
 *
12
 * {@see \Yiisoft\View\View} component contains two methods {\Yiisoft\View\View::beginBlock()} and
13
 * {[\Yiisoft\View\View::endBlock()}.
14
 *
15
 * The general idea is that you're defining block default in a view or layout:
16
 *
17
 * ```php
18
 * <?php $this->beginBlock('index') ?>
19
 * Nothing.
20
 * <?php $this->endBlock() ?>
21
 * ```
22
 *
23
 * And then overriding default in views:
24
 *
25
 * ```php
26
 * <?php $this->beginBlock('index') ?>
27
 * Umm... hello?
28
 * <?php $this->endBlock() ?>
29
 * ```
30
 *
31
 * in subviews show block:
32
 *
33
 * <?= $this->getBlock('index') ?>
34
 *
35
 * Second parameter defines if block content should be outputted which is desired when rendering its content but isn't
36
 * desired when redefining it in subviews.
37
 *
38
 * @method static Block begin()
39
 * @method static Block end()
40
 */
41
class Block extends Widget
42
{
43
    /**
44
     * @var string $id
45
     */
46
    private $id;
47
48
    /**
49
     * @var bool whether to render the block content in place. Defaults to false, meaning the captured block content
50
     *           will not be displayed.
51
     */
52
    private $renderInPlace = false;
53
54
    /**
55
     * @param WebView $webView
56
     */
57
    private $webView;
58
59 3
    public function __construct(WebView $webView)
60
    {
61 3
        parent::__construct($webView);
62 3
        $this->webView = $webView;
63
    }
64
65
    /**
66
     * Starts recording a block.
67
     */
68 3
    public function init(): void
69
    {
70 3
        ob_start();
71 3
        ob_implicit_flush(0);
72
    }
73
74
    /**
75
     * Ends recording a block.
76
     * This method stops output buffering and saves the rendering result as a named block in the view.
77
     *
78
     * @return string the result of widget execution to be outputted.
79
     */
80 3
    public function run(): string
81
    {
82 3
        $block = ob_get_clean();
83
84 3
        if ($this->renderInPlace) {
85 1
            return $block;
86
        }
87
88 2
        if (!empty($block)) {
89 1
            $this->webView->setBlocks($this->id, $block);
90
        }
91
92 2
        return '';
93
    }
94
95
    /**
96
     * {@see renderInPlace}
97
     *
98
     * @param string $value
99
     *
100
     * @return $this
101
     */
102 2
    public function id(string $value): self
103
    {
104 2
        $this->id = $value;
105
106 2
        return $this;
107
    }
108
109
    /**
110
     * {@see renderInPlace}
111
     *
112
     * @param boolean $value
113
     *
114
     * @return $this
115
     */
116 1
    public function renderInPlace(bool $value): self
117
    {
118 1
        $this->renderInPlace = $value;
119
120 1
        return $this;
121
    }
122
}
123