type = ORAL_EXPRESSION;
$this->isContent = $this->getIsContent();
}
/**
* function which redefine Question::createAnswersForm
* @param FormValidator $form
*/
function createAnswersForm($form)
{
$form -> addElement('text','weighting', get_lang('Weighting'), array('class' => 'span1'));
global $text, $class;
// setting the save button here and not in the question class.php
$form->addButtonSave($text, 'submitQuestion');
if (!empty($this->id)) {
$form -> setDefaults(array('weighting' => float_format($this->weighting, 1)));
} else {
if ($this -> isContent == 1) {
$form -> setDefaults(array('weighting' => '10'));
}
}
}
/**
* abstract function which creates the form to create / edit the answers of the question
* @param the FormValidator $form
*/
function processAnswersCreation($form)
{
$this->weighting = $form->getSubmitValue('weighting');
$this->save();
}
/**
* @param null $feedback_type
* @param null $counter
* @param null $score
* @return null|string
*/
function return_header($feedback_type = null, $counter = null, $score = null)
{
$header = parent::return_header($feedback_type, $counter, $score);
$header .= '
|
'.get_lang("Answer").' |
|
';
return $header;
}
/**
* initialize the attributes to generate the file path
* @param $sessionId integer
* @param $userId integer
* @param $exerciseId integer
* @param $exeId integer
*/
public function initFile($sessionId, $userId, $exerciseId, $exeId)
{
$this->sessionId = intval($sessionId);
$this->userId = intval($userId);
$this->exerciseId = 0;
$this->exeId = intval($exeId);
if (!empty($exerciseId)) {
$this->exerciseId = intval($exerciseId);
}
$this->storePath = $this->generateDirectory();
$this->fileName = $this->generateFileName();
$this->filePath = $this->storePath . $this->fileName;
}
/**
* Generate the necessary directory for audios. If them not exists, are created
* @return string
*/
private function generateDirectory()
{
$this->storePath = api_get_path(SYS_COURSE_PATH) . $this->course['path'] . '/exercises/';
if (!is_dir($this->storePath)) {
mkdir($this->storePath);
}
if (!is_dir($this->storePath . $this->sessionId)) {
mkdir($this->storePath . $this->sessionId);
}
if (!empty($this->exerciseId) && !is_dir($this->storePath . $this->sessionId . '/' . $this->exerciseId)) {
mkdir($this->storePath . $this->sessionId . '/' . $this->exerciseId);
}
if (!empty($this->id) && !is_dir($this->storePath . $this->sessionId . '/' . $this->exerciseId . '/' . $this->id)) {
mkdir($this->storePath . $this->sessionId . '/' . $this->exerciseId . '/' . $this->id);
}
if (!empty($this->userId) && !is_dir($this->storePath . $this->sessionId . '/' . $this->exerciseId . '/' . $this->id . '/' . $this->userId)) {
mkdir($this->storePath . $this->sessionId . '/' . $this->exerciseId . '/' . $this->id . '/' . $this->userId);
}
$params = [
$this->sessionId,
$this->exerciseId,
$this->id,
$this->userId,
];
$this->storePath .= implode('/', $params).'/';
return $this->storePath;
}
/**
* Generate the file name
* @return string
*/
private function generateFileName()
{
return implode(
'-',
[
$this->course['real_id'],
$this->sessionId,
$this->userId,
$this->exerciseId,
$this->id,
$this->exeId
]
);
}
/**
* Generate a relative directory path
* @return string
*/
private function generateRelativeDirectory()
{
$params = [
$this->sessionId,
$this->exerciseId,
$this->id,
$this->userId,
];
$path = implode('/', $params);
$directory = '/exercises/'.$path.'/';
return $directory;
}
/**
* Return the HTML code to show the RecordRTC/Wami recorder
* @return string
*/
public function returnRecorder()
{
$directory = '/..' . $this->generateRelativeDirectory();
$recordAudioView = new Template('', false, false,false, false, false, false);
$recordAudioView->assign('directory', $directory);
$recordAudioView->assign('user_id', $this->userId);
$recordAudioView->assign('file_name', $this->fileName);
$template = $recordAudioView->get_template('exercise/oral_expression.tpl');
return $recordAudioView->fetch($template);
}
/**
* Get the absolute file path. Return null if the file doesn't exists
* @param bool $loadFromDatabase
* @return string
*/
public function getAbsoluteFilePath($loadFromDatabase = false)
{
$fileName = $this->fileName;
if ($loadFromDatabase) {
$em = Database::getManager();
//Load the real filename just if exists
if (isset($this->exeId, $this->userId, $this->id, $this->sessionId, $this->course['real_id'])) {
$result = $em
->getRepository('ChamiloCoreBundle:TrackEAttempt')
->findOneBy([
'exeId' => $this->exeId,
'userId' => $this->userId,
'questionId' => $this->id,
'sessionId' => $this->sessionId,
'cId' => $this->course['real_id']
]);
if (!$result) {
return '';
}
$fileName = $result->getFilename();
if (empty($fileName)) {
return '';
}
return $this->storePath . $result->getFilename();
}
}
foreach ($this->available_extensions as $extension) {
$file = "{$this->storePath}$fileName.$extension";
if (!is_file($file)) {
continue;
}
return $file;
}
return '';
}
/**
* Get the URL for the audio file. Return null if the file doesn't exists
* @param bool $loadFromDatabase
*
* @return string
*/
public function getFileUrl($loadFromDatabase = false)
{
$filePath = $this->getAbsoluteFilePath($loadFromDatabase);
if (empty($filePath)) {
return null;
}
return str_replace(
api_get_path(SYS_COURSE_PATH),
api_get_path(WEB_COURSE_PATH),
$filePath
);
}
/**
* Tricky stuff to deal with the feedback = 0 in exercises (all question per page)
* @param $exe_id integer
*/
public function replaceWithRealExe($exe_id)
{
$filename = null;
//ugly fix
foreach ($this->available_extensions as $extension) {
$items = explode('-', $this->fileName);
$items[5] = 'temp_exe';
$filename = implode('-', $items);
if (is_file($this->storePath . $filename . '.' . $extension)) {
$old_name = $this->storePath . $filename . '.' . $extension;
$items = explode('-', $this->fileName);
$items[5] = $exe_id;
$filename = $filename = implode('-', $items);
$new_name = $this->storePath . $filename . '.' . $extension;
rename($old_name, $new_name);
break;
}
}
}
}