3
3
namespace suql \syntax ;
4
4
5
5
use sagittaracc \Html ;
6
+ use suql \dom \Dom ;
7
+ use suql \dom \Path ;
8
+ use suql \dom \Variable ;
6
9
use suql \syntax \field \Field ;
7
10
use suql \syntax \parser \Tsml ;
8
11
@@ -77,6 +80,7 @@ public static function template($file, SuQLParser $parser = null)
77
80
$ html = '' ;
78
81
$ js = '' ;
79
82
$ jsConfig = [];
83
+ $ dom = new Dom ();
80
84
81
85
if (is_null ($ parser )) {
82
86
$ parser = new Tsml ;
@@ -87,8 +91,8 @@ public static function template($file, SuQLParser $parser = null)
87
91
foreach ($ template as $ root => $ view ) {
88
92
list ($ rootElement , $ namespace ) = explode ('@ ' , $ root );
89
93
$ view ['id ' ] = $ namespace ;
90
- $ html = self ::parseTemplate ($ namespace , $ rootElement , $ view , $ jsConfig );
91
- $ js = self ::generateJs ($ namespace , $ jsConfig );
94
+ $ html = self ::parseTemplate ($ namespace , $ rootElement , $ view , $ dom );
95
+ $ js = self ::generateJs ($ namespace , $ dom );
92
96
}
93
97
94
98
return $ html . $ js ;
@@ -98,13 +102,13 @@ public static function template($file, SuQLParser $parser = null)
98
102
* @param string $namespace заданная пользователем namespace блока
99
103
* @param string $parent html tag родителя
100
104
* @param array $children вложенные элементы в parent
101
- * @param array $jsConfig генерируемые по ходу связи между используемыми переменными шаблона и участками их в DOM
105
+ * @param \suql\dom\Dom $dom генерируемые по ходу связи между используемыми переменными шаблона и участками их в DOM
102
106
* @return string html
103
107
*/
104
- private static function parseTemplate ($ namespace , $ parent , $ children , & $ jsConfig )
108
+ private static function parseTemplate ($ namespace , $ parent , $ children , $ dom )
105
109
{
106
- $ content = self ::getContent ($ namespace , $ children , $ jsConfig );
107
- $ attributes = self ::getAttributes ($ namespace , $ children , $ jsConfig );
110
+ $ content = self ::getContent ($ namespace , $ children , $ dom );
111
+ $ attributes = self ::getAttributes ($ namespace , $ children , $ dom );
108
112
return
109
113
is_null ($ parent )
110
114
? $ content
@@ -125,21 +129,25 @@ private static function attachClassToElement(&$dom)
125
129
* Получает все атрибуты
126
130
* @param string $namespace
127
131
* @param array $children вложенные элементы (атрибуты и контент вместе)
128
- * @param array $jsConfig генерируемые по ходу связи между используемыми переменными шаблона и участками их в DOM
132
+ * @param \suql\dom\Dom $dom генерируемые по ходу связи между используемыми переменными шаблона и участками их в DOM
129
133
* @return array массив атрибутов (сырых и конвертированных из спец атрибутов sg)
130
134
*/
131
- private static function getAttributes ($ namespace , $ children , & $ jsConfig )
135
+ private static function getAttributes ($ namespace , $ children , $ dom )
132
136
{
133
137
$ list = [];
134
138
$ sgAttributes = [
135
139
'sg-click ' => function ($ namespace , $ value ) {
136
140
return ['onclick ' => "$ namespace. $ value " ];
137
141
},
138
- 'sg-model ' => function ($ namespace , $ value ) use ($ children , & $ jsConfig ) {
142
+ 'sg-model ' => function ($ namespace , $ varName ) use ($ children , $ dom ) {
139
143
$ class = self ::attachClassToElement ($ children );
140
- self ::addJsVariable ($ jsConfig , $ value , "$ namespace> $ class " );
144
+ $ format = 'value ' ;
145
+ $ var = new Variable ($ varName );
146
+ $ path = new Path ("$ namespace> $ class " , $ format );
147
+ $ var ->addPath ($ path );
148
+ $ dom ->addVariable ($ var );
141
149
return [
142
- 'onkeyup ' => "assign( $ namespace. $ value , this.value) " ,
150
+ 'onkeyup ' => "assign( $ namespace. $ varName , this.value) " ,
143
151
'class ' => $ class ,
144
152
];
145
153
},
@@ -162,79 +170,54 @@ private static function getAttributes($namespace, $children, &$jsConfig)
162
170
* Генерирует html контент
163
171
* @param string $namespace основной namespace
164
172
* @param array $children все дочерние элементы из которых генерируем
165
- * @param array $jsConfig будущая конфигурация для генерации js
173
+ * @param \suql\dom\Dom $dom будущая конфигурация для генерации js
166
174
* @return string html
167
175
*/
168
- private static function getContent ($ namespace , &$ children , & $ jsConfig )
176
+ private static function getContent ($ namespace , &$ children , $ dom )
169
177
{
170
178
$ html = '' ;
171
179
172
180
foreach ($ children as $ key => $ value ) {
173
181
// Template variable
174
182
if (preg_match ('/\{\{(\w+)\}\}/ ' , $ key , $ matches )) {
175
183
$ class = self ::attachClassToElement ($ children );
176
- $ template = !empty ($ value ) ? self ::parseTemplate ($ namespace , null , $ value , $ jsConfig ) : null ;
177
- $ variable = $ matches [1 ];
178
- self ::addJsVariable ($ jsConfig , $ variable , "$ namespace> $ class " , $ template );
184
+ $ template = !empty ($ value ) ? self ::parseTemplate ($ namespace , null , $ value , $ dom ) : null ;
185
+ $ format = is_null ($ template ) ? 'raw ' : 'html ' ;
186
+ $ varName = $ matches [1 ];
187
+ $ var = new Variable ($ varName );
188
+ $ path = new Path ("$ namespace> $ class " , $ format , $ template );
189
+ $ var ->addPath ($ path );
190
+ $ dom ->addVariable ($ var );
179
191
$ html = '' ;
180
192
}
181
193
// Template function
182
194
else if (preg_match ('/\{\{\w+\(\)\}\}/ ' , $ key )) {
183
195
$ class = self ::attachClassToElement ($ children );
184
- $ template = !empty ($ value ) ? self ::parseTemplate ($ namespace , null , $ value , $ jsConfig ) : null ;
196
+ $ template = !empty ($ value ) ? self ::parseTemplate ($ namespace , null , $ value , $ dom ) : null ;
185
197
}
186
198
else {
187
199
if (is_array ($ value )) {
188
200
if (empty ($ value )) {
189
201
$ html .= $ key ;
190
202
}
191
203
else {
192
- $ html .= self ::parseTemplate ($ namespace , $ key , $ value , $ jsConfig );
204
+ $ html .= self ::parseTemplate ($ namespace , $ key , $ value , $ dom );
193
205
}
194
206
}
195
207
}
196
208
}
197
209
198
210
return $ html ;
199
211
}
200
- /**
201
- * Добавляет js template variable
202
- * @param array $jsConfig будущая конфигурация для генерации js
203
- * @param string $variable
204
- * @param string $path
205
- * @param string $template
206
- */
207
- private static function addJsVariable (&$ jsConfig , $ variable , $ path = null , $ template = null )
208
- {
209
- if (!isset ($ jsConfig [$ variable ])) {
210
- $ jsConfig [$ variable ] = [
211
- 'value ' => null ,
212
- 'paths ' => [],
213
- ];
214
- }
215
-
216
- if (!is_null ($ path )) {
217
- $ jsConfig [$ variable ]['paths ' ][$ path ] = [
218
- 'format ' => 'raw ' ,
219
- ];
220
- }
221
-
222
- if (!is_null ($ template )) {
223
- $ jsConfig [$ variable ]['paths ' ][$ path ] = [
224
- 'format ' => 'html ' ,
225
- 'template ' => $ template ,
226
- ];
227
- }
228
- }
229
212
/**
230
213
* Генерация дополнительного js
231
214
* @param string $namespace основной namespace
232
- * @param array $jsConfig конфигурация для js
215
+ * @param \suql\dom\Dom $dom конфигурация для js
233
216
* @return string script tag
234
217
*/
235
- private static function generateJs ($ namespace , $ jsConfig )
218
+ private static function generateJs ($ namespace , $ dom )
236
219
{
237
220
$ list = [];
238
- return Html::tag ('script ' , ['type ' => 'text/javascript ' ], "window. $ namespace = " . json_encode ($ jsConfig ));
221
+ return Html::tag ('script ' , ['type ' => 'text/javascript ' ], "window. $ namespace = " . json_encode ($ dom -> getVariables () ));
239
222
}
240
223
}
0 commit comments