• Модуль: learning
  • Путь к файлу: ~/bitrix/modules/learning/classes/general/clearnlesson.php
  • Класс: CLearnLesson
  • Вызов: CLearnLesson::Delete
static function Delete ($lesson_id)
{
	global $USER_FIELD_MANAGER;

	list ($lesson_id, $simulate, $check_permissions, $user_id) =
		self::_funcDelete_ParseOptions($lesson_id);

	if ($check_permissions)
	{
		$oAccess = CLearnAccess::GetInstance($user_id);
		if ( ! $oAccess->IsLessonAccessible($lesson_id, CLearnAccess::OP_LESSON_REMOVE) )
		{
			throw new LearnException(
				'EA_ACCESS_DENIED',
				LearnException::EXC_ERR_ALL_ACCESS_DENIED);
		}
	}

	// Parents and childs of the lesson
	$arNeighboursEdges = self::ListImmediateNeighbours ($lesson_id);

	// precache rights for lesson
	if ($check_permissions)
	{
		$IsLessonAccessibleFor_OP_LESSON_UNLINK_DESCENDANTS =
			$oAccess->IsLessonAccessible($lesson_id, CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS);
		$IsLessonAccessibleFor_OP_LESSON_UNLINK_FROM_PARENTS =
			$oAccess->IsLessonAccessible($lesson_id, CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS);
	}

	foreach(GetModuleEvents('learning', 'OnBeforeLessonDelete', true) as $arEvent)
		ExecuteModuleEventEx($arEvent, array($lesson_id));

	foreach ($arNeighboursEdges as $arEdge)
	{
		$child_lesson_id  = (int) $arEdge['CHILD_LESSON'];
		$parent_lesson_id = (int) $arEdge['PARENT_LESSON'];
		if ($check_permissions)
		{
			$IsLessonAccessible = false;

			if ($child_lesson_id === $lesson_id)
			{
				// if we will be remove edge to parent - use precached rights for OP_LESSON_UNLINK_FROM_PARENTS
				$IsLessonAccessible = $IsLessonAccessibleFor_OP_LESSON_UNLINK_FROM_PARENTS
					&& $oAccess->IsLessonAccessible($parent_lesson_id, CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS);
			}
			elseif ($parent_lesson_id === $lesson_id)
			{
				// if we will be remove edge to child - use precached rights for OP_LESSON_UNLINK_DESCENDANTS
				$IsLessonAccessible = $IsLessonAccessibleFor_OP_LESSON_UNLINK_DESCENDANTS
					&& $oAccess->IsLessonAccessible($child_lesson_id, CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS);
			}
			else
			{
				throw new LearnException(
					'EA_FATAL: $lesson_id (' . $lesson_id
						. ') not equal to one of: $child_lesson_id ('
						. $child_lesson_id . '), $parent_lesson_id ('
						. $parent_lesson_id . ')',
					LearnException::EXC_ERR_ALL_LOGIC
					| LearnException::EXC_ERR_ALL_GIVEUP);
			}

			if ( ! $IsLessonAccessible )
			{
				throw new LearnException(
					'EA_ACCESS_DENIED',
					LearnException::EXC_ERR_ALL_ACCESS_DENIED);
			}

			if ($simulate === false)
				self::RelationRemove ($parent_lesson_id, $child_lesson_id);
		}
	}

	$linkedCourseId = self::GetLinkedCourse ($lesson_id);

	// If lesson is course, remove course
	if ($linkedCourseId !== false)
	{
		global $DB;

		if ($simulate === false)
		{
			if ( ! $DB->Query("DELETE FROM b_learn_course_site WHERE COURSE_ID = " . (int) $linkedCourseId, true) )
				throw new LearnException ( 'EA_SQLERROR', LearnException::EXC_ERR_ALL_GIVEUP);

			$rc = self::CourseBecomeLesson ($linkedCourseId);

			// if course cannot be converted to lesson - don't remove lesson
			if ($rc === false)
			{
				throw new LearnException (
					'EA_OTHER: lesson is unremovable because linked course is in use.',
					LearnException::EXC_ERR_LL_UNREMOVABLE_CL);
			}

			// reload cache of LINKED_LESSON_ID -> COURSE_ID
			self::GetCourseToLessonMap_ReloadCache();
		}
	}

	// And remove lesson
	if ($simulate === false)
	{
		global $DB;

		$r = $DB->Query(
			"SELECT PREVIEW_PICTURE, DETAIL_PICTURE 
			FROM b_learn_lesson 
			WHERE ID = " . (int) $lesson_id,
			true);

		if ($r === false)
		{
			throw new LearnException(
				'EA_SQLERROR',
				LearnException::EXC_ERR_ALL_GIVEUP);
		}

		$arRes = $r->Fetch();
		if ( ! $arRes )
		{
			throw new LearnException(
				'EA_SQLERROR',
				LearnException::EXC_ERR_ALL_GIVEUP);
		}

		CFile::Delete($arRes['PREVIEW_PICTURE']);
		CFile::Delete($arRes['DETAIL_PICTURE']);

		// Remove questions
		$q = CLQuestion::GetList(
			array(),
			array('LESSON_ID' => $lesson_id)
			);
		while($arQ = $q->Fetch())
		{
			if ( ! CLQuestion::Delete($arQ['ID']) )
			{
				throw new LearnException(
					'EA_QUESTION_NOT_REMOVED',
					LearnException::EXC_ERR_ALL_GIVEUP);
			}
		}

		CLearnGraphNode::Remove($lesson_id);

		$USER_FIELD_MANAGER->delete('LEARNING_LESSONS', $lesson_id);

		CLearnCacheOfLessonTreeComponent::MarkAsDirty();

		CEventLog::add(array(
			'AUDIT_TYPE_ID' => 'LEARNING_REMOVE_ITEM',
			'MODULE_ID'     => 'learning',
			'ITEM_ID'       => 'L #' . $lesson_id,
			'DESCRIPTION'   => 'lesson removed'
		));

		if (CModule::IncludeModule('search'))
		{
			CSearch::deleteIndex("learning", "U\_%", "L".$lesson_id, null);
		}
	}

	if ($simulate === false)
	{
		foreach(GetModuleEvents('learning', 'OnAfterLessonDelete', true) as $arEvent)
			ExecuteModuleEventEx($arEvent, array($lesson_id));
	}
}