• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CPS-IT / handlebars-forms / 23788866234

31 Mar 2026 08:52AM UTC coverage: 0.659% (-0.06%) from 0.72%
23788866234

push

github

web-flow
Merge pull request #18 from CPS-IT/feature/view-models

0 of 163 new or added lines in 33 files covered. (0.0%)

7 of 1062 relevant lines covered (0.66%)

0.03 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/Classes/Domain/ViewModel/Builder/AbstractViewModelBuilder.php
1
<?php
2

3
declare(strict_types=1);
4

5
/*
6
 * This file is part of the TYPO3 CMS extension "handlebars_forms".
7
 *
8
 * It is free software; you can redistribute it and/or modify it under
9
 * the terms of the GNU General Public License, either version 2
10
 * of the License, or any later version.
11
 *
12
 * For the full copyright and license information, please read the
13
 * LICENSE.txt file that was distributed with this source code.
14
 *
15
 * The TYPO3 project - inspiring people to share!
16
 */
17

18
namespace CPSIT\Typo3HandlebarsForms\Domain\ViewModel\Builder;
19

20
use CPSIT\Typo3HandlebarsForms\Domain;
21
use CPSIT\Typo3HandlebarsForms\Fluid\ViewHelperInvoker;
22
use TYPO3\CMS\Fluid;
23
use TYPO3\CMS\Form;
24

25
/**
26
 * AbstractViewModelBuilder
27
 *
28
 * @author Elias Häußler <e.haeussler@familie-redlich.de>
29
 * @license GPL-2.0-or-later
30
 *
31
 * @template T of Form\Domain\Model\Renderable\RootRenderableInterface
32
 * @implements ViewModelBuilder<T>
33
 */
34
abstract class AbstractViewModelBuilder implements ViewModelBuilder
35
{
36
    /**
37
     * @var list<non-empty-string>
38
     */
39
    protected array $supportedTypes = [];
40

41
    public function __construct(
×
42
        protected readonly ViewHelperInvoker $viewHelperInvoker,
43
    ) {}
×
44

45
    public function build(
×
46
        Form\Domain\Model\Renderable\RootRenderableInterface $renderable,
47
        Fluid\Core\Rendering\RenderingContext $renderingContext,
48
    ): Domain\ViewModel\ViewModel {
49
        $viewModel = null;
×
50
        $result = $this->viewHelperInvoker->invoke(
×
51
            $renderingContext,
×
52
            Form\ViewHelpers\RenderRenderableViewHelper::class,
×
53
            ['renderable' => $renderable],
×
54
            function () use ($renderable, $renderingContext, &$viewModel) {
×
55
                $viewModel = $this->renderRenderable($renderable, $renderingContext);
×
56

57
                return '';
×
58
            },
×
59
        );
×
60

NEW
61
        if (!($viewModel instanceof Domain\ViewModel\ViewModel)) {
×
NEW
62
            $viewModel = new Domain\ViewModel\ViewHelperContainedViewModel($renderable, $result);
×
63
        }
64

NEW
65
        $this->applyGridColumnClasses($renderable, $viewModel, $renderingContext);
×
66

67
        return $viewModel;
×
68
    }
69

70
    /**
71
     * @param T $renderable
72
     */
73
    protected function renderRenderable(
×
74
        Form\Domain\Model\Renderable\RootRenderableInterface $renderable,
75
        Fluid\Core\Rendering\RenderingContext $renderingContext,
76
    ): ?Domain\ViewModel\ViewModel {
77
        return null;
×
78
    }
79

80
    public function supports(Form\Domain\Model\Renderable\RootRenderableInterface $renderable): bool
×
81
    {
82
        return in_array($renderable->getType(), $this->supportedTypes, true);
×
83
    }
84

85
    /**
86
     * @param T $renderable
87
     * @return array<string|int, mixed>
88
     */
89
    protected function renderAdditionalAttributes(
×
90
        Form\Domain\Model\Renderable\RootRenderableInterface $renderable,
91
        Fluid\Core\Rendering\RenderingContext $renderingContext,
92
    ): array {
93
        $content = $this->viewHelperInvoker->translateElementProperty(
×
94
            $renderingContext,
×
95
            $renderable,
×
96
            'fluidAdditionalAttributes',
×
97
        );
×
98

99
        if (!is_array($content)) {
×
100
            return [];
×
101
        }
102

103
        return $content;
×
104
    }
105

106
    /**
107
     * @param T $renderable
108
     */
109
    protected function applyGridColumnClasses(
×
110
        Form\Domain\Model\Renderable\RootRenderableInterface $renderable,
111
        Domain\ViewModel\ViewModel $viewModel,
112
        Fluid\Core\Rendering\RenderingContext $renderingContext,
113
    ): void {
114
        if (!($renderable instanceof Form\Domain\Model\Renderable\RenderableInterface)) {
×
115
            return;
×
116
        }
117

118
        if (!($renderable->getParentRenderable() instanceof Form\Domain\Model\FormElements\GridRowInterface)) {
×
119
            return;
×
120
        }
121

122
        $gridResult = $this->viewHelperInvoker->invoke(
×
NEW
123
            $renderingContext,
×
124
            Form\ViewHelpers\GridColumnClassAutoConfigurationViewHelper::class,
×
125
            [
×
126
                'element' => $renderable,
×
127
            ],
×
128
        );
×
129

NEW
130
        if (is_string($gridResult->content) && $viewModel instanceof Domain\ViewModel\TagAwareViewModel) {
×
NEW
131
            $tag = $viewModel->getTag();
×
NEW
132
            $tag->addAttribute(
×
133
                'class',
×
NEW
134
                trim($tag->getAttribute('class') . ' ' . $gridResult->content),
×
135
            );
×
136
        }
137
    }
138
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc