Организация страницы PHP с кучей $ _POST - PullRequest
2 голосов
/ 21 февраля 2012

Я делаю довольно большую онлайн систему начисления баллов / покупок на 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?

Спасибо!:)

Ответы [ 3 ]

3 голосов
/ 21 февраля 2012

обычно лучше захватывать отдельные вызовы 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);
    }
}

конечно, то же самое может быть достигнуто без классов контроллера;

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 из функции update, если хотите пропустить перенаправление.

Но, в конце концов, это вопрос выбора, руководимый прагматизмом или вашей структурой;)

Надеюсь, это немного все объяснит, не стесняйтесь спрашивать разъяснений

2 голосов
/ 21 февраля 2012

если вы хотите отделить логику от интерфейса, то вы можете просто создать новый файл и поместить весь логический код и код, связанный с базой данных, в этот файл и включить ИЛИ требовать, чтобы этот файл был в файле представления

как представлениеФайл интерфейса .php и logic.php - это ваш файл логики, тогда

первая строка в view.php - require_once (logic.php ');

и вся логика в этих файлах

простой MVC

1 голос
/ 21 февраля 2012

Ну, похоже, я должен объяснить.

  1. Абсолютно не имеет значения, сколько операторов IF у вас в обработчике POST. Ваш текущий дизайн в порядке, и нет никаких причин ни спрашивать, ни менять его.

  2. Единственное, что вы можете добавить в свой дизайн, это фронт-контроллер , который будет принимать и сущность (тележка), и действие ("добавить"), и вызывать метод add (). класса $ cart. эти методы вы можете хранить один под другим в источнике класса.
    Хотя это довольно значительное улучшение, требующее переосмысления всей архитектуры сайта. Таким образом, вы можете придерживаться своего текущего.

  3. Что касается вашего другого вопроса, как отображать ошибки, вот ответ: Перенаправление php не работает

...