questlab/questtypes/textinput/TextinputQuesttypeModel.inc
coderkun 046a724272 merge
2015-04-27 16:42:05 +02:00

257 lines
6.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* The Legend of Z
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
* @copyright 2014 Heinrich-Heine-Universität Düsseldorf
* @license http://www.gnu.org/licenses/gpl.html
* @link https://bitbucket.org/coderkun/the-legend-of-z
*/
namespace hhu\z\questtypes;
/**
* Model of the TextinputQuesttypeAgent for inserting text.
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
*/
class TextinputQuesttypeModel extends \hhu\z\models\QuesttypeModel
{
/**
* Copy a Quest
*
* @param int $userId ID of creating user
* @param int $sourceQuestId ID of Quest to copy from
* @param int $targetQuestId ID of Quest to copy to
* @param int $seminaryMediaIds Mapping of SeminaryMedia-IDs from source Seminary to targetSeminary
*/
public function copyQuest($userId, $sourceQuestId, $targetQuestId, $seminaryMediaIds)
{
// Copy textinput
$this->db->query(
'INSERT INTO questtypes_textinput '.
'(quest_id, created_user_id, text) '.
'SELECT ?, ?, text '.
'FROM questtypes_textinput '.
'WHERE quest_id = ?',
'iii',
$targetQuestId, $userId,
$sourceQuestId
);
// Copy fields
$this->db->query(
'INSERT INTO questtypes_textinput_fields '.
'(questtypes_textinput_quest_id, number, questtypes_textinput_fieldsize_id, regex) '.
'SELECT ?, number, questtypes_textinput_fieldsize_id, regex '.
'FROM questtypes_textinput_fields '.
'WHERE questtypes_textinput_quest_id = ?',
'ii',
$targetQuestId,
$sourceQuestId
);
}
/**
* Get textinput-text for a Quest.
*
* @param int $questId ID of Quest
* @return array Textinput-text
*/
public function getTextinputQuest($questId)
{
$data = $this->db->query(
'SELECT text '.
'FROM questtypes_textinput '.
'WHERE quest_id = ?',
'i',
$questId
);
if(!empty($data)) {
return $data[0];
}
return null;
}
/**
* Get fields for a textinput-text.
*
* @param int $questId ID of Quest
* @return array Fields
*/
public function getTextinputFields($questId)
{
return $this->db->query(
'SELECT fields.id, fields.number, fields.regex, fieldsizes.id AS fieldsize_id, fieldsizes.size '.
'FROM questtypes_textinput_fields AS fields '.
'LEFT JOIN questtypes_textinput_fieldsizes AS fieldsizes ON fieldsizes.id = fields.questtypes_textinput_fieldsize_id '.
'WHERE fields.questtypes_textinput_quest_id = ? '.
'ORDER BY fields.number ASC',
'i',
$questId
);
}
/**
* Save Characters submitted answer for one textinput field.
*
* @param int $fieldId ID of field
* @param int $characterId ID of Character
* @param string $answer Submitted answer for this field
*/
public function setCharacterSubmission($fieldId, $characterId, $answer)
{
$this->db->query(
'INSERT INTO questtypes_textinput_fields_characters '.
'(questtypes_textinput_field_id, character_id, value) '.
'VALUES '.
'(?, ?, ?) '.
'ON DUPLICATE KEY UPDATE '.
'value = ?',
'iiss',
$fieldId, $characterId, $answer, $answer
);
}
/**
* Get answer of one input field submitted by Character.
*
* @param int $fieldId ID of field
* @param int $characterId ID of Character
* @return string Submitted answer for this field or empty string
*/
public function getCharacterSubmission($fieldId, $characterId)
{
$data = $this->db->query(
'SELECT value '.
'FROM questtypes_textinput_fields_characters '.
'WHERE questtypes_textinput_field_id = ? AND character_id = ? ',
'ii',
$fieldId, $characterId
);
if(!empty($data)) {
return $data[0]['value'];
}
return '';
}
/**
* Set the text for a Quest and correct fields count.
*
* @param int $userId ID of user setting text
* @param int $questId ID of Quest to set text for
* @param string $text Text for Quest
*/
public function setTextForQuest($userId, $questId, $text)
{
$this->db->setAutocommit(false);
try {
// Set text
$this->db->query(
'INSERT INTO questtypes_textinput '.
'(quest_id, created_user_id, text) '.
'VALUES '.
'(?, ?, ?) '.
'ON DUPLICATE KEY UPDATE '.
'text = ?',
'iiss',
$questId,
$userId,
$text,
$text
);
// Count fields
$fieldCount = substr_count($text, '[textinput]');
// Remove fields
$this->db->query(
'DELETE FROM questtypes_textinput_fields '.
'WHERE questtypes_textinput_quest_id = ? AND number > ?',
'ii',
$questId,
$fieldCount
);
// Add fields
for($i=1; $i<=$fieldCount; $i++)
{
$this->db->query(
'INSERT IGNORE INTO questtypes_textinput_fields '.
'(questtypes_textinput_quest_id, number, regex) '.
'VALUES '.
'(?, ?, ?) ',
'iis',
$questId,
$i,
''
);
}
$this->db->commit();
}
catch(\Exception $e) {
$this->db->rollback();
$this->db->setAutocommit(true);
throw $e;
}
$this->db->setAutocommit(true);
}
/**
* Set values for a field of a text.
*
* @param int $questId ID of Quest to set field for
* @param int $number Field number
* @param int $sizeId ID of field size
* @param string $regex RegEx for field
*/
public function setFieldForText($questId, $number, $sizeId, $regex)
{
$this->db->query(
'UPDATE questtypes_textinput_fields '.
'SET questtypes_textinput_fieldsize_id = ?, regex = ? '.
'WHERE questtypes_textinput_quest_id = ? AND number = ?',
'isii',
$sizeId,
$regex,
$questId,
$number
);
}
/**
* Get all registered field sizes.
*
* @return List of field sizes
*/
public function getFieldSizes()
{
return $this->db->query(
'SELECT id, size '.
'FROM questtypes_textinput_fieldsizes '.
'ORDER BY size'
);
}
}
?>