1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
ilearngraphnode.php
См. документацию.
1<?php
2
13{
44 public static function Create ($arFields);
45
63 public static function Update ($id, $arFields);
64
74 public static function GetByID ($id);
75
82 public static function Remove ($id);
83}
84
94abstract class CLearnGraphNode implements ILearnGraphNode
95{
96 // Rights allowed for different fields (stored as bitmask). MUST be integers >= zero
97 const SQL_NONE = 0;
98 const SQL_SELECT = 1;
99 const SQL_INSERT = 2;
100 const SQL_UPDATE = 4;
101
102 public static function Remove($id)
103 {
104 global $DB;
105
106 if ( ! is_numeric($id) )
107 throw new LearnException ('EA_PARAMS', LearnException::EXC_ERR_GN_REMOVE);
108
109 $lessonData = self::GetByID($id);
110 if ( ! array_key_exists('NAME', $lessonData) )
111 throw new LearnException ('EA_NOT_EXISTS', LearnException::EXC_ERR_GN_REMOVE);
112
113 // Remove pictures
114 if ( array_key_exists('PREVIEW_PICTURE', $lessonData) && ($lessonData['PREVIEW_PICTURE'] > 0) )
115 CFile::Delete($lessonData['PREVIEW_PICTURE']);
116
117 if ( array_key_exists('DETAIL_PICTURE', $lessonData) && ($lessonData['DETAIL_PICTURE'] > 0) )
118 CFile::Delete($lessonData['DETAIL_PICTURE']);
119
120 // Remove SCORM data
121 if ( array_key_exists('SCORM', $lessonData) && ($lessonData['SCORM'] === 'Y') )
122 DeleteDirFilesEx("/".(COption::GetOptionString("main", "upload_dir", "upload"))."/learning/scorm/" . $id);
123
124 // Remove graph node
125 $rc = $DB->Query (
126 "DELETE FROM b_learn_lesson
127 WHERE ID = '" . ($id + 0) . "'",
128 true // ignore errors
129 );
130
131 if ($rc === false)
132 throw new LearnException ('EA_SQLERROR', LearnException::EXC_ERR_GN_REMOVE);
133
134 if ($rc->AffectedRowsCount() == 0)
135 throw new LearnException ('EA_NOT_EXISTS', LearnException::EXC_ERR_GN_REMOVE);
136 }
137
138 public static function GetByID($id)
139 {
140 global $DB;
141
142 static $cacheFieldsToSelect = null;
143
144 if ( ! (is_numeric ($id) && is_int ($id + 0)) )
145 throw new LearnException ('EA_PARAMS', LearnException::EXC_ERR_GN_GETBYID);
146
147 // Prepare list of DB fields to be selected
148 if ($cacheFieldsToSelect === null)
149 {
150 $arReversedFieldsMap = self::_GetReversedFieldsMap();
151
152 $arFieldsToSelect = array();
153 foreach ($arReversedFieldsMap as $fieldNameInDB => $value)
154 {
155 if ($value['access'] & self::SQL_SELECT)
156 {
157 if ( ($fieldNameInDB === 'TIMESTAMP_X') || ($fieldNameInDB === 'DATE_CREATE') )
158 $arFieldsToSelect[] = $DB->DateToCharFunction($fieldNameInDB) . ' AS ' . $fieldNameInDB;
159 else
160 $arFieldsToSelect[] = $fieldNameInDB;
161 }
162 }
163
164 $cacheFieldsToSelect = implode (',', $arFieldsToSelect);
165
166 if ( ! ($cacheFieldsToSelect <> '') )
167 $cacheFieldsToSelect = false;
168 }
169
170 if ($cacheFieldsToSelect === false)
171 throw new LearnException ('EA_ACCESS_DENIED', LearnException::EXC_ERR_GN_GETBYID);
172
173 // Get graph node data
174 $rc = $DB->Query (
175 "SELECT " . $cacheFieldsToSelect . "
176 FROM b_learn_lesson
177 WHERE ID='" . (int) ($id + 0) . "'",
178 true // ignore errors
179 );
180
181 if ($rc === false)
182 throw new LearnException ('EA_SQLERROR', LearnException::EXC_ERR_GN_GETBYID);
183
184 if ( ! (($arData = $rc->Fetch()) && is_array($arData)) )
185 throw new LearnException ('EA_NOT_EXISTS', LearnException::EXC_ERR_GN_GETBYID);
186
187 return ($arData);
188 }
189
190 public static function Create($arInFields)
191 {
192 return self::_InsertOrUpdate ($arInFields, 'insert');
193 }
194
195 public static function Update($id, $arInFields)
196 {
197 self::_InsertOrUpdate ($arInFields, 'update', $id);
198 }
199
200 protected static function _InsertOrUpdate ($arInFields, $mode, $id = false)
201 {
202 global $DB, $USER;
203
204 $createdBy = 1;
205 if (is_object($USER) && method_exists($USER, 'getId'))
206 $createdBy = (int) $USER->getId();
207
208 switch ($mode)
209 {
210 case 'update':
211 $accessLevel = self::SQL_UPDATE;
212 $throwErrCode = LearnException::EXC_ERR_GN_UPDATE;
213 $isInsert = false;
214 $isForUpdate = true;
215
216 if ( ! is_numeric ($id) )
217 throw new LearnException ('EA_PARAMS: $id', $throwErrCode);
218 break;
219
220 case 'insert':
221 $accessLevel = self::SQL_INSERT;
222 $throwErrCode = LearnException::EXC_ERR_GN_CREATE;
223 $isInsert = true;
224 $isForUpdate = false;
225 break;
226
227 default:
228 throw new LearnException ('EA_LOGIC',
230 break;
231 }
232
233 // Mapping of fields' names in db and in function arguments
234 $arFieldsMap = self::_GetFieldsMap();
235
236 // Check params for access_level (throws LearnException on failure). After - canonize it
237 $arFields = self::_CheckAndCanonizeFields ($arFieldsMap, $arInFields, $accessLevel, $isForUpdate);
238
239 // Prepares array of fields with values for query to DB. Also, uploads/removes files, if there are.
240 if ($isForUpdate)
241 $arFieldsToDb = self::_PrepareDataForQuery ($arFieldsMap, $arFields, $id);
242 else
243 $arFieldsToDb = self::_PrepareDataForQuery ($arFieldsMap, $arFields, false);
244
245 $arFieldsToDb['~TIMESTAMP_X'] = $DB->GetNowFunction();
246 $newLessonId = null;
247
248 if ($isInsert)
249 {
250 return $DB->Add('b_learn_lesson', $arFieldsToDb);
251 }
252 else
253 {
254 $strUpdate = $DB->PrepareUpdate('b_learn_lesson', $arFieldsToDb);
255 if ($strUpdate)
256 {
257 $DB->Query("UPDATE b_learn_lesson SET $strUpdate WHERE ID = " . intval($id));
258 }
259 }
260 }
261
268 protected static function _PrepareDataForQuery ($arFieldsMap, $arFields, $lessonId)
269 {
270 global $DB;
271
272 $arLessonData = false;
273
274 // if data prepartation for update - cache data about lesson to be updated
275 if ($lessonId !== false)
276 {
277 // if lesson data not cached - get it
278 if ($arLessonData === false)
279 $arLessonData = self::GetByID ($lessonId);
280 }
281
282 $arFieldsToDb = array ();
283
284 foreach ($arFields as $field => $value)
285 {
286 $fieldNameInDB = $arFieldsMap[$field]['field'];
287
288 if ( ($field === 'PREVIEW_PICTURE')
289 || ($field === 'DETAIL_PICTURE')
290 || ($fieldNameInDB === 'PREVIEW_PICTURE')
291 || ($fieldNameInDB === 'DETAIL_PICTURE')
292 )
293 {
294 $error = CFile::CheckImageFile($value);
295 if ($error <> '')
296 {
297 throw new LearnException (
298 'EA_PARAMS: ' . $error,
300 }
301
302 // if data prepartation for update - gets prev pictures names
303 if ($lessonId !== false)
304 {
305 if ( ! array_key_exists($field, $arLessonData) )
307
308 $arFields[$field]['old_file'] = $arLessonData[$field];
309 $value = $arFields[$field];
310 }
311
312 // throws LearnException on error, returns FALSE if id of image not updated
313 $fileId = self::_UploadFile ($fieldNameInDB, $value);
314 if ($fileId === false)
315 continue; // id of image not updated
316
317 // replace value for current field to fileId
318 $value = $arFields[$field] = $fileId;
319 }
320
321 if ($value === NULL)
322 $arFieldsToDb[$fieldNameInDB] = false;
323 else
324 $arFieldsToDb[$fieldNameInDB] = $value;
325 }
326
327 return ($arFieldsToDb);
328 }
329
333 protected static function _UploadFile ($fieldNameInDB, $arData)
334 {
335 if ( ! is_array($arData) )
336 {
337 throw new LearnException ('EA_PARAMS: ' . var_export ($arData, true),
339 }
340
341 // Check for fields needed by CFile::SaveForDB
342 $fieldsMustBe = array ('name', 'size', 'tmp_name', 'type', 'del', 'MODULE_ID');
343 if (count(array_diff($fieldsMustBe, array_keys($arData))) !== 0)
344 {
345 throw new LearnException ('EA_PARAMS: some fields not found',
347 }
348
349 if ($arData['del'] !== 'Y')
350 $arData['del'] = ''; // we can't use N' due to bug in CFile::SaveToDB();
351
352 $arFileData = array($fieldNameInDB => $arData);
353
354 $rc = CFile::SaveForDB($arFileData, $fieldNameInDB,
355 'learning'); // learning - is folder in /upload
356
357 // This is workaround caused by bug in CFile::SaveToDB();
358 if (($rc === false) && ($arData['name'] == '') && ($arData['del'] !== 'Y'))
359 {
360 // We are not deleting file and not uploading new, so return FALSE, what means no image's ID updates occured
361 return (false);
362 }
363
364 if ( ($rc === false)
365 || ( ! isset($arFileData[$fieldNameInDB]) )
366 || ( ($arData['del'] !== 'Y') && ($arFileData[$fieldNameInDB] === false) )
367 )
368 {
369 throw new LearnException ('EA_OTHER: file uploading error: ' . var_export ($rc, true)
370 . '; ' . var_export ($arFileData, true) . '; ' . var_export ($arData, true),
372 }
373
374 // If file removed - return NULL
375 if ($arFileData[$fieldNameInDB] === false)
376 $fileId = NULL;
377 else
378 $fileId = intval($arFileData[$fieldNameInDB]);
379
380 return ($fileId);
381 }
382
386 protected static function _CheckAndCanonizeFields ($arFieldsMap, $arFields, $access_level, $forUpdate = false)
387 {
388 if ( ! (is_int($access_level) && ($access_level >= 0)) )
389 {
390 throw new LearnException ('EA_LOGIC: wrong access level',
392 }
393
394 // Check params
395 $arFieldsNames = array_keys($arFields);
396 foreach ($arFieldsNames as $fieldName)
397 {
398 // Skip checking user fields
399 if (mb_substr($fieldName, 0, 3) === 'UF_')
400 continue;
401
402 // Is field exists in DB?
403 if ( ! array_key_exists ($fieldName, $arFieldsMap) )
404 {
405 throw new LearnException ('EA_PARAMS: ' . $fieldName,
407 }
408
409 // Is access_level allowed by logic?
410 if (($arFieldsMap[$fieldName]['access'] & $access_level) !== $access_level)
411 {
412 throw new LearnException ('EA_LOGIC: ACCESS TO FIELD "' . $fieldName . '" logically prohibited.',
414 }
415 }
416
417 // PREVIEW_TEXT_TYPE
418 if ( ( ! $forUpdate ) && ( ! array_key_exists('PREVIEW_TEXT_TYPE', $arFields) ) )
419 $arFields['PREVIEW_TEXT_TYPE'] = 'text'; // by default, for backward compatibility
420
421 if ( ( ! $forUpdate ) || array_key_exists('PREVIEW_TEXT_TYPE', $arFields) )
422 {
423 if ( ! in_array ($arFields['PREVIEW_TEXT_TYPE'], array('text', 'html'), true) )
424 throw new LearnException ('EA_PARAMS: PREVIEW_TEXT_TYPE', LearnException::EXC_ERR_GN_CHECK_PARAMS);
425 }
426
427 // DETAIL_TEXT_TYPE
428 if ( ( ! $forUpdate ) && ( ! array_key_exists('DETAIL_TEXT_TYPE', $arFields) ) )
429 $arFields['DETAIL_TEXT_TYPE'] = 'text'; // by default, for backward compatibility
430
431 if ( ( ! $forUpdate ) || array_key_exists('DETAIL_TEXT_TYPE', $arFields) )
432 {
433 if ( ! in_array ($arFields['DETAIL_TEXT_TYPE'], array('text', 'html', 'file'), true) )
434 throw new LearnException ('EA_PARAMS: DETAIL_TEXT_TYPE', LearnException::EXC_ERR_GN_CHECK_PARAMS);
435 }
436
437 // KEYWORDS
438 if ( ! $forUpdate )
439 {
440 if (
441 ( ! array_key_exists('KEYWORDS', $arFields) )
442 || ($arFields['KEYWORDS'] === NULL)
443 )
444 {
445 $arFields['KEYWORDS'] = '';
446 }
447 }
448 else // for update
449 {
450 if (
451 array_key_exists('KEYWORDS', $arFields)
452 && ($arFields['KEYWORDS'] === NULL)
453 )
454 {
455 $arFields['KEYWORDS'] = '';
456 }
457 }
458
459 // ACTIVE
460 if (array_key_exists('ACTIVE', $arFields))
461 {
462 // canonize
463 if ( in_array($arFields['ACTIVE'], array(true, false), true) )
464 {
465 if ($arFields['ACTIVE'])
466 $arFields['ACTIVE'] = 'Y';
467 else
468 $arFields['ACTIVE'] = 'N';
469 }
470 }
471 else
472 {
473 if ( ! $forUpdate )
474 $arFields['ACTIVE'] = 'Y'; // by default, for backward compatibility
475 }
476
477 // ACTIVE - check admitted region
478 if ( ( ! $forUpdate ) || array_key_exists('ACTIVE', $arFields) )
479 {
480 if ( ! in_array($arFields['ACTIVE'], array('Y', 'N'), true) )
481 {
482 throw new LearnException ('EA_PARAMS: ACTIVE is out of range',
484 }
485 }
486
487 // PREVIEW_PICTURE
488 if (array_key_exists('PREVIEW_PICTURE', $arFields))
489 {
490 // remove this field, if nothing to do
491 if (!is_array($arFields['PREVIEW_PICTURE']))
492 {
493 unset($arFields['PREVIEW_PICTURE']);
494 }
495 else if (
496 (!array_key_exists('name', $arFields['PREVIEW_PICTURE']) || $arFields['PREVIEW_PICTURE']['name'] == '')
497 &&
498 (!array_key_exists('del', $arFields['PREVIEW_PICTURE']) || $arFields['PREVIEW_PICTURE']['del'] == '')
499 &&
500 (!isset($arFields['PREVIEW_PICTURE']['description']) || $arFields['PREVIEW_PICTURE']['description'] == '')
501 )
502 {
503 unset($arFields['PREVIEW_PICTURE']);
504 }
505 else
506 {
507 // check structure
508 $check = array_key_exists('name', $arFields['PREVIEW_PICTURE'])
509 && array_key_exists('size', $arFields['PREVIEW_PICTURE'])
510 && array_key_exists('tmp_name', $arFields['PREVIEW_PICTURE'])
511 && array_key_exists('type', $arFields['PREVIEW_PICTURE'])
512 && ( ( ! array_key_exists('del', $arFields['PREVIEW_PICTURE']) )
513 || in_array($arFields['PREVIEW_PICTURE']['del'], array('Y', 'N', NULL), true)
514 );
515
516 if ( ! $check )
517 {
518 throw new LearnException ('EA_PARAMS: <pre>' . var_export($arFields['PREVIEW_PICTURE'], true)
520 }
521
522 $arFields['PREVIEW_PICTURE']['MODULE_ID'] = CLearnHelper::MODULE_ID; // learning
523
524 if ($arFields['PREVIEW_PICTURE']['del'] === NULL)
525 $arFields['PREVIEW_PICTURE']['del'] = 'N';
526 }
527 }
528
529 // DETAIL_PICTURE
530 if (array_key_exists('DETAIL_PICTURE', $arFields))
531 {
532 // remove this field, if nothing to do
533 if (!is_array($arFields['DETAIL_PICTURE']))
534 {
535 unset($arFields['DETAIL_PICTURE']);
536 }
537 elseif (
538 (!array_key_exists('name', $arFields['DETAIL_PICTURE']) || $arFields['DETAIL_PICTURE']['name'] == '')
539 &&
540 (!array_key_exists('del', $arFields['DETAIL_PICTURE']) || $arFields['DETAIL_PICTURE']['del'] == '')
541 &&
542 (!isset($arFields['DETAIL_PICTURE']['description']) || $arFields['DETAIL_PICTURE']['description'] == '')
543 )
544 {
545 unset($arFields['DETAIL_PICTURE']);
546 }
547 else
548 {
549 // check structure
550 $check = array_key_exists('name', $arFields['DETAIL_PICTURE'])
551 && array_key_exists('size', $arFields['DETAIL_PICTURE'])
552 && array_key_exists('tmp_name', $arFields['DETAIL_PICTURE'])
553 && array_key_exists('type', $arFields['DETAIL_PICTURE'])
554 && ( ( ! array_key_exists('del', $arFields['DETAIL_PICTURE']) )
555 || in_array($arFields['DETAIL_PICTURE']['del'], array('Y', 'N', NULL), true)
556 );
557
558 if ( ! $check )
559 {
560 throw new LearnException ('EA_PARAMS: <pre>' . var_export($arFields['DETAIL_PICTURE'], true)
562 }
563
564 $arFields['DETAIL_PICTURE']['MODULE_ID'] = CLearnHelper::MODULE_ID; // learning
565
566 if ($arFields['DETAIL_PICTURE']['del'] === NULL)
567 $arFields['DETAIL_PICTURE']['del'] = 'N';
568 }
569 }
570
571 return ($arFields);
572 }
573
574 protected static function _GetFieldsMap()
575 {
576 static $arFieldsMap = null;
577
578 if ($arFieldsMap === null)
579 {
580 $arFieldsMap = array(
581 'ID' => array (
582 'field' => 'ID',
583 'access' => self::SQL_SELECT),
584 'TIMESTAMP_X' => array (
585 'field' => 'TIMESTAMP_X',
586 'access' => self::SQL_SELECT),
587 'DATE_CREATE' => array (
588 'field' => 'DATE_CREATE',
589 'access' => self::SQL_SELECT),
590 'CREATED_BY' => array (
591 'field' => 'CREATED_BY',
592 'access' => self::SQL_SELECT),
593 'ACTIVE' => array (
594 'field' => 'ACTIVE',
595 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
596 'NAME' => array (
597 'field' => 'NAME',
598 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
599 'CODE' => array (
600 'field' => 'CODE',
601 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
602 'KEYWORDS' => array (
603 'field' => 'KEYWORDS',
604 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
605 'PREVIEW_PICTURE' => array (
606 'field' => 'PREVIEW_PICTURE',
607 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
608 'PREVIEW_TEXT' => array (
609 'field' => 'PREVIEW_TEXT',
610 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
611 'PREVIEW_TEXT_TYPE' => array (
612 'field' => 'PREVIEW_TEXT_TYPE',
613 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
614 'DETAIL_PICTURE' => array (
615 'field' => 'DETAIL_PICTURE',
616 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
617 'DETAIL_TEXT' => array (
618 'field' => 'DETAIL_TEXT',
619 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
620 'DETAIL_TEXT_TYPE' => array (
621 'field' => 'DETAIL_TEXT_TYPE',
622 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
623 'LAUNCH' => array (
624 'field' => 'LAUNCH',
625 'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE)
626 );
627 }
628
629 return ($arFieldsMap);
630 }
631
632 protected static function _GetReversedFieldsMap()
633 {
634 static $cache = false;
635
636 if ($cache === false)
637 {
638 $fieldsMap = self::_GetFieldsMap();
639
640 foreach ($fieldsMap as $propertyName => $arData)
641 {
642 $fieldNameInDB = $arData['field'];
643 $cache[$fieldNameInDB] = array ('propertyName' => $propertyName, 'access' => $arData['access']);
644 }
645 }
646
647 return ($cache);
648 }
649}
const SQL_UPDATE
Определения ilearngraphnode.php:100
static Update($id, $arInFields)
Определения ilearngraphnode.php:195
static _InsertOrUpdate($arInFields, $mode, $id=false)
Определения ilearngraphnode.php:200
static Create($arInFields)
Определения ilearngraphnode.php:190
static Remove($id)
Определения ilearngraphnode.php:102
static GetByID($id)
Определения ilearngraphnode.php:138
const SQL_INSERT
Определения ilearngraphnode.php:99
static _GetReversedFieldsMap()
Определения ilearngraphnode.php:632
const SQL_NONE
Определения ilearngraphnode.php:97
static _GetFieldsMap()
Определения ilearngraphnode.php:574
static _UploadFile($fieldNameInDB, $arData)
Определения ilearngraphnode.php:333
static _PrepareDataForQuery($arFieldsMap, $arFields, $lessonId)
Определения ilearngraphnode.php:268
const SQL_SELECT
Определения ilearngraphnode.php:98
static _CheckAndCanonizeFields($arFieldsMap, $arFields, $access_level, $forUpdate=false)
Определения ilearngraphnode.php:386
const MODULE_ID
Определения clearnhelper.php:21
Определения learnexception.php:4
const EXC_ERR_GN_FILE_UPLOAD
Определения learnexception.php:25
const EXC_ERR_GN_GETBYID
Определения learnexception.php:23
const EXC_ERR_GN_REMOVE
Определения learnexception.php:22
const EXC_ERR_ALL_LOGIC
Определения learnexception.php:5
const EXC_ERR_GN_UPDATE
Определения learnexception.php:21
const EXC_ERR_GN_CREATE
Определения learnexception.php:20
const EXC_ERR_GN_CHECK_PARAMS
Определения learnexception.php:24
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
static Remove($id)
static GetByID($id)
static Create($arFields)
static Update($id, $arFields)
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
DeleteDirFilesEx($path, $root=null)
Определения tools.php:2823
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$error
Определения subscription_card_product.php:20