1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
iblock.php
См. документацию.
1<?php
2
7
8class 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 {
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
276
277 if (
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
Определения actionsdefinitions.php:38
static getConnection($name="")
Определения application.php:638
Определения access.php:15
Определения iblock.php:10
static FilterCreate($field_name, $values, $type, $cOperationType=false, $bSkipEmpty=true)
Определения iblock.php:2568
static MkOperationFilter($key)
Определения iblock.php:2522
Определения iblock.php:9
_Add($ID)
Определения iblock.php:271
static _Order($by, $order, $default_order, $nullable=true)
Определения iblock.php:409
static _Upper($str)
Определения iblock.php:266
static GetList($arOrder=Array("SORT"=>"ASC"), $arFilter=Array(), $bIncCnt=false)
Определения iblock.php:13
static _NotEmpty($column)
Определения iblock.php:438
$str
Определения commerceml2.php:63
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
if($ajaxMode) $ID
Определения get_user.php:27
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$val
Определения options.php:1793
$arFilter
Определения user_search.php:106
$fields
Определения yandex_run.php:501