2
2
3
3
namespace Oro \Bundle \EntityExtendBundle \Grid ;
4
4
5
- use Doctrine \ORM \Query \Expr \From ;
6
- use Doctrine \ORM \QueryBuilder ;
7
-
8
5
use Oro \Bundle \DataGridBundle \Datagrid \DatagridGuesser ;
9
6
use Oro \Bundle \DataGridBundle \Datagrid \Common \DatagridConfiguration ;
10
- use Oro \Bundle \DataGridBundle \Datasource \DatasourceInterface ;
11
7
use Oro \Bundle \DataGridBundle \Datasource \Orm \OrmDatasource ;
12
8
use Oro \Bundle \DataGridBundle \Extension \AbstractExtension ;
13
9
use Oro \Bundle \DataGridBundle \Extension \Formatter \Configuration as FormatterConfiguration ;
@@ -63,6 +59,10 @@ public function isApplicable(DatagridConfiguration $config)
63
59
public function processConfigs (DatagridConfiguration $ config )
64
60
{
65
61
$ fields = $ this ->getFields ($ config );
62
+ if (empty ($ fields )) {
63
+ return ;
64
+ }
65
+
66
66
foreach ($ fields as $ field ) {
67
67
$ fieldName = $ field ->getFieldName ();
68
68
$ columnOptions =
@@ -83,48 +83,36 @@ public function processConfigs(DatagridConfiguration $config)
83
83
$ this ->prepareColumnOptions ($ field , $ columnOptions );
84
84
$ this ->datagridGuesser ->setColumnOptions ($ config , $ field ->getFieldName (), $ columnOptions );
85
85
}
86
- }
87
-
88
- /**
89
- * {@inheritdoc}
90
- */
91
- public function visitDatasource (DatagridConfiguration $ config , DatasourceInterface $ datasource )
92
- {
93
- $ fields = $ this ->getFields ($ config );
94
- if (empty ($ fields )) {
95
- return ;
96
- }
97
86
98
87
$ entityClassName = $ this ->entityClassResolver ->getEntityClass ($ this ->getEntityName ($ config ));
99
-
100
- /** @var QueryBuilder $qb */
101
- $ qb = $ datasource ->getQueryBuilder ();
102
- $ fromParts = $ qb ->getDQLPart ('from ' );
103
88
$ alias = false ;
104
-
105
- /** @var From $fromPart */
106
- foreach ($ fromParts as $ fromPart ) {
107
- if ($ this ->entityClassResolver ->getEntityClass ($ fromPart ->getFrom ()) == $ entityClassName ) {
108
- $ alias = $ fromPart ->getAlias ();
89
+ $ from = $ config ->offsetGetByPath ('[source][query][from] ' , []);
90
+ if ($ from ) {
91
+ foreach ($ from as $ part ) {
92
+ if ($ part ['table ' ] === $ entityClassName ) {
93
+ $ alias = $ part ['alias ' ];
94
+ }
109
95
}
110
96
}
111
97
112
98
if ($ alias === false ) {
113
- // add entity if it not exists in from clause
114
99
$ alias = 'o ' ;
115
- $ qb ->from ($ entityClassName , $ alias );
100
+ $ from [] = [
101
+ 'table ' => $ entityClassName ,
102
+ 'alias ' => $ alias
103
+ ];
104
+ $ config ->offsetSetByPath ('[source][query][from] ' , $ from );
116
105
}
117
106
118
- $ this ->buildExpression ($ fields , $ qb , $ config , $ alias );
107
+ $ this ->buildExpression ($ fields , $ config , $ alias );
119
108
}
120
109
121
110
/**
122
111
* @param FieldConfigId[] $fields
123
- * @param QueryBuilder $qb
124
112
* @param DatagridConfiguration $config
125
113
* @param string $alias
126
114
*/
127
- public function buildExpression (array $ fields , QueryBuilder $ qb , DatagridConfiguration $ config , $ alias )
115
+ public function buildExpression (array $ fields , DatagridConfiguration $ config , $ alias )
128
116
{
129
117
$ relationIndex = 0 ;
130
118
$ relationTemplate = 'auto_rel_%d ' ;
@@ -134,7 +122,10 @@ public function buildExpression(array $fields, QueryBuilder $qb, DatagridConfigu
134
122
case 'enum ' :
135
123
$ extendFieldConfig = $ this ->getFieldConfig ('extend ' , $ field );
136
124
$ joinAlias = sprintf ($ relationTemplate , ++$ relationIndex );
137
- $ qb ->leftJoin (sprintf ('%s.%s ' , $ alias , $ fieldName ), $ joinAlias );
125
+ $ config ->offsetAddToArrayByPath (
126
+ '[source][query][join][left] ' ,
127
+ [['join ' => sprintf ('%s.%s ' , $ alias , $ fieldName ), 'alias ' => $ joinAlias ]]
128
+ );
138
129
$ columnDataName = $ fieldName ;
139
130
$ sorterDataName = sprintf ('%s.%s ' , $ joinAlias , $ extendFieldConfig ->get ('target_field ' ));
140
131
$ selectExpr = sprintf ('IDENTITY(%s.%s) as %s ' , $ alias , $ fieldName , $ fieldName );
@@ -148,15 +139,22 @@ public function buildExpression(array $fields, QueryBuilder $qb, DatagridConfigu
148
139
break ;
149
140
case RelationType::MANY_TO_ONE :
150
141
case RelationType::ONE_TO_ONE :
151
- case RelationType::TO_ONE :
152
142
$ extendFieldConfig = $ this ->getFieldConfig ('extend ' , $ field );
153
- $ qb ->leftJoin (sprintf ('%s.%s ' , $ alias , $ fieldName ), $ fieldName );
143
+ $ config ->offsetAddToArrayByPath (
144
+ '[source][query][join][left] ' ,
145
+ [['join ' => sprintf ('%s.%s ' , $ alias , $ fieldName ), 'alias ' => $ fieldName ]]
146
+ );
154
147
155
148
$ dataName = $ fieldName .'_data ' ;
156
- $ targetField = $ extendFieldConfig ->get ('target_field ' );
149
+ $ targetField = $ extendFieldConfig ->get ('target_field ' , false , ' id ' );
157
150
$ dataFieldName = sprintf ('%s.%s ' , $ fieldName , $ targetField );
158
- if ($ qb ->getDQLPart ('groupBy ' )) {
159
- $ qb ->addGroupBy ($ dataFieldName );
151
+
152
+ $ groupBy = $ config ->offsetGetByPath ('[source][query][groupBy] ' );
153
+ if ($ groupBy ) {
154
+ $ config ->offsetSetByPath (
155
+ '[source][query][groupBy] ' ,
156
+ implode (', ' , [$ groupBy , $ dataFieldName ])
157
+ );
160
158
}
161
159
$ selectExpr = sprintf ('%s as %s ' , $ dataFieldName , $ dataName );
162
160
$ columnDataName = $ sorterDataName = $ dataName ;
@@ -168,7 +166,7 @@ public function buildExpression(array $fields, QueryBuilder $qb, DatagridConfigu
168
166
break ;
169
167
}
170
168
171
- $ qb -> addSelect ( $ selectExpr );
169
+ $ config -> offsetAddToArrayByPath ( ' [source][query][select] ' , [ $ selectExpr] );
172
170
173
171
// set real "data name" for filters and sorters
174
172
$ config ->offsetSetByPath (
0 commit comments