1

私はもう一度SOコミュニティに少しの助けを求めています。

Joomlaの「クイズ」コンポーネントを変更して、必要な動作をするようにしています。私が今やろうとしているのは、コンポーネントの「更新」動作を変更することです。基本的に、すべてのクイズにはタイムアウトがあります。つまり、ユーザーがクイズにアクセスできなくなったため、タイマーが0になると、クイズが送信されます。ただし、このコンポーネントのデフォルトの動作では、ページが更新されると、タイマーは最初に設定された時間(たとえば、10分)にリセットされます。

リフレッシュした場合に備えて、タイマーを残したところから継続させたいのです。

私は3、4年前からPHPを使っていないので、ちょっと迷っています。

目的の動作を実現するために、初期時間(クイズが開かれたとき)と「現在」の時間(ロード時には0に設定されていますが、更新時に必要です)を(implodeを介して)保存するCookieを設定しています。リロード時間を保存するためにCookieを「更新」します)。

最初の時間と現在の時間で、経過した時間を計算し、タイマーを中断したところから配置することができます。

問題は、javascript'onbeforeunload'を使用してCookieを「更新」しようとしているため、Cookieに更新時間を取得することができます。しかし、何らかの理由で、それはまったく何もしていません。クッキーの内容を見に行くと、クッキーが設定されたときからすべてが同じです。

Cookieを更新するには、Cookieを削除してから再度設定する必要があることはわかっていますが、失敗しています。

サンプルコードは次のとおりです。

//This is responsible for setting the cookie (via PHP):
<?php
$name = "progress";
$now = 0;
$time_diff = 0;
$expire = time() + 3600;
$data = array(time(), $now, $time_diff, $this->quiz->time_limit);
//$var = implode(',', $data);

if(isset($_COOKIE[$name])) {
    /* If defined, update the timer */

} else {
    setcookie($name, implode(',',$data), $expire);
}
echo $_COOKIE[$name];
echo "<br />";
echo $this->quiz->time_limit;
?>

そして、これは「更新」イベントを検出するためのものです(PHPを実行するJavascriptを使用)。

window.onbeforeunload = function() {
    <?php
        $name = "progress";
        $list = explode($_COOKIE[$name]);
        //delete cookie
        setcookie($name, "", time() - 3600);

        //Update the fields
        $list['1'] = time(); //now - refresh time
        $list['2'] = $list['1'] - $list['0']; //time_diff

        //Set the cookie again
        setcookie($name, implode(',', $list), time() + 3600);
    ?>
}

誰かがこのコードの何が問題になっているのか指摘できますか?

4

1 に答える 1

2

コメントで述べられているように、JavaScriptはそのようなPHPコードを実行できません...しかし、AJAXを使用する場合は実行できます。投稿したコードを確認できるようになりました。ブラウザにページを読み込んでコードを表示すると、関数は次のようになります。

window.onbeforeunload(){

}

したがって、ブラウザを閉じているときにCookieに何も起こらないのは当然のことです。さて、他の関数を見ないと、何が起こっているのかを正確に知ることは困難ですが、PHPとJavaScriptを絡み合わせて使用​​することはできますが、方法は異なります。これを例を挙げて説明しましょう。

window.onbeforeunload(){
  var name = <?php $name='Steve'; echo($name); ?>;
  console.log(name);
}

このコードがあり、ブラウザにページをロードした場合、PHPコードは表示されなくなりますが、代わりに次のように表示されます。

window.onbeforeunload(){
  var name = 'Steve';
  console.log(name);
}


そうは言っても、ここにあなたが役立つと思うかもしれないいくつかのリンクがあります。

于 2013-03-26T19:13:01.823 に答える