%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/learning/classes/general/
Upload File :
Create Path :
Current File : /home/bitrix/www/bitrix/modules/learning/classes/general/ilearngraphnode.php

<?php

/**
 * WARNING: nobody shouldn't rely on this code,
 * because it's FOR INTERNAL USE ONLY. Any declared
 * function can be removed or changed in future versions.
 * This code can be changed without any notifications.
 * DON'T USE it nowhere.
 *
 * @access private
 */
interface ILearnGraphNode
{
	/**
	 * WARNING: this method terminates (by die()/exit()) current execution flow
	 * when SQL server error occured. It's due to bug in CDatabase::Insert() in main
	 * module (version info:
	 *    define("SM_VERSION","11.0.12");
	 *    define("SM_VERSION_DATE","2012-02-21 17:00:00"); // YYYY-MM-DD HH:MI:SS
	 * )
	 *
	 * @param array of pairs field => value for new GraphNode. Allowed fields are:
	 * ACTIVE, true by default, available values are: true/false
	 * NAME, mustn't be omitted
	 * CODE, NULL by default
	 * PREVIEW_PICTURE, NULL by default, available value is array ('name' => ..., 
	 *     'size' => ..., 'tmp_name' => ..., 'type' => ..., 'del' => ...)
	 * PREVIEW_TEXT, NULL by default
	 * PREVIEW_TEXT_TYPE, 'text' by default, available values are: 'text', 'html'
	 * DETAIL_PICTURE, NULL by default, available value is array ('name' => ..., 
	 *     'size' => ..., 'tmp_name' => ..., 'type' => ..., 'del' => ...)
	 * DETAIL_TEXT, NULL by default
	 * DETAIL_TEXT_TYPE, 'text' by default, available values are: 'text', 'html', 'file' (filename in LAUNCH)
	 * LAUNCH, NULL by default
	 *
	 * @throws LearnException with errcodes:
	 *         - LearnException::EXC_ERR_GN_CREATE,
	 *         - LearnException::EXC_ERR_GN_CHECK_PARAMS,
	 *         - LearnException::EXC_ERR_GN_FILE_UPLOAD
	 * Also can throws other exceptions or exceptions' codes
	 *
	 * @return integer id of created graph node
	 */
	public static function Create ($arFields);

	/**
	 * WARNING: this method terminates (by die()/exit()) current execution flow
	 * when SQL server error occured. It's due to bug in CDatabase::Update() in main
	 * module (version info:
	 *    define("SM_VERSION","11.0.12");
	 *    define("SM_VERSION_DATE","2012-02-21 17:00:00"); // YYYY-MM-DD HH:MI:SS
	 * )
	 *
	 * @param integer id of node to be updated
	 * @param array of pairs field => value for new GraphNode
	 *
	 * @throws LearnException with errcodes:
	 *         - LearnException::EXC_ERR_GN_UPDATE,
	 *         - LearnException::EXC_ERR_GN_CHECK_PARAMS,
	 *         - LearnException::EXC_ERR_GN_FILE_UPLOAD
	 * Also can throws other exceptions or exceptions' codes
	 */
	public static function Update ($id, $arFields);

	/**
	 * @param integer id of node to be getted
	 *
	 * @throws LearnException with errcode LearnException::EXC_ERR_GN_GETBYID.
	 *         Messages can be: 'EA_PARAMS', 'EA_ACCESS_DENIED',
	 *         'EA_SQLERROR', 'EA_NOT_EXISTS'.
	 *
	 * @return array of properties for node with $id
	 */
	public static function GetByID ($id);

	/**
	 * @param integer id of node to be removed
	 *
	 * @throws LearnException with errcode LearnException::EXC_ERR_GN_REMOVE,
	 *         also errmsg === 'EA_NOT_EXISTS' if there is wasn't node with this id.
	 */
	public static function Remove ($id);
}

/**
 * WARNING: nobody shouldn't rely on this code,
 * because it's FOR INTERNAL USE ONLY. Any declared
 * function can be removed or changed in future versions.
 * This code can be changed without any notifications.
 * DON'T USE it nowhere.
 *
 * @access private
 */
