Битрикс: просмотр неправильных ответов в тестах

Я уже писал о системе обучения в битриксе. Есть у неё еще одна интересная особенность. В стандартном компоненте пользователь, пройдя тест, не может увидеть список вопросов, на которые он ответил неправильно. Это, мягко говоря, странно.

Задача

Сделать вывод неправильных ответов в тесте.

Поиск решения

Результаты всех попыток прохождения теста выводятся в «журнале обучения». Логично было бы предположить, что там же должна быть информация о неправильных ответах. Поэтому изменять было решено именно шаблон для этого компонента.

Перед тем как начать в чём-то ковыряться, я спросил на форуме битрикса, не реализован ли уже этот функционал в компоненте. Там мне ответили, что уже давно планируется новая версия модуля обучения, где такую штуковину уже написали.

Этот факт повлиял на выбор решения. Изначально я думал вывести тест вопроса, неправильный ответ пользователя и то, что нужно было выбрать. Но потом решил обойтись только текстом вопроса. Т.к. нет смысла дублировать функционал того, что скоро будет.

Решение

В шаблоне компонента learning.student.gradebook нужно найти код для вывода попыток

<?foreach ($arResult["ATTEMPTS"] as $arAttempt):?>Syhi-подсветка кода

Здесь на каждую попытку отведено по строке таблицы. Для вывода неправильных ответов я решил создать еще дону строчку под попыткой и вывести там неправильные ответы с помощью метода CTestResult::GetList Получился вот такой код.

//получаем список ответов
$CDBResult = CTestResult::GetList(
	Array(
		'QUESTION_ID' => 'ASC'
	),
	Array(
		'CORRECT' => 'N',
		'ATTEMPT_ID' => $arAttempt['ID'],
		'ANSWERED' => 'Y'
	)
);?>

<tr class="error-list"><td colspan="5"><p>Список неправильно отвеченных вопросов:</p><ol>

<?while($arTestResult = $CDBResult->Fetch()){?>
	<li><?=$arTestResult['QUESTION_NAME']?></li>
<?}?>

</ol></td></tr>

Внешне это выглядит вот так:

Вывод неправильных ответов в Bitrix'е

Вывод неправильных ответов в Bitrix'е

Как временное решение, сойдёт. Надеюсь, новая версия модуля выйдет раньше нового года. Иначе придётся переписывать.

9 комментариев

Chapik

Задумка класная. Благодаря непонятной ошибке у меня получилось то, что мне надо было (вывод всех неправильных вопросов без привязки к тестированию). А вот как у Автора — не вышло %)
Проблема в том, что для каждого тестирования выводится общий список ошибочно отвеченных вопросов, а не список ошибок именно в том или ином тестировании — не понял почему :(

Не серчайте, так как воркаю в битриксе 2-й месяц. *CRAZY*

Ответить

Морозов Максим

Вероятно это потому, что у вас в $arAttempt[«ID»] нет айдишника попытки =)

Ответить

Сергей

Добрый день! Столкнулся с проблемкой — битрикс старенький, а Вы написали «Изначально я думал вывести тест вопроса, неправильный ответ пользователя и то, что нужно было выбрать.» — а не подскажете как это сделать ?

Ответить

Морозов Максим

Можно кастомизировать шаблон компонента learning.student.gradebook, который выводит результаты. И воспользоваться вот этим методом. Собственно, это я в записи и предлагал.

Но, возможно за 5 лет там уже что-то поменяли и теперь можно в настройках что-то указать =)

Ответить

Сергей

по этому методу RESPONSE получается вывести только ID неправильного ответа :(
и в итоге

Список неправильно отвеченных вопросов:
вопрос №1
номер неправильного ответа: 4 (это ID ответа в админке)
неправильный ответ:

Ответить

Морозов Максим

Для ответов лучше использовать метод CLAnswer::GetByID() этот метод возвращает по id ответа вот такой массив:

Array
(
    [ID] => 135
    [QUESTION_ID] => 41
    [SORT] => 10
    [ANSWER] => Текст ответа.
    [CORRECT] => N
    [FEEDBACK] => 
    [MATCH_ANSWER] => 
    [QUESTION_NAME] => Текст вопроса
)

Ну и при таком раскладе лучше сразу использовать CLAnswer::GetList(), чтобы получать не список вопросов, а список ответов =)

Ответить

Сергей

Да как раз воспользовался этими методами )
спасибо огромное добрый человек!
вот что удалось реализовать -вывел 2 строки под результатами — может пригодится:

‘ASC’
),
Array(
‘CORRECT’ => ‘N’,
‘ATTEMPT_ID’ => $arAttempt[‘ID’],
‘ANSWERED’ => ‘Y’
)
);
$ANSWER_ID = $arTestResult[‘RESPONSE’];

$res = CLAnswer::GetByID($ANSWER_ID);
if ($arAnswer = $res->GetNext())
{
}

?>
Список НЕправильно отвеченных вопросов:
Fetch()){
$ANSWER_ID = $arTestResult[‘RESPONSE’];

$res = CLAnswer::GetByID($ANSWER_ID);
if ($arAnswer = $res->GetNext())
{
}
?>
Вопрос —
НЕправильный ответ —
‘ASC’
),
Array(
‘CORRECT’ => ‘Y’,
‘ATTEMPT_ID’ => $arAttempt[‘ID’],
‘ANSWERED’ => ‘Y’
)
);
if (CModule::IncludeModule(«learning»))
{
$ANSWER_ID = $arAnswer[‘ID’];

$res = CLAnswer::GetByID($ANSWER_ID);
if ($arAnswer = $res->GetNext())
{
}
}
?>
Список правильно отвеченных вопросов:
Fetch()){
$ANSWER_ID = $arTestResult[‘RESPONSE’];

$res = CLAnswer::GetByID($ANSWER_ID);
if ($arAnswer = $res->GetNext())
{
}
?>
Вопрос —
Правильный ответ —

Ответить

Сергей
Наталья

Вывести правильный и неправильный вариант ответа получилось, а не подскажете как вывести правильный вариант ответа на вопрос в том случае, если дали неправильный ответ. То есть тот вариант, который задан у вопроса в админке? почему-то у меня не выходит.

Ответить

Ваш отзыв

logo