1C-Bitrix
25.700.0
Загрузка...
Поиск...
Не найдено
iblock.php
См. документацию.
1
<?php
2
3
use
Bitrix\Main\Application
;
4
use
Bitrix\Main\DB\MysqlCommonConnection
;
5
use
Bitrix\Main\DB\SqlQueryException
;
6
use
Bitrix\Main\ORM\Fields
;
7
8
class
CIBlock
extends
CAllIBlock
9
{
11
// List of blocks
13
public
static
function
GetList
($arOrder=Array(
"SORT"
=>
"ASC"
),
$arFilter
=Array(), $bIncCnt =
false
)
14
{
15
global
$DB
,
$USER
;
16
17
$strSqlSearch =
""
;
18
$bAddSites =
false
;
19
foreach
(
$arFilter
as
$key
=>
$val
)
20
{
21
$res
=
CIBlock::MkOperationFilter
(
$key
);
22
$key
= mb_strtoupper(
$res
[
"FIELD"
]);
23
$cOperationType =
$res
[
"OPERATION"
];
24
25
switch
(
$key
)
26
{
27
case
"ACTIVE"
:
28
$sql =
CIBlock::FilterCreate
(
"B.ACTIVE"
,
$val
,
"string_equal"
, $cOperationType);
29
break
;
30
case
"LID"
:
31
case
"SITE_ID"
:
32
$sql =
CIBlock::FilterCreate
(
"BS.SITE_ID"
,
$val
,
"string_equal"
, $cOperationType);
33
if
($sql <>
''
)
34
{
35
$bAddSites =
true
;
36
}
37
break
;
38
case
"NAME"
:
39
case
"CODE"
:
40
case
"XML_ID"
:
41
case
"PROPERTY_INDEX"
:
42
$sql =
CIBlock::FilterCreate
(
"B."
.
$key
,
$val
,
"string"
, $cOperationType);
43
break
;
44
case
"EXTERNAL_ID"
:
45
$sql =
CIBlock::FilterCreate
(
"B.XML_ID"
,
$val
,
"string"
, $cOperationType);
46
break
;
47
case
"TYPE"
:
48
$sql =
CIBlock::FilterCreate
(
"B.IBLOCK_TYPE_ID"
,
$val
,
"string"
, $cOperationType);
49
break
;
50
case
"ID"
:
51
case
"VERSION"
:
52
case
"SOCNET_GROUP_ID"
:
53
$sql =
CIBlock::FilterCreate
(
"B."
.
$key
,
$val
,
"number"
, $cOperationType);
54
break
;
55
default
:
56
$sql =
""
;
57
break
;
58
}
59
60
if
($sql <>
''
)
61
{
62
$strSqlSearch .=
" AND ("
.$sql.
") "
;
63
}
64
}
65
66
$bCheckPermissions =
67
!array_key_exists(
"CHECK_PERMISSIONS"
,
$arFilter
)
68
||
$arFilter
[
"CHECK_PERMISSIONS"
] !==
"N"
69
|| array_key_exists(
"OPERATION"
,
$arFilter
)
70
;
71
$bIsAdmin = is_object(
$USER
) &&
$USER
->IsAdmin();
72
$permissionsBy =
null
;
73
if
($bCheckPermissions && isset(
$arFilter
[
'PERMISSIONS_BY'
]))
74
{
75
$permissionsBy = (int)
$arFilter
[
'PERMISSIONS_BY'
];
76
if
($permissionsBy < 0)
77
$permissionsBy =
null
;
78
}
79
if
($bCheckPermissions && ($permissionsBy !==
null
|| !$bIsAdmin))
80
{
81
$min_permission =
82
isset(
$arFilter
[
'MIN_PERMISSION'
]) && strlen(
$arFilter
[
'MIN_PERMISSION'
]) === 1
83
?
$arFilter
[
'MIN_PERMISSION'
]
84
: \CIBlockRights::PUBLIC_READ
85
;
86
87
if
($permissionsBy !==
null
)
88
{
89
$iUserID = $permissionsBy;
90
$strGroups = implode(
','
, CUser::GetUserGroup($permissionsBy));
91
$bAuthorized =
false
;
92
}
93
else
94
{
95
if
(is_object(
$USER
))
96
{
97
$iUserID = (int)
$USER
->GetID();
98
$strGroups =
$USER
->GetGroups();
99
$bAuthorized =
$USER
->IsAuthorized();
100
}
101
else
102
{
103
$iUserID = 0;
104
$strGroups =
"2"
;
105
$bAuthorized =
false
;
106
}
107
}
108
109
$stdPermissions =
"
110
SELECT IBLOCK_ID
111
FROM b_iblock_group IBG
112
WHERE IBG.GROUP_ID IN ("
.$strGroups.
")
113
AND IBG.PERMISSION >= '"
.$min_permission.
"'
114
"
;
115
if
(!defined(
"ADMIN_SECTION"
))
116
$stdPermissions .=
"
117
AND (IBG.PERMISSION='X' OR B.ACTIVE='Y')
118
"
;
119
120
if
(!empty(
$arFilter
[
"OPERATION"
]))
121
{
122
$operation =
"'"
.$DB->ForSql(
$arFilter
[
"OPERATION"
]).
"'"
;
123
}
124
elseif
($min_permission >=
"X"
)
125
{
126
$operation =
"'iblock_edit'"
;
127
}
128
elseif
($min_permission >=
"U"
)
129
{
130
$operation =
"'element_edit'"
;
131
}
132
elseif
($min_permission >=
"S"
)
133
{
134
$operation =
"'iblock_admin_display'"
;
135
}
136
else
137
{
138
$operation =
"'section_read', 'element_read', 'section_element_bind', 'section_section_bind'"
;
139
}
140
141
if
($operation)
142
{
143
$acc =
new
CAccess
;
144
$acc->UpdateCodes($permissionsBy !==
null
?
array
(
'USER_ID'
=> $permissionsBy) :
false
);
145
146
$extPermissions =
"
147
SELECT IBLOCK_ID
148
FROM b_iblock_right IBR
149
INNER JOIN b_task_operation T ON T.TASK_ID = IBR.TASK_ID
150
INNER JOIN b_operation O ON O.ID = T.OPERATION_ID
151
"
.($iUserID > 0?
"LEFT"
:
"INNER"
).
" JOIN b_user_access UA ON UA.ACCESS_CODE = IBR.GROUP_CODE AND UA.USER_ID = "
.$iUserID.
"
152
WHERE IBR.ENTITY_TYPE = 'iblock'
153
AND O.NAME in ("
.$operation.
")
154
"
.($bAuthorized || $iUserID > 0?
"AND (UA.USER_ID IS NOT NULL OR IBR.GROUP_CODE = 'AU')"
:
""
).
"
155
"
;
156
$sqlPermissions =
"AND (
157
B.ID IN ($stdPermissions)
158
OR (B.RIGHTS_MODE = 'E' AND B.ID IN ($extPermissions))
159
)"
;
160
}
161
else
162
{
163
$sqlPermissions =
"AND (
164
B.ID IN ($stdPermissions)
165
)"
;
166
}
167
}
168
else
169
{
170
$sqlPermissions =
""
;
171
}
172
173
if
($bAddSites)
174
$sqlJoinSites =
"LEFT JOIN b_iblock_site BS ON B.ID=BS.IBLOCK_ID
175
LEFT JOIN b_lang L ON L.LID=BS.SITE_ID"
;
176
else
177
$sqlJoinSites =
"INNER JOIN b_lang L ON L.LID=B.LID"
;
178
179
if
(!$bIncCnt)
180
{
181
$strSql =
"
182
SELECT DISTINCT
183
B.*
184
,B.XML_ID as EXTERNAL_ID
185
,"
.$DB->DateToCharFunction(
"B.TIMESTAMP_X"
).
" as TIMESTAMP_X
186
,L.DIR as LANG_DIR
187
,L.SERVER_NAME
188
FROM
189
b_iblock B
190
"
.$sqlJoinSites.
"
191
WHERE 1 = 1
192
"
.$sqlPermissions.
"
193
"
.$strSqlSearch.
"
194
"
;
195
}
196
else
197
{
198
$strSql =
"
199
SELECT
200
B.*
201
,B.XML_ID as EXTERNAL_ID
202
,"
.$DB->DateToCharFunction(
"B.TIMESTAMP_X"
).
" as TIMESTAMP_X
203
,L.DIR as LANG_DIR
204
,L.SERVER_NAME
205
,COUNT(DISTINCT BE.ID) as ELEMENT_CNT
206
FROM
207
b_iblock B
208
"
.$sqlJoinSites.
"
209
LEFT JOIN b_iblock_element BE ON (BE.IBLOCK_ID=B.ID
210
AND (
211
(BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL )
212
"
.((
$arFilter
[
"CNT_ALL"
] ??
'N'
) ===
"Y"
?
" OR BE.WF_NEW='Y' "
:
""
).
"
213
)
214
"
.((
$arFilter
[
"CNT_ACTIVE"
] ??
'N'
) ===
"Y"
?
215
"AND BE.ACTIVE='Y'
216
AND (BE.ACTIVE_TO >= "
.
$DB
->CurrentDateFunction().
" OR BE.ACTIVE_TO IS NULL)
217
AND (BE.ACTIVE_FROM <= "
.
$DB
->CurrentDateFunction().
" OR BE.ACTIVE_FROM IS NULL)
218
"
:
219
""
).
"
220
)
221
WHERE 1 = 1
222
"
.$sqlPermissions.
"
223
"
.$strSqlSearch.
"
224
GROUP BY B.ID
225
"
;
226
}
227
228
$arSqlOrder = Array();
229
if
(is_array($arOrder))
230
{
231
foreach
($arOrder as $by=>
$order
)
232
{
233
$by = mb_strtolower($by);
234
$order
= mb_strtolower(
$order
);
235
if
(
$order
!=
"asc"
)
236
$order
=
"desc"
;
237
238
if
($by ==
"id"
) $arSqlOrder[$by] =
" B.ID "
.$order.
" "
;
239
elseif
($by ==
"lid"
) $arSqlOrder[$by] =
" B.LID "
.$order.
" "
;
240
elseif
($by ==
"iblock_type"
) $arSqlOrder[$by] =
" B.IBLOCK_TYPE_ID "
.$order.
" "
;
241
elseif
($by ==
"name"
) $arSqlOrder[$by] =
" B.NAME "
.$order.
" "
;
242
elseif
($by ==
"active"
) $arSqlOrder[$by] =
" B.ACTIVE "
.$order.
" "
;
243
elseif
($by ==
"sort"
) $arSqlOrder[$by] =
" B.SORT "
.$order.
" "
;
244
elseif
($by ==
"code"
) $arSqlOrder[$by] =
" B.CODE "
.$order.
" "
;
245
elseif
($bIncCnt && $by ==
"element_cnt"
) $arSqlOrder[$by] =
" ELEMENT_CNT "
.$order.
" "
;
246
else
247
{
248
$by =
"timestamp_x"
;
249
$arSqlOrder[$by] =
" B.TIMESTAMP_X "
.$order.
" "
;
250
}
251
}
252
}
253
254
if
(!empty($arSqlOrder))
255
{
256
$strSqlOrder =
" ORDER BY "
. implode(
","
, $arSqlOrder);
257
}
258
else
259
{
260
$strSqlOrder =
""
;
261
}
262
263
return
$DB
->Query($strSql.$strSqlOrder);
264
}
265
266
public
static
function
_Upper
(
$str
)
267
{
268
return
$str
;
269
}
270
271
public
function
_Add
(
$ID
)
272
{
273
$ID
= (int)
$ID
;
274
275
$connection
=
Application::getConnection
();
276
277
if
(
278
$connection
instanceof
MysqlCommonConnection
279
&& defined(
'MYSQL_TABLE_TYPE'
)
280
&& MYSQL_TABLE_TYPE !==
''
281
)
282
{
283
// TODO: remove try-catch when mysql 8.0 will be minimal system requirement
284
try
285
{
286
$connection
->query(
'SET default_storage_engine = \''
. MYSQL_TABLE_TYPE .
'\''
);
287
}
288
catch
(
SqlQueryException
)
289
{
290
try
291
{
292
$connection
->query(
'SET storage_engine = \''
.MYSQL_TABLE_TYPE.
'\''
);
293
}
294
catch
(
SqlQueryException
)
295
{
296
297
}
298
}
299
}
300
301
$singleTableName = static::getSinglePropertyValuesTableName(
$ID
);
302
$multiTableName = static::getMultiplePropertyValuesTableName(
$ID
);
303
304
if
(!
$connection
->isTableExists($singleTableName))
305
{
306
$fields
= [
307
'IBLOCK_ELEMENT_ID'
=> (
new
Fields\IntegerField
(
'IBLOCK_ELEMENT_ID'
))
308
->configurePrimary()
309
,
310
];
311
$connection
->createTable($singleTableName,
$fields
, [
'IBLOCK_ELEMENT_ID'
]);
312
if
(!
$connection
->isTableExists($singleTableName))
313
{
314
return
false
;
315
}
316
}
317
318
if
(!
$connection
->isTableExists($multiTableName))
319
{
320
$fields
= [
321
'ID'
=> (
new
Fields\IntegerField
(
'ID'
))
322
->configurePrimary()
323
->configureAutocomplete()
324
->configureSize(8)
325
,
326
'IBLOCK_ELEMENT_ID'
=> (
new
Fields\IntegerField
(
'IBLOCK_ELEMENT_ID'
)),
327
'IBLOCK_PROPERTY_ID'
=> (
new
Fields
\
IntegerField
(
'IBLOCK_PROPERTY_ID'
)),
328
'VALUE'
=> (
new
Fields\TextField
(
'VALUE'
)),
329
'VALUE_ENUM'
=> (
new
Fields
\
IntegerField
(
'VALUE_ENUM'
))
330
->configureNullable()
331
,
332
'VALUE_NUM'
=> (
new
Fields\DecimalField
(
'VALUE_NUM'
))
333
->configureNullable()
334
->configurePrecision(18)
335
->configureScale(4)
336
,
337
'DESCRIPTION'
=> (
new
Fields\StringField
(
'DESCRIPTION'
))
338
->configureSize(255)
339
->configureNullable()
340
,
341
];
342
$connection
->createTable($multiTableName,
$fields
, [
'ID'
], [
'ID'
]);
343
if
(!
$connection
->isTableExists($multiTableName))
344
{
345
return
false
;
346
}
347
else
348
{
349
$connection
->createIndex(
350
$multiTableName,
351
'ix_iblock_elem_prop_m'
.
$ID
.
'_1'
,
352
[
353
'IBLOCK_ELEMENT_ID'
,
354
'IBLOCK_PROPERTY_ID'
,
355
]
356
);
357
$connection
->createIndex(
358
$multiTableName,
359
'ix_iblock_elem_prop_m'
.
$ID
.
'_2'
,
360
[
361
'IBLOCK_PROPERTY_ID'
,
362
]
363
);
364
$connection
->createIndex(
365
$multiTableName,
366
'ix_iblock_elem_prop_m'
.
$ID
.
'_3'
,
367
[
368
'VALUE_ENUM'
,
369
'IBLOCK_PROPERTY_ID'
,
370
]
371
);
372
}
373
}
374
375
return
true
;
376
377
/*
378
$strSql = '
379
CREATE TABLE IF NOT EXISTS b_iblock_element_prop_s' . $ID . ' (
380
IBLOCK_ELEMENT_ID int(11) not null,
381
primary key (IBLOCK_ELEMENT_ID)
382
)
383
';
384
$rs = $DB->DDL($strSql, false, $err_mess.__LINE__);
385
$strSql = '
386
CREATE TABLE IF NOT EXISTS b_iblock_element_prop_m' . $ID . ' (
387
ID bigint not null auto_increment,
388
IBLOCK_ELEMENT_ID int(11) not null,
389
IBLOCK_PROPERTY_ID int(11) not null,
390
VALUE text not null,
391
VALUE_ENUM int(11),
392
VALUE_NUM numeric(18,4),
393
DESCRIPTION VARCHAR(255) NULL,
394
PRIMARY KEY (ID),
395
INDEX ix_iblock_elem_prop_m' . $ID . '_1(IBLOCK_ELEMENT_ID,IBLOCK_PROPERTY_ID),
396
INDEX ix_iblock_elem_prop_m' . $ID . '_2(IBLOCK_PROPERTY_ID),
397
INDEX ix_iblock_elem_prop_m' . $ID . '_3(VALUE_ENUM,IBLOCK_PROPERTY_ID)
398
)
399
';
400
if ($rs)
401
{
402
$rs = $DB->DDL($strSql, false, $err_mess . __LINE__);
403
}
404
405
return $rs;
406
*/
407
}
408
409
public
static
function
_Order
($by,
$order
, $default_order, $nullable =
true
)
410
{
411
$o = parent::_Order($by,
$order
, $default_order, $nullable);
412
//$o[0] - bNullsFirst
413
//$o[1] - asc|desc
414
if
($o[0])
415
{
416
if
($o[1] ==
"asc"
)
417
{
418
return
$by.
" asc"
;
419
}
420
else
421
{
422
return
"length("
.$by.
")>0 asc, "
.$by.
" desc"
;
423
}
424
}
425
else
426
{
427
if
($o[1] ==
"asc"
)
428
{
429
return
"length("
.$by.
")>0 desc, "
.$by.
" asc"
;
430
}
431
else
432
{
433
return
$by.
" desc"
;
434
}
435
}
436
}
437
438
public
static
function
_NotEmpty
($column)
439
{
440
return
'case when '
. $column .
' is null then 0 else 1 end'
;
441
}
442
}
$connection
$connection
Определения
actionsdefinitions.php:38
Bitrix\Main\Application
Определения
application.php:30
Bitrix\Main\Application\getConnection
static getConnection($name="")
Определения
application.php:638
Bitrix\Main\DB\MysqlCommonConnection
Определения
mysqlcommonconnection.php:10
Bitrix\Main\DB\SqlQueryException
Определения
sqlqueryexception.php:9
Bitrix\Main\ORM\Fields\DecimalField
Определения
decimalfield.php:11
Bitrix\Main\ORM\Fields\IntegerField
Определения
integerfield.php:20
Bitrix\Main\ORM\Fields\StringField
Определения
stringfield.php:20
Bitrix\Main\ORM\Fields\TextField
Определения
textfield.php:20
CAccess
Определения
access.php:15
CAllIBlock
Определения
iblock.php:10
CAllIBlock\FilterCreate
static FilterCreate($field_name, $values, $type, $cOperationType=false, $bSkipEmpty=true)
Определения
iblock.php:2568
CAllIBlock\MkOperationFilter
static MkOperationFilter($key)
Определения
iblock.php:2522
CIBlock
Определения
iblock.php:9
CIBlock\_Add
_Add($ID)
Определения
iblock.php:271
CIBlock\_Order
static _Order($by, $order, $default_order, $nullable=true)
Определения
iblock.php:409
CIBlock\_Upper
static _Upper($str)
Определения
iblock.php:266
CIBlock\GetList
static GetList($arOrder=Array("SORT"=>"ASC"), $arFilter=Array(), $bIncCnt=false)
Определения
iblock.php:13
CIBlock\_NotEmpty
static _NotEmpty($column)
Определения
iblock.php:438
$str
$str
Определения
commerceml2.php:63
array
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения
file_new.php:804
$res
$res
Определения
filter_act.php:7
$ID
if($ajaxMode) $ID
Определения
get_user.php:27
$DB
global $DB
Определения
cron_frame.php:29
$USER
global $USER
Определения
csv_new_run.php:40
Bitrix\Main\ORM\Fields
Определения
arrayfield.php:9
$order
$order
Определения
payment.php:8
elseif
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения
prolog_main_admin.php:393
$key
if(empty($signedUserToken)) $key
Определения
quickway.php:257
$val
$val
Определения
options.php:1793
$arFilter
$arFilter
Определения
user_search.php:106
$fields
$fields
Определения
yandex_run.php:501
bitrix
modules
iblock
classes
mysql
iblock.php
Создано системой
1.14.0