%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/learning/classes/general/ |
| Current File : /home/bitrix/www/bitrix/modules/learning/classes/general/grouplesson.php |
<?php
/**
* Bitrix Framework
* @package bitrix
* @subpackage learning
* @copyright 2001-2013 Bitrix
*/
/*
table definition:
CREATE TABLE b_learn_groups_lesson (
LEARNING_GROUP_ID int(11) NOT NULL DEFAULT '0',
LESSON_ID int(11) NOT NULL DEFAULT '0',
DELAY int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (LEARNING_GROUP_ID, LESSON_ID),
KEY LESSON_ID (LESSON_ID)
);
*/
class CLearningGroupLesson
{
/**
* Creates new learning group <-> lesson pair
*
* @param array $arFields
*
* @return bool true/false (false - on error)
*/
public static function add($arFields)
{
global $DB;
if ( ! self::checkFields($arFields) )
return false;
$delay = (int) $arFields['DELAY'];
$lessonId = (int) $arFields['LESSON_ID'];
$groupId = (int) $arFields['LEARNING_GROUP_ID'];
$strSql = "INSERT INTO b_learn_groups_lesson (LEARNING_GROUP_ID, LESSON_ID, DELAY)
VALUES ($groupId, $lessonId, $delay)";
$rc = $DB->query($strSql, $bIgnoreErrors = true);
return ($rc !== false);
}
public static function update($arFields)
{
global $DB;
if ( ! self::checkFields($arFields) )
return false;
$delay = (int) $arFields['DELAY'];
$lessonId = (int) $arFields['LESSON_ID'];
$groupId = (int) $arFields['LEARNING_GROUP_ID'];
$strSql = "UPDATE b_learn_groups_lesson
SET DELAY = $delay
WHERE LEARNING_GROUP_ID = $groupId AND LESSON_ID = $lessonId
";
$rc = $DB->query($strSql, $bIgnoreErrors = true);
return ($rc !== false);
}
/**
* Get list of existing learning group <-> lesson pairs
*
* @param array $arOrder
* @param array $arFilter
* @param array $arSelect
* @param array $arNavParams
*
* @return CDBResult
*/
public static function getList($arOrder, $arFilter, $arSelect = array(), $arNavParams = array())
{
global $DB, $USER;
$arFields = array(
'LEARNING_GROUP_ID' => 'LGL.LEARNING_GROUP_ID',
'LESSON_ID' => 'LGL.LESSON_ID',
'DELAY' => 'LGL.DELAY'
);
if (count($arSelect) <= 0 || in_array("*", $arSelect))
$arSelect = array_keys($arFields);
if (!is_array($arOrder))
$arOrder = array();
foreach ($arOrder as $by => $order)
{
$by = (string) $by;
$needle = null;
$order = strtolower($order);
if ($order != "asc")
$order = "desc";
if (array_key_exists($by, $arFields))
{
$arSqlOrder[] = ' ' . $by . ' ' . $order . ' ';
$needle = $by;
}
if (
($needle !== null)
&& ( ! in_array($needle, $arSelect, true) )
)
{
$arSelect[] = $needle;
}
}
$arSqlSelect = array();
foreach ($arSelect as $field)
{
$field = strtoupper($field);
if (array_key_exists($field, $arFields))
$arSqlSelect[$field] = $arFields[$field] . ' AS ' . $field;
}
if (!sizeof($arSqlSelect))
$arSqlSelect = 'LGL.LESSON_ID AS LESSON_ID';
$arSqlSearch = self::getFilter($arFilter);
$strSql = "
SELECT
" . implode(",\n", $arSqlSelect);
$strFrom = "
FROM
b_learn_groups_lesson LGL
"
. (sizeof($arSqlSearch) ? " WHERE " . implode(" AND ", $arSqlSearch) : "") . " ";
$strSql .= $strFrom;
$strSqlOrder = "";
DelDuplicateSort($arSqlOrder);
for ($i = 0, $arSqlOrderCnt = count($arSqlOrder); $i < $arSqlOrderCnt; $i++)
{
if ($i == 0)
$strSqlOrder = " ORDER BY ";
else
$strSqlOrder .= ",";
$strSqlOrder .= $arSqlOrder[$i];
}
$strSql .= $strSqlOrder;
if (count($arNavParams))
{
if (isset($arNavParams['nTopCount']))
{
$strSql = $DB->TopSql($strSql, (int) $arNavParams['nTopCount']);
$res = $DB->Query($strSql, $bIgnoreErrors = false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
}
else
{
$res_cnt = $DB->Query("SELECT COUNT(LGL.ID) as C " . $strFrom);
$res_cnt = $res_cnt->Fetch();
$res = new CDBResult();
$rc = $res->NavQuery($strSql, $res_cnt["C"], $arNavParams, $bIgnoreErrors = false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
}
}
else
{
$res = $DB->Query($strSql, $bIgnoreErrors = false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
}
return $res;
}
/**
* Removes existing learning group <-> lesson pairs
*
* @param int $groupId
*
* @return bool false on error, or true - if no errors detected
*/
public static function deleteByGroup($groupId)
{
global $DB;
$rc = $DB->Query(
"DELETE FROM b_learn_groups_lesson WHERE LEARNING_GROUP_ID = " . (int) $groupId,
$bIgnoreErrors = true
);
return ($rc !== false);
}
/**
* Removes existing learning group <-> lesson pairs
*
* @param int $lessonId
*
* @return bool false on error, or true - if no errors detected
*/
public static function deleteByLesson($lessonId)
{
global $DB;
$rc = $DB->Query(
"DELETE FROM b_learn_groups_lesson WHERE LESSON_ID = " . (int) $lessonId,
$bIgnoreErrors = true
);
return ($rc !== false);
}
/**
* Removes existing learning group <-> lesson pairs
*
* @param int $lessonId
* @param int $groupId
*
* @return bool false on error, or true - if no errors detected
*/
public static function delete($lessonId, $groupId)
{
global $DB;
$rc = $DB->Query(
"DELETE FROM b_learn_groups_lesson
WHERE LESSON_ID = " . (int) $lessonId . "
AND LEARNING_GROUP_ID = " . (int) $groupId,
$bIgnoreErrors = true
);
return ($rc !== false);
}
public static function getDelays($learningGroupId, $arLessonsIds)
{
if ( ! is_array($arLessonsIds) )
return false;
$arLessonsIds = array_filter($arLessonsIds);
if (empty($arLessonsIds))
return (array());
// fill default values
$arDelays = array();
foreach ($arLessonsIds as $lessonId)
$arDelays[$lessonId] = 0;
$rs = self::getList(
array(),
array(
'LEARNING_GROUP_ID' => $learningGroupId,
'LESSON_ID' => $arLessonsIds
),
array('LESSON_ID', 'DELAY')
);
while ($ar = $rs->fetch())
{
$lessonId = (int) $ar['LESSON_ID'];
if (isset($arDelays[$lessonId]))
$arDelays[$lessonId] = (int) $ar['DELAY'];
}
return ($arDelays);
}
public static function setDelays($learningGroupId, $arDelays)
{
if ( ! is_array($arDelays) )
return false;
$learningGroupId = (int) $learningGroupId;
$arLessonsIds = array();
// first, collect lessons ids
foreach ($arDelays as $lessonId => $delay)
$arLessonsIds[] = (int) $lessonId;
$arLessonsIds = array_unique(array_filter($arLessonsIds));
// determine already registered delays in DB
$arRegistered = array();
if ( ! empty($arLessonsIds) )
{
$rs = self::getList(
array(),
array(
'LEARNING_GROUP_ID' => $learningGroupId,
'LESSON_ID' => $arLessonsIds
),
array('LESSON_ID')
);
while ($ar = $rs->fetch())
$arRegistered[] = (int) $ar['LESSON_ID'];
}
$arRegistered = array_unique(array_filter($arRegistered));
// Do update/add
foreach ($arDelays as $lessonId => $delay)
{
$arFields = array(
'DELAY' => abs((int)$delay),
'LESSON_ID' => (int) $lessonId,
'LEARNING_GROUP_ID' => $learningGroupId
);
if (in_array((int)$lessonId, $arRegistered, true))
self::update($arFields);
else
self::add($arFields);
}
}
private static function checkFields($arFields)
{
global $DB;
IncludeModuleLangFile(__FILE__);
$arMsg = array();
if ( ! array_key_exists('LEARNING_GROUP_ID', $arFields) )
$arMsg[] = array("id" => "LEARNING_GROUP_ID", "text" => GetMessage("LEARNING_BAD_LEARNING_GROUP_ID"));
else
{
$rs = CLearningGroup::getList(array(), array('ID' => (int) $arFields['LEARNING_GROUP_ID']), array('ID'));
if ( ! ($rs && $rs->fetch()) )
$arMsg[] = array("text" => GetMessage("LEARNING_BAD_LEARNING_GROUP_ID_EX"), "id" => "BAD_GROUP_ID");
}
if ( ! array_key_exists('LESSON_ID', $arFields) )
$arMsg[] = array("id" => "LESSON_ID", "text" => GetMessage("LEARNING_BAD_LESSON_ID"));
if (!empty($arMsg))
{
$e = new CAdminException($arMsg);
$GLOBALS["APPLICATION"]->ThrowException($e);
return false;
}
return true;
}
private static function getFilter($arFilter)
{
if (!is_array($arFilter))
$arFilter = array();
$arSqlSearch = array();
foreach ($arFilter as $key => $val)
{
$res = CLearnHelper::MkOperationFilter($key);
$key = $res["FIELD"];
$cOperationType = $res["OPERATION"];
$key = strtoupper($key);
switch ($key)
{
case 'LESSON_ID':
case 'LEARNING_GROUP_ID':
$arSqlSearch[] = CLearnHelper::FilterCreate('LGL.' . $key, $val, 'number', $bFullJoin, $cOperationType);
break;
}
}
return array_filter($arSqlSearch);
}
public static function onAfterLearningGroupDelete($groupId)
{
self::deleteByGroup($groupId);
}
}