forked from sonata-project/SonataAdminBundle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDatagridMapper.php
128 lines (110 loc) · 3.54 KB
/
DatagridMapper.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
/*
* This file is part of the Sonata Project package.
*
* (c) Thomas Rabaix <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Sonata\AdminBundle\Datagrid;
use Sonata\AdminBundle\Admin\AdminInterface;
use Sonata\AdminBundle\Admin\FieldDescriptionInterface;
use Sonata\AdminBundle\Builder\DatagridBuilderInterface;
use Sonata\AdminBundle\Mapper\BaseMapper;
/**
* Class DatagridMapper
* This class is use to simulate the Form API.
*
* @author Thomas Rabaix <[email protected]>
*/
class DatagridMapper extends BaseMapper
{
/**
* @var DatagridInterface
*/
protected $datagrid;
/**
* @param DatagridBuilderInterface $datagridBuilder
* @param DatagridInterface $datagrid
* @param AdminInterface $admin
*/
public function __construct(DatagridBuilderInterface $datagridBuilder, DatagridInterface $datagrid, AdminInterface $admin)
{
parent::__construct($datagridBuilder, $admin);
$this->datagrid = $datagrid;
}
/**
* @throws \RuntimeException
*
* @param string $name
* @param string $type
* @param array $filterOptions
* @param string $fieldType
* @param array $fieldOptions
* @param array $fieldDescriptionOptions
*
* @return DatagridMapper
*/
public function add($name, $type = null, array $filterOptions = array(), $fieldType = null, $fieldOptions = null, array $fieldDescriptionOptions = array())
{
if (is_array($fieldOptions)) {
$filterOptions['field_options'] = $fieldOptions;
}
if ($fieldType) {
$filterOptions['field_type'] = $fieldType;
}
if ($name instanceof FieldDescriptionInterface) {
$fieldDescription = $name;
$fieldDescription->mergeOptions($filterOptions);
} elseif (is_string($name)) {
if ($this->admin->hasFilterFieldDescription($name)) {
throw new \RuntimeException(sprintf('Duplicate field name "%s" in datagrid mapper. Names should be unique.', $name));
}
if (!isset($filterOptions['field_name'])) {
$filterOptions['field_name'] = substr(strrchr('.'.$name, '.'), 1);
}
$fieldDescription = $this->admin->getModelManager()->getNewFieldDescriptionInstance(
$this->admin->getClass(),
$name,
array_merge($filterOptions, $fieldDescriptionOptions)
);
} else {
throw new \RuntimeException('Unknown field name in datagrid mapper. Field name should be either of FieldDescriptionInterface interface or string.');
}
// add the field with the DatagridBuilder
$this->builder->addFilter($this->datagrid, $type, $fieldDescription, $this->admin);
return $this;
}
/**
* {@inheritdoc}
*/
public function get($name)
{
return $this->datagrid->getFilter($name);
}
/**
* {@inheritdoc}
*/
public function has($key)
{
return $this->datagrid->hasFilter($key);
}
/**
* {@inheritdoc}
*/
public function remove($key)
{
$this->admin->removeFilterFieldDescription($key);
$this->datagrid->removeFilter($key);
return $this;
}
/**
* {@inheritdoc}
*/
public function reorder(array $keys)
{
$this->datagrid->reorderFilters($keys);
return $this;
}
}