/
Tpl.php
189 lines (172 loc) · 6.88 KB
/
Tpl.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?php
namespace infrajs\layer\tpl;
use infrajs\controller\Layer;
use infrajs\access\Access;
use infrajs\template\Template;
use infrajs\controller\Each;
class Tpl
{
public static function tplroottpl(&$layer)
{
$prop = 'tplroot';
$proptpl = $prop.'tpl';
if (!isset($layer[$proptpl])) {
return;
}
$p = $layer[$proptpl];
if (is_array($layer[$proptpl])) {
$p = Template::parse($p, $layer);
$layer[$prop] = array($p);
} else {
$layer[$prop] = Template::parse(array($p), $layer);
}
}
public static function dataroottpl(&$layer)
{
$prop = 'dataroot';
$proptpl = $prop.'tpl';
if (!isset($layer[$proptpl])) {
return;
}
$p = $layer[$proptpl];
$layer[$prop] = Template::parse(array($p), $layer);
}
public static function tpltpl(&$layer)
{
$prop = 'tpl';
$proptpl = $prop.'tpl';
if (@!$layer[$proptpl]) {
return;
}
$p = $layer[$proptpl];
$ar = is_array($p);
if (!$ar) {
$p = array($p);
}
$p = Template::parse($p, $layer);
if ($ar) {
$layer[$prop] = array($p);
} else {
$layer[$prop] = $p;
}
}
public static function jsontpl(&$layer)
{
$prop = 'json';
$proptpl = $prop.'tpl';
if (@!$layer[$proptpl]) {
return;
}
$p = $layer[$proptpl];
$ar = is_array($p);
if (!$ar) {
$p = array($p);
}
$p = Template::parse($p, $layer);
if ($ar) {
$layer[$prop] = array($p);
} else {
$layer[$prop] = $p;
}
}
public static function &getData(&$layer)
{
//Используется в propcheck.js
if (!isset($layer['json'])) {
return $layer['data'];
}
$data = @$layer['json'];
if (Each::isAssoc($data) === false) {
//Если массив то это просто строка в виде данных
$data = Load::loadTEXT($data[0]);
} elseif (is_string($data)) {
$data = &Load::loadJSON($data);//Забираем для текущего клиента что-то..
}
return $data;
}
public static function getTpl(&$layer)
{
$tpl = $layer['tpl'];
if (is_string($tpl)) {
$tpl = Load::loadTEXT($tpl);//M доп параметры после :
} elseif (is_array($tpl)) {
$tpl = $tpl[0];
} else {
$tpl = '';
}
if (!$tpl) {
$tpl = '';
}
return $tpl;
}
public static function getHtml(&$layer)
{
//Вызывается как для основных так и для подслойв tpls frame. Расширяется в tpltpl.prop.js
//if(@$layer['tplclient'])return '';
$row = Layer::parsed($layer);
//$row=$_SERVER['QUERY_STRING'],$layer['id'];
//Нельзя кэшировать слои в которых показываются динамические данные, данные пользователя определяется заголовком у данных
//Кэш создаётся от любого пользователя.
//Чтобы узнать что кэш делать не нужно... это знают данные они либо js либо php
//При загрузки данных те должны выкидывать заголовки не кэшировать, либо не выкидывать если это просто парсер Excel
//Нас интересует зависит ли html слоя от пользователя, если зависит кэшировать нельзя
//Зависит если используется $_SESSION, infra_session, infra_admin
//примечательно что конект к базе не запрещает кэширование этого слоя
//Узнавать о всём этом мы будем по заголовкам
//Так чтобы следующий слой взялся уже нормально заголовки нужно заменять...
//Тем более заменять заголовки нужно в любом случае если кэшируется чтобы и браузер кэшировал
//Проблема при первом session_get конект к базе и вызов session_init в следующем подключении init не вызывается
//но для следующего подключения нам нужно понять что есть динамика// По этому загловки отправляются в том числе и руками в скритпах Cache-Control:no-cache
$html = Access::adminCache('infrajs_getHtml', function () use (&$layer) {
//Здесь мог быть установлен infrajs['com'] его тоже нужно вернуть/ А вот после loadTEXT мог быть кэш и ничего не установится
$html = Tpl::_getHtml($layer);
return $html;
}, array($row));//Кэш обновляемый с последней авторизацией админа определяется строкой parsed слоя
return $html;
}
public static function _getHtml(&$layer)
{
//Вызывается как для основных так и для подслойв tpls frame. Расширяется в tpltpl.prop.js
if (@$layer['data'] || @$layer['json'] || @$layer['tpls'] || @$layer['tplroot']) {
$tpls = Template::make($layer['tpl']);//С кэшем перепарсивания
Template::includes($tpls);
$repls = array();//- подшаблоны для замены, Важно, что оригинальный распаршеный шаблон не изменяется
Each::fora($layer['tplsm'], function ($tm) use (&$repls) {
//mix tpl
$t = Template::make($tm);//С кэшем перепарсивания
array_push($repls, $t);
//for(var i in t)repls[i]=t[i];//Нельзя подменять в оригинальном шаблоне, который в других местах может использоваться без подмен
//^ из-за этого обработчики указанные в tplsm срабатывают постоянно, так как нельзя поставить отметку о том что обработчик сохранён
});
$layer['data'] = &self::getData($layer);//подменили строку data на объект data
$alltpls = array(&$repls,&$tpls);
$html = Template::exec($alltpls, $layer, @$layer['tplroot'], @$layer['dataroot']);
} else {
$tpl = self::getTpl($layer);
$html = $tpl;
}
if (!$html) {
$html = '';
}
return $html;
}
public static function jsoncheck(&$layer)
{
if (@$layer['data'] && !is_null(@$layer['jsoncheck'])) {
$data = &infrajs_getData($layer);
if (@$layer['jsoncheck']) {
//Если true значит да только если данные есть
if (!$data || (!is_null($data['result']) && !$data['result'])) {
return false;
}
} elseif (@!$layer['jsoncheck']) {
//Если false Значит да только если данных нет
if (!$data || !$data['result']) {
return;
} else {
return false;
}
}
}
}
}