• Модуль: learning
  • Путь к файлу: ~/bitrix/modules/learning/classes/general/import.php
  • Класс: CCourseImport
  • Вызов: CCourseImport::_MakeItems
protected function _MakeItems($TITLE, $TYPE, $RES_ID, $PARENT_ID)
{
	global $APPLICATION;

	if ($PARENT_ID === 0)
		$linkToParentLessonId = CCourse::CourseGetLinkedLesson ($this->COURSE_ID);
	else
		$linkToParentLessonId = (int) $PARENT_ID;

	$createUnilesson = false;

	if ($TYPE == "LES")
	{
		$arFields = Array(
			'NAME' => $TITLE
		);

		$createUnilesson = true;
	}
	elseif ($TYPE == "CHA")
	{
		$arFields = Array(
			'NAME' => $TITLE
		);

		$createUnilesson = true;
	}
	elseif ($TYPE == "QUE")
	{
		$arFields = Array(
			"NAME" => $TITLE,
			"LESSON_ID" => $linkToParentLessonId
		);

		$cl = new CLQuestion;
	}
	elseif ($TYPE == "TES")
	{
		$arFields = Array(
			"NAME" => $TITLE,
			"COURSE_ID" => $this->COURSE_ID
		);

		$cl = new CTest;
	}
	elseif ($TYPE === 'TMK')
	{
		$arFields = array();

		$cl = new CLTestMark;
	}
	else
		return $PARENT_ID;


	$r = new CDataXML();
	if (!$r->Load($this->package_dir."/".mb_strtolower($RES_ID).".xml"))
		$r = false;

	if ($r !== false)
	{
		if ($TYPE == "QUE")
		{
			if (
				($data = $r->SelectNodes("/questestinterop/item/presentation/"))
				&&
				($resp = $r->SelectNodes("/questestinterop/item/resprocessing/"))
				)
			{
				$arQ = Array();
				$arData = $data->__toArray();
				$arResp = $resp->__toArray();

				if (is_set($arData["#"]["material"][0]["#"], "mattext"))
					$arQ["NAME"] = $arData["#"]["material"][0]["#"]["mattext"][0]["#"];

				if (is_set($arData["#"]["material"][0]["#"], "matimage"))
				{
					$imageDescription = '';
					if (is_set($arData["#"]["material"][0]["#"], 'image_description'))
						$imageDescription = $arData["#"]["material"][0]["#"]['image_description'][0]['#'];

					$arQ["FILE_ID"] = Array(
						"MODULE_ID" => "learning",
						"name" =>basename($arData["#"]["material"][0]["#"]["matimage"][0]["@"]["uri"]),
						"tmp_name" => $this->package_dir."/".$arData["#"]["material"][0]["#"]["matimage"][0]["@"]["uri"],
						"size" =>@filesize($this->package_dir."/".$arData["#"]["material"][0]["#"]["matimage"][0]["@"]["uri"]),
						"type" => $arData["#"]["material"][0]["#"]["matimage"][0]["@"]["imagtype"],
						'description' => $imageDescription
					);
				}

				if (is_set($arData["#"]["response_lid"][0]["@"], "rcardinality"))
				{
					switch ($arData["#"]["response_lid"][0]["@"]["rcardinality"])
					{
						case "Multiple":
							$arQ["QUESTION_TYPE"] = 'M';
							break;
						case "Text":
							$arQ["QUESTION_TYPE"] = 'T';
							break;
						case "Sort":
							$arQ["QUESTION_TYPE"] = 'R';
							break;
						default:
							$arQ["QUESTION_TYPE"] = 'S';
							break;
					}
				}

				if (is_set($arResp["#"]["respcondition"][0]["#"], "setvar"))
					$arQ["POINT"] = $arResp["#"]["respcondition"][0]["#"]["setvar"][0]['#'];

				//Additional
				if ($bx = $r->SelectNodes("/questestinterop/item/bitrix/"))
				{
					$arQ = array_merge($arQ, $this->_MakeFields($bx->__toArray(), $TYPE));
					unset($bx);
				}

				$arFields = array_merge($arFields,$arQ);

				$cl = new CLQuestion;
				$ID = $cl->Add($arFields);

				if ($ID > 0)
				{
					$PARENT_ID = $ID;
					$arCorrect = Array();
					if (
						is_set($arResp["#"]["respcondition"][0]["#"], "conditionvar")
						&&
						is_set($arResp["#"]["respcondition"][0]["#"]["conditionvar"][0]["#"], "varequal")
						)
					{

						foreach ($arResp["#"]["respcondition"][0]["#"]["conditionvar"][0]["#"]["varequal"] as $ar)
							$arCorrect[] = $ar["#"];
					}

					if (is_set($arData["#"]["response_lid"][0]["#"], "render_choice")
						&&
						is_set($arData["#"]["response_lid"][0]["#"]["render_choice"][0]["#"], "response_label")
						)
					{
						$i = 0;
						foreach ($arData["#"]["response_lid"][0]["#"]["render_choice"][0]["#"]["response_label"] as $ar)
						{
							$i +=10;
							$cl = new CLAnswer;
							$arFields = Array(
								"QUESTION_ID" => $PARENT_ID,
								"SORT" => $i,
								"CORRECT" => (in_array($ar["@"]["ident"],$arCorrect) ? "Y": "N"),
								"ANSWER" => $ar["#"]["material"][0]["#"]["mattext"][0]["#"],
							);

							$AswerID = $cl->Add($arFields);
							$res = ($AswerID > 0);
							if (!$res)
							{
								if ($e = $APPLICATION->GetException())
									$this->arWarnings[$TYPE][] = Array("TITLE" => $TITLE, "TEXT" =>$e->GetString());
							}
						}
					}
				}
				else
				{
					if ($e = $APPLICATION->GetException())
						$this->arWarnings[$TYPE][] = Array("TITLE" => $TITLE, "TEXT" =>$e->GetString());
				}

				unset($cl);
				unset($data);
				unset($arQ);
				unset($resp);
				unset($arData);
				unset($arResp);

				return $PARENT_ID;
			}
		}
		else
		{
			if ($data = $r->SelectNodes("/content/"))
			{
				$ar = $data->__toArray();
				$arFields = array_merge($arFields,$this->_MakeFields($ar, $TYPE));
				if ($TYPE === 'TMK')
					$arFields['TEST_ID'] = (int) $PARENT_ID;

				if (is_set($arFields, "COMPLETED_SCORE") && intval($arFields["COMPLETED_SCORE"]) <= 0)
					unset($arFields["COMPLETED_SCORE"]);
				if ((is_set($arFields, "PREVIOUS_TEST_ID") && intval($arFields["PREVIOUS_TEST_ID"]) <= 0) || !CTest::GetByID($arFields["PREVIOUS_TEST_ID"])->Fetch())
					unset($arFields["PREVIOUS_TEST_ID"], $arFields["PREVIOUS_TEST_SCORE"]);
			}
		}
	}

	if ($createUnilesson === false)
	{
		$ID = $cl->Add($arFields);
		unset($cl);
	}
	else
	{
		$bProhibitPublish = false;
		// properties (in context of parent) by default
		$arProperties = array('SORT' => 500);

		// Lesson's sort order in context of parent
		if (isset($arFields['EDGE_SORT']))
		{
			$arFields['SORT'] = (int) $arFields['EDGE_SORT'];
			unset ($arFields['EDGE_SORT']);
		}

		if (isset($arFields['SORT']))
		{
			$arProperties['SORT'] = (int) $arFields['SORT'];

			// Lessons doesn't have more SORT field
			unset ($arFields['SORT']);
		}

		if (isset($arFields['META_PUBLISH_PROHIBITED']))
		{
			if ($arFields['META_PUBLISH_PROHIBITED'] === 'Y')
				$bProhibitPublish = true;

			unset($arFields['META_PUBLISH_PROHIBITED']);
		}

		// unset fields, that are absent in unilesson
		$arUnilessonFields = $arFields;
		$arFieldsNames = array_keys($arUnilessonFields);
		foreach ($arFieldsNames as $fieldName)
		{
			if ( ! in_array(mb_strtoupper($fieldName), $this->arLessonWritableFields) )
				unset ($arUnilessonFields[$fieldName]);
		}

		$ID = CLearnLesson::Add (
			$arUnilessonFields,
			false, 			// is it course? - No, it isn't.
			$linkToParentLessonId, 
			$arProperties
		);

		if ($bProhibitPublish && ($ID > 0))
			CLearnLesson::PublishProhibitionSetTo($ID, $linkToParentLessonId, $bProhibitPublish);
	}

	if ($ID > 0)
		return $ID;
	else
	{
		if($e = $APPLICATION->GetException())
			$this->arWarnings[$TYPE][] = Array("TITLE" => $TITLE, "TEXT" =>$e->GetString());
	}
}