オンライン試験用の Joomla コンポーネントを作成していますが、フォーマット変換に苦労しています。基本的に、日付との差(秒単位)を取得してから分に変換したいのですが、何を試しても、オンラインで何を検索しても(SOを含む)、うまく動作しないようです。
次のコードがあります。
<?php
$session =& JFactory::getSession();
$sessionStuff = $session->get('quizSession');
$time_config =& JFactory::getConfig();
$time_jnow =& JFactory::getDate();
$time_jnow->setOffset( $time_config->getValue('config.offset' ));
$time_now = strtotime($time_jnow);
$started_time = strtotime($sessionStuff['lineSession']['started_on']);
$elapsedtime = /*gmdate("H:i:s",*/ abs($started_time - $time_now)/*)*/;
echo "Start_time: " . $started_time . '- Type: ' . gettype($started_time). '<br/>';
echo "Now: " . $time_now . '- Type: ' . gettype($time_now). '<br/>';
echo "Elapsed time: " . $elapsedtime . /*'- Type: ' . gettype($elapsedtime) .*/ '<br/>';
$availabletime = $started_time - $elapsedtime;
if(empty($sessionStuff)){
$availabletime = ($this->quiz->time_limit) ? $this->quiz->time_limit : 0;
} else {
$availabletime = $started_time - $elapsedtime;
}
echo "Available: " . $availabletime . '- Type: ' . gettype($availabletime);
?>
次を出力します。
Start_time: 1365756958- タイプ: 整数
現在: 1365757510- タイプ: 整数
経過時間: 552
利用可能: 1365756406- タイプ: 整数
次に、値を (分単位で) 受け取り、正しい形式に変換するこの JS コードがあります。
var hours ;
var minutes ;
var seconds ;
var t ;
var availableTime ;
var remainingTime ;
window.onload = function () {
listener();
availableTime = <?php
echo ($this->quiz->time_limit) ? $this->quiz->time_limit : 0;;
?> ;
if (availableTime)
{
hours = Math.floor(availableTime / 60) ;
minutes = availableTime % 60;
if (hours < 10) {
hours = '0' + hours ;
}
if (minutes < 10) {
minutes = '0' + minutes ;
}
seconds = '00' ;
var timer = document.getElementById('timer') ;
timer.innerHTML = '<?php echo JText::_('TIME_REMAINING') ; ?> ' + hours + ":" + minutes + ":" + seconds ;
remainingTime = availableTime *= 60 ;
updateTimer();
}
}
function pad(number, length)
{
var str = '' + number;
if (str.length < length) {
str = '0' + str;
}
return str;
}
function updateTimer()
{
seconds -= 1 ;
seconds = pad(seconds, 2) ;
if (seconds < 0)
{
seconds = '59' ;
minutes -= 1 ;
minutes = pad(minutes, 2) ;
if (minutes < 0)
{
minutes = '59' ;
hours -= 1 ;
hours = pad(hours, 2) ;
if (hours < 0)
{
hours = minutes = seconds = '00' ;
document.getElementById('timeUp').value = 1 ;
document.jquarks_quiz.submit();
return true ;
}
}
}
var timer = document.getElementById('timer') ;
timer.innerHTML = '<?php echo JText::_('TIME_REMAINING') ; ?> ' + hours + ':' + minutes + ':' + seconds ;
remainingTime -= 1 ;
if (Math.floor(availableTime / 10) == remainingTime )
{
timer.style.color="white" ;
timer.style.backgroundColor = "#DD0000" ;
}
t = setTimeout("updateTimer()", 1000);
}
このコードに「ネイティブ」形式 (PHP) を使用すると、次のようになります。
$time_now = $time_jnow;
$started_time = $sessionStuff['lineSession']['started_on'];
出力が得られます:
Start_time: 2013-04-12 09:55:58- タイプ: 文字列
現在: 2013-04-12 10:23:20- タイプ: オブジェクト
さて、私が意図しているのは、「started_time」と「time_now」の時間差を計算し、(ページの更新でセッションが設定されている場合)「elapsedtime」を「started_time」から差し引いて、タイムアウトカウンターがから継続するようにすることです中断したところ。
何をしようとしても、物事を正しく機能させることができないようです。誰かが私を正しい方向に向けることができますか? 私はすでにこれであまりにも多くの時間を失っており、PHP は私の得意分野ではありません。どうすれば意図した目標を達成できますか?
編集:
JS の「availableTime」が一定の時間を取得していることは認識していますが、それは今のところデバッグ目的のためだけです。すべてが正常に機能するようになると、PHP の「$availabletime」出力が提供されます。
編集2:
目的が何であるかについては明確にされていないようです。試験が開始されたら、15 分間の時間があるとします。ユーザーが 1 分 31 秒 (00:01:31) 後にページを更新したと仮定すると、利用可能な時間は 13 分 29 秒 (00:13:29) になるはずです。これは、経過時間 (秒単位) の計算を実行できますが、達成できない動作です。