/
ShowBuilder.php
102 lines (85 loc) · 3 KB
/
ShowBuilder.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
declare(strict_types=1);
/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sonata\DoctrineMongoDBAdminBundle\Builder;
use Sonata\AdminBundle\Builder\ShowBuilderInterface;
use Sonata\AdminBundle\FieldDescription\FieldDescriptionCollection;
use Sonata\AdminBundle\FieldDescription\FieldDescriptionInterface;
use Sonata\AdminBundle\FieldDescription\TypeGuesserInterface;
/**
* @psalm-suppress DeprecatedInterface
*
* @see https://github.com/sonata-project/SonataAdminBundle/pull/7519
*/
final class ShowBuilder implements ShowBuilderInterface
{
/**
* @var TypeGuesserInterface
*/
private $guesser;
/**
* @var string[]
*/
private $templates;
/**
* @param string[] $templates
*/
public function __construct(TypeGuesserInterface $guesser, array $templates)
{
$this->guesser = $guesser;
$this->templates = $templates;
}
public function getBaseList(array $options = []): FieldDescriptionCollection
{
return new FieldDescriptionCollection();
}
public function addField(
FieldDescriptionCollection $list,
?string $type,
FieldDescriptionInterface $fieldDescription
): void {
if (null === $type) {
$guessType = $this->guesser->guess($fieldDescription);
if (null === $guessType) {
throw new \InvalidArgumentException(sprintf(
'Cannot guess a type for the field description "%s", you MUST provide a type.',
$fieldDescription->getName()
));
}
$fieldDescription->setType($guessType->getType());
} else {
$fieldDescription->setType($type);
}
$this->fixFieldDescription($fieldDescription);
$fieldDescription->getAdmin()->addShowFieldDescription($fieldDescription->getName(), $fieldDescription);
$list->add($fieldDescription);
}
public function fixFieldDescription(FieldDescriptionInterface $fieldDescription): void
{
$type = $fieldDescription->getType();
if (null === $type) {
throw new \RuntimeException(sprintf('Please define a type for field `%s` in `%s`', $fieldDescription->getName(), \get_class($fieldDescription->getAdmin())));
}
$fieldDescription->setOption('label', $fieldDescription->getOption('label', $fieldDescription->getName()));
if (null === $fieldDescription->getTemplate()) {
$fieldDescription->setTemplate($this->getTemplate($type));
}
if ($fieldDescription->describesAssociation()) {
$fieldDescription->getAdmin()->attachAdminClass($fieldDescription);
}
}
/**
* @param int|string $type
*/
private function getTemplate($type): ?string
{
return $this->templates[$type] ?? null;
}
}