abstract class CLearnGraphNode implements ILearnGraphNode
{
	// Rights allowed for different fields (stored as bitmask). MUST be integers >= zero
	const SQL_NONE   = 0;
	const SQL_SELECT = 1;
	const SQL_INSERT = 2;
	const SQL_UPDATE = 4;

	public static function Remove($id)
	{
		global $DB;

		if ( ! is_numeric($id) )
			throw new LearnException ('EA_PARAMS', LearnException::EXC_ERR_GN_REMOVE);

		$lessonData = self::GetByID($id);
		if ( ! array_key_exists('NAME', $lessonData) )
			throw new LearnException ('EA_NOT_EXISTS', LearnException::EXC_ERR_GN_REMOVE);

		// Remove pictures
		if ( array_key_exists('PREVIEW_PICTURE', $lessonData) && ($lessonData['PREVIEW_PICTURE'] > 0) )
			CFile::Delete($lessonData['PREVIEW_PICTURE']);

		if ( array_key_exists('DETAIL_PICTURE', $lessonData) && ($lessonData['DETAIL_PICTURE'] > 0) )
			CFile::Delete($lessonData['DETAIL_PICTURE']);

		// Remove SCORM data
		if ( array_key_exists('SCORM', $lessonData) && ($lessonData['SCORM'] === 'Y') )
			DeleteDirFilesEx("/".(COption::GetOptionString("main", "upload_dir", "upload"))."/learning/scorm/" . $id);

		// Remove graph node
		$rc = $DB->Query (
			"DELETE FROM b_learn_lesson
			WHERE ID = '" . ($id + 0) . "'",
			true	// ignore errors
			);

		if ($rc === false)
			throw new LearnException ('EA_SQLERROR', LearnException::EXC_ERR_GN_REMOVE);

		if ($rc->AffectedRowsCount() == 0)
			throw new LearnException ('EA_NOT_EXISTS', LearnException::EXC_ERR_GN_REMOVE);
	}

	public static function GetByID($id)
	{
		global $DB;

		static $cacheFieldsToSelect = null;

		if ( ! (is_numeric ($id) && is_int ($id + 0)) )
			throw new LearnException ('EA_PARAMS', LearnException::EXC_ERR_GN_GETBYID);

		// Prepare list of DB fields to be selected
		if ($cacheFieldsToSelect === null)
		{
			$arReversedFieldsMap = self::_GetReversedFieldsMap();

			$arFieldsToSelect = array();
			foreach ($arReversedFieldsMap as $fieldNameInDB => $value)
			{
				if ($value['access'] & self::SQL_SELECT)
				{
					if ( ($fieldNameInDB === 'TIMESTAMP_X') || ($fieldNameInDB === 'DATE_CREATE') )
						$arFieldsToSelect[] = $DB->DateToCharFunction($fieldNameInDB) . ' AS ' . $fieldNameInDB;
					else
						$arFieldsToSelect[] = $fieldNameInDB;
				}
			}

			$cacheFieldsToSelect = implode (',', $arFieldsToSelect);

			if ( ! (strlen($cacheFieldsToSelect) > 0) )
				$cacheFieldsToSelect = false;
		}

		if ($cacheFieldsToSelect === false)
			throw new LearnException ('EA_ACCESS_DENIED', LearnException::EXC_ERR_GN_GETBYID);

		// Get graph node data
		$rc = $DB->Query (
			"SELECT " . $cacheFieldsToSelect . "
			FROM b_learn_lesson
			WHERE ID='" . (int) ($id + 0) . "'",
			true	// ignore errors
			);

		if ($rc === false)
			throw new LearnException ('EA_SQLERROR', LearnException::EXC_ERR_GN_GETBYID);

		if ( ! (($arData = $rc->Fetch()) && is_array($arData)) )
			throw new LearnException ('EA_NOT_EXISTS', LearnException::EXC_ERR_GN_GETBYID);

		return ($arData);
	}

