/** * Update the flashcard review status (uiFlashcardReview callback) * * Note: uiFlashcardReview callback, must sanitize data! * * Flashcard answer data is set by the front end code (review.js): * * id Flashcard id = framenum * r Answer (1=No 2=Yes 3=Easy)` * * @param mixed $id Flashcard id * @param object $oData Flashcard answer data * @return boolean True if update went succesfully */ public static function putFlashcardData($id, $oData) { // sanitize JSON data if (!preg_match('/^[0-9]+$/', $id) || ($id < 1 || $id > rtkBook::MAXKANJI_VOL3) || !isset($oData->r) || !preg_match('/^[1-3]$/', $oData->r)) { throw new coreException('updateFlashcard :: invalid data'); } $user = coreContext::getInstance()->getUser(); $userId = $user->getUserId(); // get current review status $select = self::getInstance()->select(array('totalreviews', 'leitnerbox', 'failurecount', 'successcount', 'lastreview'))->where('framenum = ?', $id); self::filterByUserId($select, $userId)->query(); $curData = self::$db->fetchObject(); if (!$curData) { throw new coreException('updateFlashcard :: no record for id'); } $oUpdateData = LeitnerSRS::rateCard($curData, $oData->r); //echo '<p>UPDATE framenum '.$id.' with '.print_r($oUpdateData, true); //return true; $result = self::getInstance()->update($oUpdateData, 'userid = ? AND framenum = ?', array($userId, $id)); if ($result && $oData->r > 1) { // clear relearned kanji if successfull answer LearnedKanjiPeer::clearKanji($userId, $id); } return $result; }