public static function ProccessPOST($oAccess, $LESSON_ID, $sort = false) { $isAccessUseCache = true; if ($sort === false) { $sort = 500; } // Remove/add relations from/to parent if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_LINK_TO_PARENTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($LESSON_ID, CLearnAccess::OP_LESSON_LINK_TO_PARENTS, $isAccessUseCache) || $oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($LESSON_ID, CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS, $isAccessUseCache)) { $arCurParentsIds = array(); $resParents = CLearnLesson::GetListOfImmediateParents($LESSON_ID); while ($arParent = $resParents->Fetch()) { $arCurParentsIds[] = (int) $arParent['LESSON_ID']; } $arDestParentsIds = array(); if (isset($_POST['RELATION_PARENT']) && is_array($_POST['RELATION_PARENT'])) { foreach ($_POST['RELATION_PARENT'] as $key => $relatedLessonId) { $arDestParentsIds[] = (int) $relatedLessonId; } } // remove relations if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($LESSON_ID, CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS, $isAccessUseCache)) { $arRemoveIds = array_diff($arCurParentsIds, $arDestParentsIds); foreach ($arRemoveIds as $relatedLessonId) { if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($relatedLessonId, CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS, $isAccessUseCache)) { CLearnLesson::RelationRemove($relatedLessonId, $LESSON_ID); } } } // add relations if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_LINK_TO_PARENTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($LESSON_ID, CLearnAccess::OP_LESSON_LINK_TO_PARENTS, $isAccessUseCache)) { $arAddIds = array_diff($arDestParentsIds, $arCurParentsIds); foreach ($arAddIds as $relatedLessonId) { if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_LINK_DESCENDANTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($relatedLessonId, CLearnAccess::OP_LESSON_LINK_DESCENDANTS, $isAccessUseCache)) { CLearnLesson::RelationAdd($relatedLessonId, $LESSON_ID, array('SORT' => $sort)); } } } } // Remove/add relations from/to childs if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_LINK_DESCENDANTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($LESSON_ID, CLearnAccess::OP_LESSON_LINK_DESCENDANTS, $isAccessUseCache) || $oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($LESSON_ID, CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS, $isAccessUseCache)) { $arCurChildsIds = array(); $resChilds = CLearnLesson::GetListOfImmediateChilds($LESSON_ID); while ($arChild = $resChilds->Fetch()) { $arCurChildsIds[] = (int) $arChild['LESSON_ID']; } $arDestChildsIds = array(); if (isset($_POST['RELATION_CHILD']) && is_array($_POST['RELATION_CHILD'])) { foreach ($_POST['RELATION_CHILD'] as $key => $relatedLessonId) { $arDestChildsIds[] = (int) $relatedLessonId; } } // remove relations if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($LESSON_ID, CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS, $isAccessUseCache)) { $arRemoveIds = array_diff($arCurChildsIds, $arDestChildsIds); foreach ($arRemoveIds as $relatedLessonId) { if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($relatedLessonId, CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS, $isAccessUseCache)) { CLearnLesson::RelationRemove($LESSON_ID, $relatedLessonId); } } } // add relations if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_LINK_DESCENDANTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($LESSON_ID, CLearnAccess::OP_LESSON_LINK_DESCENDANTS, $isAccessUseCache)) { $arAddIds = array_diff($arDestChildsIds, $arCurChildsIds); foreach ($arAddIds as $relatedLessonId) { if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_LINK_TO_PARENTS, $isAccessUseCache) || $oAccess->IsLessonAccessible($relatedLessonId, CLearnAccess::OP_LESSON_LINK_TO_PARENTS, $isAccessUseCache)) { CLearnLesson::RelationAdd($LESSON_ID, $relatedLessonId, array('SORT' => $sort)); } } } } }
public function ProcessActionsOnList() { if (isset($_POST['action']) && strlen($_POST['action']) !== 0) { $action = $_POST['action']; } elseif (isset($_GET['action']) && strlen($_GET['action']) !== 0) { $action = $_GET['action']; } elseif (isset($_POST['action_button']) && strlen($_POST['action_button']) !== 0) { $action = $_POST['action_button']; } elseif (isset($_GET['action_button']) && strlen($_GET['action_button']) !== 0) { $action = $_GET['action_button']; } else { return $this; } // nothing to do $arID = $this->oList->GroupAction(); if ($arID === false) { return $this; } // no items selected if (check_bitrix_sessid() !== true) { throw new CLearnRenderAdminUnilessonListException('', CLearnRenderAdminUnilessonListException::C_ACCESS_DENIED); } if ($_POST['action_target'] === 'selected') { $arID = array(); $rsData = $this->fetchDataFromDb(); while ($arRes = $rsData->Fetch()) { $arID[] = $arRes['LESSON_ID']; } } foreach ($arID as $lessonId) { // If not int or string can't be strictly casted to int if (!(is_numeric($lessonId) && is_int($lessonId + 0))) { continue; } $lessonId += 0; $wasError = false; $preventSelectionOnError = false; try { switch ($action) { case 'unlink': // !!! In case of unlinking in $lessonId not Lesson's id, but it's full path $oPath = new CLearnPath(); $oPath->ImportUrlencoded($lessonId); $arPath = $oPath->GetPathAsArray(); if (count($arPath) < 2) { throw new CLearnRenderAdminUnilessonListException('', CLearnRenderAdminUnilessonListException::C_LOGIC); } $childLessonId = $oPath->GetBottom(); $parentLessonId = $oPath->GetBottom(); if ($parentLessonId === false || $childLessonId === false) { // something goes wrong throw new CLearnRenderAdminUnilessonListException('', CLearnRenderAdminUnilessonListException::C_LOGIC); } $this->EnsureLessonUnlinkAccess($parentLessonId, $childLessonId); // throws an exception on error CLearnLesson::RelationRemove($parentLessonId, $childLessonId); break; case 'disband': @set_time_limit(0); $courseId = CLearnLesson::GetLinkedCourse($lessonId); if ($courseId !== false && CCourse::IsCertificatesExists($courseId)) { throw new Exception(GetMessage(LEARNING_COURSE_UNREMOVABLE_CAUSE_OF_CERTIFICATES)); } $this->EnsureLessonDisbandAccess($lessonId); CLearnLesson::Delete($lessonId); break; case 'delete': case 'recursive_delete': $preventSelectionOnError = true; // prevent switch table to "selection mode" when cannot delete item in list @set_time_limit(0); $courseId = CLearnLesson::GetLinkedCourse($lessonId); if ($courseId !== false && CCourse::IsCertificatesExists($courseId)) { throw new Exception(GetMessage(LEARNING_COURSE_UNREMOVABLE_CAUSE_OF_CERTIFICATES)); } try { // firstly, simulate to check permissions CLearnLesson::DeleteRecursiveLikeHardlinks(array('lesson_id' => $lessonId, 'simulate' => true)); // If all is OK, try to really remove it CLearnLesson::DeleteRecursiveLikeHardlinks($lessonId); } catch (LearnException $e) { if ($e->GetCode() === LearnException::EXC_ERR_ALL_ACCESS_DENIED) { throw new CLearnRenderAdminUnilessonListException('', CLearnRenderAdminUnilessonListException::C_ACCESS_DENIED); } else { // bubble exception throw new LearnException($e->GetMessage(), $e->GetCode()); } } break; case 'activate': case 'deactivate': if (strtolower($action) === 'deactivate') { $this->EnsureLessonDeactivateAccess($lessonId); $arFields = array('ACTIVE' => 'N'); } elseif (strtolower($action) === 'activate') { $this->EnsureLessonActivateAccess($lessonId); $arFields = array('ACTIVE' => 'Y'); } else { throw new CLearnRenderAdminUnilessonListException('WTFAYD,#Pro#?!', CLearnRenderAdminUnilessonListException::C_ACCESS_DENIED); } // Is item course or not? $courseId = CLearnLesson::GetLinkedCourse($lessonId); if ($courseId === false) { // not course CLearnLesson::Update($lessonId, $arFields); } else { $oCourse = new CCourse(); $rc = $oCourse->Update($courseId, $arFields); unset($oCourse); if ($rc === false) { throw new Exception(); } } break; default: throw new Exception(); break; } } catch (CLearnRenderAdminUnilessonListException $e) { $wasError = true; $errorText = $e->getMessage(); $errorCode = $e->getCode(); } catch (Exception $e) { $wasError = true; $errorText = $e->getMessage(); $errorCode = 0; // Because we checks below only CLearnRenderAdminUnilessonListException codes } if ($wasError) { if ($e->getCode() & CLearnRenderAdminUnilessonListException::C_ACCESS_DENIED) { // Access denied $errmsg = GetMessage('LEARNING_SAVE_ERROR') . '#' . $lessonId . ': ' . GetMessage('LEARNING_ACCESS_D'); if (strlen($errorText) > 0) { $errmsg .= ': ' . $errorText; } } else { // Some error occured during update operation $errmsg = GetMessage('LEARNING_SAVE_ERROR') . $lessonId; if (strlen($errorText) > 0) { $errmsg .= ' (' . $errorText . ')'; } } if ($preventSelectionOnError) { $this->oList->AddUpdateError($errmsg); } else { $this->oList->AddUpdateError($errmsg, $lessonId); } } } return $this; }