0

CMSにアクティブ化ボタンがあり、ユーザーはニュース記事のアクティブ/非アクティブフラグをすばやく切り替えることができます。トグルをクリックすると、URLに対してPOSTリクエストが行われ/news/toggle_active/$id、その後news_model、データベース内の特定の記事IDのブール変数が更新され、コントローラーがインデックスにリダイレクトします。

コントローラ

function toggle_active()
{
    $url = $this->uri->uri_string();
    $last_segment = count($this->uri->segment_array());
    $id = $this->uri->segment($last_segment);

    $row = $this->news_model->set_active($id);

    redirect('news/index', 'refresh');
}

モデル

function set_active($id)
{
    $data = array(
           'display_flg' => 'NOT display_flg'
    );

    $this->db->where('id', $id);
    $this->db->update($this->tbl_news, $data);
}

アクティベートボタンを最初にクリックすると機能しますが、それ以降のクリックでは何も起こりません。ブラウザウィンドウを閉じてページを再度開くと、ボタンは再び機能しますが、ワンクリックでのみ機能します。

特にキャッシュを有効にしていないので、何が起こっているのかわかりません。

toggle_active()メソッドの最後からリダイレクトを削除し、display_flg変数の現在の値を出力すると、最初のリクエストでPOSTを/news/toggle_active/$id実行しても何も起こらないように見えます。ただし、その後の更新のたびに、変数は値を変更します。リンクが最初にヒットしたときに何もしないのはなぜですか?

確かな解決策はありませんでしたが、 codeigniterフォーラムで同様の問題を抱えている人を見つけました。

4

1 に答える 1

0

結局、これはキャッシュの問題ではなかったと思います。この問題を解決するために、2つの大きな変更を加えました。

まず、リダイレクトする前に、データベース要求が成功したかどうかを確認しません。

set_active()モデルメソッドも書き直しました。SET句を配列として更新関数の2番目のパラメーターに渡すと機能しませんでした。クエリがクエリの一部をエスケープするのを防ぐために、集合関数の3番目のパラメーターを使用する必要がありましNOTた。

次のように機能を調整しました。

コントローラ

function show_toggle($id)
{
    if($this->news_model->set_active($id)) 
    {
        redirect('news/index', 'refresh');
    }
}

モデル

function set_active($id)
{
    $this->db->where('id', $id);
    $this->db->set('display_flg', 'NOT display_flg', FALSE);
    $query = $this->db->update($this->tbl_news);    

    return $query;
}
于 2012-06-15T03:35:12.890 に答える