2012-02-21 3 views
2

私はPHPでかなりのオンラインポイント/購買システムを作っており、基本的な質問があります。

関連するすべてのものは、サイト内の単一のPHPページにあり、ショッピングカート、ポイントレビュー、商品などのサイトの他の部分から「インクルード」されていますが、ページ全体には段階がありますユーザーは$ _POST経由で値を渡すためにフォーム送信ボタンをクリックします。

すべてのこのようなもののためのメインページがあるので、私はそうのように、それはすべてのPOST値を取り、それらに基づいて意思決定を行うページの上部に一部を持っている:

if($_POST['add']) { 
    $product_id = $_POST['add']; 
} 

if($_POST['remove']) { 
     $rid = $_POST['id']; 
     $cart->del_item($rid);     
} 
if($_POST['empty']){  
    $cart->empty_cart(); 
} 
if($_POST['purchase']) { 
    foreach($cart->get_contents() as $item) { 
    $sql="INSERT INTO wp_scloyalty_orders VALUES (".$user_id.", ".$item['id'].")"; 
    $result=mysql_query($sql); 
    } 

    $cart->empty_cart(); 
    unset($_SESSION['cart']);    
}  
if($_POST['add']) { 
    query_posts('post_type=prizes&showposts=-1&p='.$product_id.''); 

    while (have_posts()) : the_post(); 
    $my_meta = get_post_meta($post->ID,'_my_meta',TRUE); 


    if($calctotalnew > $my_meta['pointsvalue']){ 
     $cart->add_item(get_the_id(), 1, $my_meta['pointsvalue'], get_the_title()); 
    } else { 
     echo 'You do not have sufficient points to redeem this product...'; 
    } 

endwhile; 
wp_reset_query(); 
} 

ので、私の質問は...これは実際には、フォームアクションがフォームがある同じページに移動し、POST値で何をするかを決定するためのIFステートメントを持っているシステムを整理するための良い方法ですか?

ありがとうございます! :)

+0

あなたは2 'IF($ _ POST [ '追加'])'ステートメント –

+1

@colを持っている:あなたの質問については

  • は、エラーを表示する方法を、ここで答えです。理論的にはまったく問題のある破片: – giorgio

  • 答えて

    3

    をファイル。私は通常次のように行く:

    ページ1は、例えば、 product.php?action = add。 product.phpでは、 'add'アクションをadd_product()(または何でも)関数に送ることができます。その後、製品が追加されたら、ユーザーをメインページ(または任意のページ)に戻します。これはすぐにリフレッシュ・ポスト(ユーザーが同じデータを再度送信するページをリフレッシュする)の問題に直面します。

    次のmvcコントローラを持っているとすれば、すべての製品アクションを処理するProductです。 (yoursite.com/product/xが要求されたときに実行されると仮定すると、関数action_x)スケルトンは次のようになります。

    class Product_Controller { 
        function action_show() { 
        } 
    
        function action_update() { 
        } 
    
        function action_delete() { 
        } 
    } 
    

    あなたのフレームワークはいくつかの並べ替えのデフォルトのアクションをサポートしている場合、あなたでしルートあなたの行動:ofcourseの

    function action_default() { 
        if(method_exists(array($this, 'action_'. $_POST['action']))) { 
         return call_user_method('action_'. $_POST['action'], $this); 
        } 
    } 
    

    コントローラクラスなしでも同じことが達成できます。

    if(function_exists('action_'. $_POST['action'])) { 
        call_user_func('action_'. $_POST['action']); 
    } 
    
    function action_show() { } 
    ... 
    

    コメントの議論を説明するために;

    function action_update() { 
        // do some update logic, query an UPDATE to mysql etc. 
        if($result) { 
         // optionally save a success message 
         Message::add('Your record has been updated'); 
         header('Location: main_page.php'); // or another intelligent redirect function 
        } else { 
         Message::add('Sorry, something went wrong'); 
         header('Location: error_page.php'); // or also main_page 
        } 
    } 
    

    また、これはものを削除/追加/更新など、あなたのコードクリーナーを維持します、これはものをアップミキシングを防止することができます、ものを示すとは根本的に異なっています。リダイレクトをスキップする場合は、update関数内からshow関数を呼び出すこともできます。

    しかし、最終的には、それは実用主義やあなたの枠組みが主導し、好みの問題です;)

    私は、これは少しのすべてを説明します、まあ明確化

    +0

    なんて退屈なデザイン。 1ダースのファイル、それぞれ1〜2行? –

    +0

    私はあなたがポイントを逃したと思う...少なくともそれはちょうど打つのではなく、自分自身を説明するためにまともなbtwだろう、あなたはないと思いますか?あなたはhmvcを試したことがありますか?これはあなたによく知られていると思います。しかし、私は同意する、それは時々プログラマになるのは退屈かもしれないが、ちょっと、退屈は必ずしも悪いわけではない? – giorgio

    +0

    ああ、私は参照してください。私は前にその方法を使ったと思うが、あなたが新しいページに投稿するとき、このページはスタイル付けされていないか、何か?それとも、ヘッダーが自動的にユーザーを現在のページに戻す場合ですか? – JamesG

    2

    あなたがインターフェイスからロジックを分離したいならば、あなたは簡単なよう

    ビューファイルに新しいファイルを作成し、そのファイルに関連するすべての論理とデータベースのコードを入れて、そのファイルを含めるか、または必要とすることができますview.phpで、その後 view.phpインタフェースファイルと logic.phpがあなたのロジックファイルです

    最初の行は するrequire_once(logic.php ')です。

    とすべてのロジックは、この中で、それは別のアクションで(タイプによってグループ化された)別のPOST呼び出しをキャプチャするために、一般的にお勧めします

    シンプルなMVC

    1

    を求めることを躊躇しないことを望みます、それは私が説明しなければならないようだ。

    1. あなたがPOSTハンドラにどれくらいのIFステートメントを持っているかはまったく関係ありません。あなたの現在のデザインは大丈夫です。それを尋ねたり変更したりする理由はありません。

    2. あなたのデザインに追加することを望むかもしれない唯一のことは、エンティティ(カート)と行動の両方を取るフロントコントローラ、である(「追加」)と$カートクラスの()メソッドを追加します呼び出します。これらのメソッドは、クラスソース内に別のクラスを格納することができます。
      非常に大きな改善ですが、サイトアーキテクチャ全体の再考が必要です。それで、あなたはあなたの現在のものに固執するかもしれません。 php redirection not working

    +0

    ああ、ありがとう、本当にいくつかをクリア!私はjQueryのajax functionallity $ .ajax {}を使用しています。これは、処理ページからの応答をすぐに取得し、成功ハンドラに必要な場所でエラーメッセージを表示させることができるので、このようなことがうまくいくようです。私はちょうどそれを行う非アヤックスの方法を知りたかったとこれは華麗です。特にエラー処理:)ありがとう – JamesG

    +0

    あなたが提案したようにエラー処理が存在するように私のデザインを適合させましたが、 "Headers already sent"エラーが発生しました。多くの人がPHPファイルの始めと終わりに空白を言っているが、これはまさにこのことではないので、私はこれらのエラーを以前は持っていましたが、本当に混乱しています。ファイルの先頭にコードがあります: 'code' <?php /*テンプレート名:アカウントページ*/ require_once( 'profile/account-logic.php'); get_header(); wp_get_current_user(); ?> – JamesG

    +0

    しかし、require_once( 'profile/account-logic.php');私は行ヘッダ( "Location:" $ _ SERVER ['PHP_SELF'])を持っています。あなたが提案した通りです。問題はこれと何か関係がありますか? – JamesG