2012-02-21 29 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(); 
} 

所以我的問題是......這是組織一個系統,讓窗體操作進入窗體所在頁面的好方法,並且有大量的IF語句來決定如何處理POST值?

謝謝! :)

如果你想的邏輯和界面分離,那麼你可以簡單的創建新的文件,並把所有的邏輯和數據庫相關的代碼,在該文件中,包括或需要在視圖文件文件
+0

你有2'如果($ _ POST [ '添加'])'語句 – 2012-02-21 12:07:12

+1

@col。這在理論上是完美的彈片) – giorgio 2012-02-21 12:09:36

回答

3

通常最好以捕捉不同的POST調用(按類型分組)的單獨行動。我通常如下:

第1頁有一個形式,將提交給如。 product.php?行動=添加。在product.php中,你可以將'add'動作路由到函數add_product()(或其他)。然後,當產品被添加時,只需將用戶返回到主頁面(或任何您想要的頁面)即可。這立即解決刷新帖子的問題(用戶刷新頁面將再次發送相同的數據)。

以下MVC想象你有一個控制器Product負責處理所有產品操作。骨架看起來是這樣的(假設功能action_x將被執行時要求yoursite.com/product/x):

class Product_Controller { 
    function action_show() { 
    } 

    function action_update() { 
    } 

    function action_delete() { 
    } 
} 

如果你的框架支持某種形式的默認操作你可以路線你的行動:

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

ofcourse沒有控制器類就可以實現相同的功能;

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 
    } 
} 

這也將保持你的代碼更清潔,因爲更新/添加/刪除東西與顯示東西完全不同,這將防止你混淆東西。如果您想跳過重定向,您甚至可以從更新函數中調用show函數。

但最終這是一個選擇的問題,實用主義或你的框架主導;)

我希望這會說明一切了一下,不要猶豫,要求澄清

+0

什麼是無聊的設計。十幾個文件,每個文件1-2行? – 2012-02-21 12:23:18

+0

我認爲你已經錯過了這個觀點......至少這將是體面的btw解釋你自己,而不是隻是打出來,你不覺得嗎?你有沒有嘗試過一些hmvc?這聽起來很熟悉。但我同意,成爲一名程序員有時會覺得無聊,但嘿,無聊並不一定是壞事呢? – giorgio 2012-02-21 12:34:28

+0

啊,好吧,我明白了。我想我之前用過這種方式,但是當你發佈到新的頁面時,這個頁面沒有風格或任何東西?或者是否這種情況下,標題會自動引導用戶回到當前頁面? – JamesG 2012-02-21 12:36:01

2

像 view.php接口文件和 logic.php是你的邏輯文件然後

在view.php

第一行是 require_once(logic.php');

,所有的邏輯是在這個文件

簡單的MVC

1

好,看來我必須解釋。

  1. 這絕對不要緊多少IF語句必須在POST處理程序。你目前的設計沒問題,沒有理由要求也不能改變它。

  2. ,你可能要添加到您設計的唯一的事情是前端控制器,這將需要兩個實體(車)和行動(「添加」),並調用add()$車類的方法。這些方法可以將其存儲在類源文件中。
    雖然是相當巨大的改進,但要求對整個網站架構有很大的反思。所以,你可以堅持你目前的一個。

  3. 至於你其他問題,如何顯示錯誤,這裏是一個答案:php redirection not working

+0

啊,是的,謝謝你,真的清除了一些東西了!我一直在使用jQuery的ajax functionallity $ .ajax {},這似乎很擅長這種事情,因爲您可以立即從處理頁面獲取回覆,並讓成功處理程序在任何地方打印錯誤消息。我只是想知道一個非Ajax的方式,這很棒。特別是錯誤處理:)謝謝 – JamesG 2012-02-21 13:04:17

+0

我已經適應了我的設計,所以有錯誤處理,正如你所建議的,但我遇到「頭已發送」錯誤。之前我曾經遇到過這些錯誤,但是真的很讓人困惑,因爲很多人都在PHP文件的開頭和結尾處說出它的空白,但是它並非如此。這是我的代碼在我的文件的頂部: '代碼' <?php /*模板名稱:帳戶頁*/ require_once('profile/account-logic.php'); get_header(); wp_get_current_user(); ?> – JamesG 2012-02-21 15:23:05

+0

但在require_once('profile/account-logic.php');我有行標題(「Location:」。$ _ SERVER ['PHP_SELF']);如你所建議的。問題與此有關嗎? – JamesG 2012-02-21 15:28:01