	public static function Create($arInFields)
	{
		$lastID = self::_InsertOrUpdate ($arInFields, 'insert');

		return ($lastID);
	}

	public static function Update($id, $arInFields)
	{
		self::_InsertOrUpdate ($arInFields, 'update', $id);
	}

	protected static function _InsertOrUpdate ($arInFields, $mode, $id = false)
	{
		global $DB, $USER, $DBType;

		$createdBy = 1;
		if (is_object($USER) && method_exists($USER, 'getId'))
			$createdBy = (int) $USER->getId();

		$dbtype = strtolower($DBType);

		switch ($mode)
		{
			case 'update':
				$accessLevel  = self::SQL_UPDATE;
				$throwErrCode = LearnException::EXC_ERR_GN_UPDATE;
				$isInsert     = false;
				$isForUpdate  = true;

				if ( ! is_numeric ($id) )
					throw new LearnException ('EA_PARAMS: $id', $throwErrCode);
			break;

			case 'insert':
				$accessLevel  = self::SQL_INSERT;
				$throwErrCode = LearnException::EXC_ERR_GN_CREATE;
				$isInsert     = true;
				$isForUpdate  = false;
			break;

			default:
				throw new LearnException ('EA_LOGIC',
					LearnException::EXC_ERR_ALL_LOGIC);
			break;
		}

		// Mapping of fields' names in db and in function arguments
		$arFieldsMap = self::_GetFieldsMap();

		// Check params for access_level (throws LearnException on failure). After - canonize it
		$arFields = self::_CheckAndCanonizeFields ($arFieldsMap, $arInFields, $accessLevel, $isForUpdate);

		// Prepares array of fields with values for query to DB. Also, uploads/removes files, if there are.
		if ($isForUpdate)
			$arFieldsToDb = self::_PrepareDataForQuery ($arFieldsMap, $arFields, $id);
		else
			$arFieldsToDb = self::_PrepareDataForQuery ($arFieldsMap, $arFields, false);

		$newLessonId = null;

		if ($isInsert)
		{
			$arInsert = $DB->PrepareInsert('b_learn_lesson', $arFieldsToDb);

			if ($dbtype === 'oracle')
			{
				$newLessonId = intval($DB->NextID('sq_b_learn_lesson'));

				$strSql =
					"INSERT INTO b_learn_lesson 
						(ID, " . $arInsert[0] . ", 
						TIMESTAMP_X, DATE_CREATE, CREATED_BY) " .
					"VALUES 
						(" . $newLessonId . ", " . $arInsert[1] . ", " 
						. $DB->GetNowFunction() . ", " . $DB->GetNowFunction() . ", " . $createdBy . ")";

				$arBinds = array();

				if (array_key_exists('PREVIEW_TEXT', $arFieldsToDb))
					$arBinds['PREVIEW_TEXT'] = $arFieldsToDb['PREVIEW_TEXT'];

				if (array_key_exists('DETAIL_TEXT', $arFieldsToDb))
					$arBinds['DETAIL_TEXT'] = $arFieldsToDb['DETAIL_TEXT'];

				if (array_key_exists('KEYWORDS', $arFieldsToDb))
					$arBinds['KEYWORDS'] = $arFieldsToDb['KEYWORDS'];

				$rc = $DB->QueryBind($strSql, $arBinds, true);
			}
			elseif (($dbtype === 'mssql') || ($dbtype === 'mysql'))
			{
				$strSql =
					"INSERT INTO b_learn_lesson 
						(" . $arInsert[0] . ", 
						TIMESTAMP_X, DATE_CREATE, CREATED_BY) " .
					"VALUES 
						(" . $arInsert[1] . ", " 
						. $DB->GetNowFunction() . ", " . $DB->GetNowFunction() . ", " . $createdBy . ")";

				$rc = $DB->Query($strSql, true);

				$newLessonId = intval($DB->LastID());
			}
		}
		else	// update
		{
			$strUpdate = $DB->PrepareUpdate('b_learn_lesson', $arFieldsToDb);

			if ($strUpdate !== '')
				$strUpdate .= ', ';

			$strSql = "UPDATE b_learn_lesson SET $strUpdate 
					TIMESTAMP_X = " . $DB->GetNowFunction()
				. " WHERE ID = " . ($id + 0);

			if ($dbtype === 'oracle')
			{
				$arBinds = array();

				if (array_key_exists('PREVIEW_TEXT', $arFieldsToDb))
					$arBinds['PREVIEW_TEXT'] = $arFieldsToDb['PREVIEW_TEXT'];

				if (array_key_exists('DETAIL_TEXT', $arFieldsToDb))
					$arBinds['DETAIL_TEXT'] = $arFieldsToDb['DETAIL_TEXT'];

				if (array_key_exists('KEYWORDS', $arFieldsToDb))
					$arBinds['KEYWORDS'] = $arFieldsToDb['KEYWORDS'];

				$rc = $DB->QueryBind($strSql, $arBinds);
			}
			elseif (($dbtype === 'mssql') || ($dbtype === 'mysql'))
			{
				$rc = $DB->Query($strSql, $bIgnoreErrors = true);
			}

			// TIMESTAMP_X - date when data last changed, so update it
			$arFieldsToDb['TIMESTAMP_X'] = $DB->GetNowFunction();
		}

		if ($rc === false)
			throw new LearnException ('EA_SQLERROR', $throwErrCode);

		if ($isInsert)
			return ($newLessonId);	// id of created node
	}

	/**
	 * Prepares array of fields with values for query to DB.
	 * Also, uploads/removes files, if there are.
	 * @throws LearnException on error. Errcodes are: LearnException::EXC_ERR_GN_CHECK_PARAMS,
	 *         LearnException::EXC_ERR_GN_FILE_UPLOAD
	 */
	protected static function _PrepareDataForQuery ($arFieldsMap, $arFields, $lessonId)
	{
		global $DB;

		$arLessonData = false;

		// if data prepartation for update - cache data about lesson to be updated
		if ($lessonId !== false)
		{
			// if lesson data not cached - get it
			if ($arLessonData === false)
				$arLessonData = self::GetByID ($lessonId);
		}

		$arFieldsToDb = array ();

		foreach ($arFields as $field => $value)
		{
			$fieldNameInDB = $arFieldsMap[$field]['field'];

			if ( ($field === 'PREVIEW_PICTURE')
				|| ($field === 'DETAIL_PICTURE')
				|| ($fieldNameInDB === 'PREVIEW_PICTURE')
				|| ($fieldNameInDB === 'DETAIL_PICTURE')
			)
			{
				$error = CFile::CheckImageFile($value);
				if (strlen($error) > 0)
				{
					throw new LearnException (
						'EA_PARAMS: ' . $error, 
						LearnException::EXC_ERR_GN_CHECK_PARAMS);
				}

				// if data prepartation for update - gets prev pictures names
				if ($lessonId !== false)
				{
					if ( ! array_key_exists($field, $arLessonData) )
						throw new LearnException ('EA_LOGIC', LearnException::EXC_ERR_ALL_LOGIC);

					$arFields[$field]['old_file'] = $arLessonData[$field];
					$value = $arFields[$field];
				}

				// throws LearnException on error, returns FALSE if id of image not updated
				$fileId = self::_UploadFile ($fieldNameInDB, $value);
				if ($fileId === false)
					continue;	// id of image not updated

				// replace value for current field to fileId
				$value = $arFields[$field] = $fileId;
			}

			if ($value === NULL)
				$arFieldsToDb[$fieldNameInDB] = false;
			else
				$arFieldsToDb[$fieldNameInDB] = $value;
		}

		return ($arFieldsToDb);
	}

	/**
	 * @return integer id of file in table b_file
	 */
	protected static function _UploadFile ($fieldNameInDB, $arData)
	{
		if ( ! is_array($arData) )
		{
			throw new LearnException ('EA_PARAMS: ' . var_export ($arData, true),
				LearnException::EXC_ERR_GN_CHECK_PARAMS);
		}

		// Check for fields needed by CFile::SaveForDB
		$fieldsMustBe = array ('name', 'size', 'tmp_name', 'type', 'del', 'MODULE_ID');
		if (count(array_diff($fieldsMustBe, array_keys($arData))) !== 0)
		{
			throw new LearnException ('EA_PARAMS: some fields not found',
				LearnException::EXC_ERR_GN_CHECK_PARAMS);
		}

		if ($arData['del'] !== 'Y')
			$arData['del'] = '';		// we can't use N' due to bug in CFile::SaveToDB();

		$arFileData = array($fieldNameInDB => $arData);
		
		$rc = CFile::SaveForDB($arFileData, $fieldNameInDB, 
				'learning');	// learning - is folder in /upload

		// This is workaround caused by bug in CFile::SaveToDB();
		if (($rc === false) && ($arData['name'] == '') && ($arData['del'] !== 'Y'))
		{
			// We are not deleting file and not uploading new, so return FALSE, what means no image's ID updates occured
			return (false);
		}

		if ( ($rc === false)
			|| ( ! isset($arFileData[$fieldNameInDB]) )
			|| ( ($arData['del'] !== 'Y') && ($arFileData[$fieldNameInDB] === false) )
		)
		{
			throw new LearnException ('EA_OTHER: file uploading error: ' . var_export ($rc, true) 
				. '; ' . var_export ($arFileData, true) . '; ' . var_export ($arData, true),
				LearnException::EXC_ERR_GN_FILE_UPLOAD);
		}

		// If file removed - return NULL
		if ($arFileData[$fieldNameInDB] === false)
			$fileId = NULL;
		else
			$fileId = intval ($arFileData[$fieldNameInDB]);

		return ($fileId);
	}

	/**
	 * @throws LearnException with errcode LearnException::EXC_ERR_GN_CHECK_PARAMS
	 */
	protected static function _CheckAndCanonizeFields ($arFieldsMap, $arFields, $access_level, $forUpdate = false)
	{
		if ( ! (is_int($access_level) && ($access_level >= 0)) )
		{
			throw new LearnException ('EA_LOGIC: wrong access level',
				LearnException::EXC_ERR_GN_CHECK_PARAMS);
		}

		// Check params
		$arFieldsNames = array_keys($arFields);
		foreach ($arFieldsNames as $fieldName)
		{
			// Skip checking user fields
			if (substr($fieldName, 0, 3) === 'UF_')
				continue;

			// Is field exists in DB?
			if ( ! array_key_exists ($fieldName, $arFieldsMap) )
			{
				throw new LearnException ('EA_PARAMS: ' . $fieldName,
					LearnException::EXC_ERR_GN_CHECK_PARAMS);
			}

			// Is access_level allowed by logic?
			if (($arFieldsMap[$fieldName]['access'] & $access_level) !== $access_level)
			{
				throw new LearnException ('EA_LOGIC: ACCESS TO FIELD "' . $fieldName . '" logically prohibited.',
					LearnException::EXC_ERR_GN_CHECK_PARAMS);
			}
		}

		// PREVIEW_TEXT_TYPE
		if ( ( ! $forUpdate ) && ( ! array_key_exists('PREVIEW_TEXT_TYPE', $arFields) ) )
			$arFields['PREVIEW_TEXT_TYPE'] = 'text';	// by default, for backward compatibility

		if ( ( ! $forUpdate ) || array_key_exists('PREVIEW_TEXT_TYPE', $arFields) )
		{
			if ( ! in_array ($arFields['PREVIEW_TEXT_TYPE'], array('text', 'html'), true) )
				throw new LearnException ('EA_PARAMS: PREVIEW_TEXT_TYPE', LearnException::EXC_ERR_GN_CHECK_PARAMS);
		}

		// DETAIL_TEXT_TYPE
		if ( ( ! $forUpdate ) && ( ! array_key_exists('DETAIL_TEXT_TYPE', $arFields) ) )
			$arFields['DETAIL_TEXT_TYPE'] = 'text';		// by default, for backward compatibility

		if ( ( ! $forUpdate ) || array_key_exists('DETAIL_TEXT_TYPE', $arFields) )
		{
			if ( ! in_array ($arFields['DETAIL_TEXT_TYPE'], array('text', 'html', 'file'), true) )
				throw new LearnException ('EA_PARAMS: DETAIL_TEXT_TYPE', LearnException::EXC_ERR_GN_CHECK_PARAMS);
		}

		// KEYWORDS
		if ( ! $forUpdate )
		{
			if (
				( ! array_key_exists('KEYWORDS', $arFields) )
				|| ($arFields['KEYWORDS'] === NULL)
			)
			{
				$arFields['KEYWORDS'] = '';
			}
		}
		else	// for update
		{
			if (
				array_key_exists('KEYWORDS', $arFields) 
				&& ($arFields['KEYWORDS'] === NULL)
			)
			{
				$arFields['KEYWORDS'] = '';
			}
		}

		// ACTIVE
		if (array_key_exists('ACTIVE', $arFields))
		{
			// canonize
			if ( in_array($arFields['ACTIVE'], array(true, false), true) )
			{
				if ($arFields['ACTIVE'])
					$arFields['ACTIVE'] = 'Y';
				else
					$arFields['ACTIVE'] = 'N';
			}
		}
		else
		{
			if ( ! $forUpdate )
				$arFields['ACTIVE'] = 'Y';	// by default, for backward compatibility
		}

		// ACTIVE - check admitted region
		if ( ( ! $forUpdate ) || array_key_exists('ACTIVE', $arFields) )
		{
			if ( ! in_array($arFields['ACTIVE'], array('Y', 'N'), true) )
			{
				throw new LearnException ('EA_PARAMS: ACTIVE is out of range',
					LearnException::EXC_ERR_GN_CHECK_PARAMS);
			}
		}

		// PREVIEW_PICTURE
		if (array_key_exists('PREVIEW_PICTURE', $arFields))
		{
			// remove this field, if nothing to do
			if (!is_array($arFields['PREVIEW_PICTURE']))
			{
				unset($arFields['PREVIEW_PICTURE']);
			}
			else if (
				(!array_key_exists('name', $arFields['PREVIEW_PICTURE']) || strlen($arFields['PREVIEW_PICTURE']['name']) == 0)
				&&
				(!array_key_exists('del', $arFields['PREVIEW_PICTURE']) || strlen($arFields['PREVIEW_PICTURE']['del']) == 0)
				&&
				(!isset($arFields['PREVIEW_PICTURE']['description']) || strlen($arFields['PREVIEW_PICTURE']['description']) == 0)
			)
			{
				unset($arFields['PREVIEW_PICTURE']);
			}
			else
			{
				// check structure
				$check = array_key_exists('name', $arFields['PREVIEW_PICTURE'])
					&& array_key_exists('size', $arFields['PREVIEW_PICTURE'])
					&& array_key_exists('tmp_name', $arFields['PREVIEW_PICTURE'])
					&& array_key_exists('type', $arFields['PREVIEW_PICTURE'])
					&& ( ( ! array_key_exists('del', $arFields['PREVIEW_PICTURE']) )
						|| in_array($arFields['PREVIEW_PICTURE']['del'], array('Y', 'N', NULL), true)
						);

				if ( ! $check )
				{
					throw new LearnException ('EA_PARAMS: <pre>' . var_export($arFields['PREVIEW_PICTURE'], true) 
						. '</pre>', LearnException::EXC_ERR_GN_CHECK_PARAMS);
				}

				$arFields['PREVIEW_PICTURE']['MODULE_ID'] = CLearnHelper::MODULE_ID;	// learning

				if ($arFields['PREVIEW_PICTURE']['del'] === NULL)
					$arFields['PREVIEW_PICTURE']['del'] = 'N';
			}
		}

		// DETAIL_PICTURE
		if (array_key_exists('DETAIL_PICTURE', $arFields))
		{
			// remove this field, if nothing to do
			if (!is_array($arFields['DETAIL_PICTURE']))
			{
				unset($arFields['DETAIL_PICTURE']);
			}
			elseif (
				(!array_key_exists('name', $arFields['DETAIL_PICTURE']) || strlen($arFields['DETAIL_PICTURE']['name']) == 0)
				&&
				(!array_key_exists('del', $arFields['DETAIL_PICTURE']) || strlen($arFields['DETAIL_PICTURE']['del']) == 0)
				&&
				(!isset($arFields['DETAIL_PICTURE']['description']) || strlen($arFields['DETAIL_PICTURE']['description']) == 0)
			)
			{
				unset($arFields['DETAIL_PICTURE']);
			}
			else
			{
				// check structure
				$check = array_key_exists('name', $arFields['DETAIL_PICTURE'])
					&& array_key_exists('size', $arFields['DETAIL_PICTURE'])
					&& array_key_exists('tmp_name', $arFields['DETAIL_PICTURE'])
					&& array_key_exists('type', $arFields['DETAIL_PICTURE'])
					&& ( ( ! array_key_exists('del', $arFields['DETAIL_PICTURE']) )
						|| in_array($arFields['DETAIL_PICTURE']['del'], array('Y', 'N', NULL), true)
						);

				if ( ! $check )
				{
					throw new LearnException ('EA_PARAMS: <pre>' . var_export($arFields['DETAIL_PICTURE'], true) 
						. '</pre>', LearnException::EXC_ERR_GN_CHECK_PARAMS);
				}

				$arFields['DETAIL_PICTURE']['MODULE_ID'] = CLearnHelper::MODULE_ID;	// learning

				if ($arFields['DETAIL_PICTURE']['del'] === NULL)
					$arFields['DETAIL_PICTURE']['del'] = 'N';
			}
		}

		return ($arFields);
	}

	protected static function _GetFieldsMap()
	{
		static $arFieldsMap = null;

		if ($arFieldsMap === null)
		{
			$arFieldsMap = array(
				'ID'                => array (
										'field'  => 'ID',
										'access' => self::SQL_SELECT),
				'TIMESTAMP_X'       => array (
										'field'  => 'TIMESTAMP_X',
										'access' => self::SQL_SELECT),
				'DATE_CREATE'       => array (
										'field'  => 'DATE_CREATE',
										'access' => self::SQL_SELECT),
				'CREATED_BY'        => array (
										'field'  => 'CREATED_BY',
										'access' => self::SQL_SELECT),
				'ACTIVE'            => array (
										'field'  => 'ACTIVE',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'NAME'              => array (
										'field'  => 'NAME',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'CODE'              => array (
										'field'  => 'CODE',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'KEYWORDS'          => array (
										'field'  => 'KEYWORDS',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'PREVIEW_PICTURE'   => array (
										'field'  => 'PREVIEW_PICTURE',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'PREVIEW_TEXT'      => array (
										'field'  => 'PREVIEW_TEXT',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'PREVIEW_TEXT_TYPE' => array (
										'field'  => 'PREVIEW_TEXT_TYPE',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'DETAIL_PICTURE'    => array (
										'field'  => 'DETAIL_PICTURE',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'DETAIL_TEXT'       => array (
										'field'  => 'DETAIL_TEXT',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'DETAIL_TEXT_TYPE'  => array (
										'field'  => 'DETAIL_TEXT_TYPE',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE),
				'LAUNCH'            => array (
										'field'  => 'LAUNCH',
										'access' => self::SQL_SELECT + self::SQL_INSERT + self::SQL_UPDATE)
				);
		}

		return ($arFieldsMap);
	}

	protected static function _GetReversedFieldsMap()
	{
		static $cache = false;

		if ($cache === false)
		{
			$fieldsMap = self::_GetFieldsMap();

			foreach ($fieldsMap as $propertyName => $arData)
			{
				$fieldNameInDB = $arData['field'];
				$cache[$fieldNameInDB] = array ('propertyName' => $propertyName, 'access' => $arData['access']);
			}
		}

		return ($cache);
	}
}

Zerion Mini Shell 1.0