2012-04-11 69 views
0

为了验证多页面表单,我正在为(MVC)Controller的正确组织努力工作。问题是我不仅需要检查用户输入是否存在,而且我必须将其与不同的数据库(取决于字段)进行匹配。我还需要那些来自用户输入的不同视图选项的数据库数据。如何编写用于多页表单验证的控制器?

目前还不清楚我应该在哪里进行验证。我想把不太详细的东西放到控制器中,但同时我不喜欢使用彼此的模型(没有控制器)。

下面是来自控制器的基本的例子,这些步骤代表形式的不同阶段/页:

// GET VARIABLES FROM $_POST + $_GET 
private function make_environment() 
{ 
    // PUT ALL VARIABLES INTO ARRAY 
    $vars = array(); 
    if(!empty($_GET)) { $values = array_merge($vars,$_GET); }  
    if(!empty($_POST)) { $values = array_merge($vars,$_POST); } 

    // PUT ALLOWED VARIABLES INTO PROPERTY 
    foreach($this->properties as $property) 
    { 
     if(isset($values[$property])) 
     { 
      $this->properties[$property] = htmlspecialchars(trim($values[$property])); 
     } 
    } 

} 


// HANDLE DATA 


// PRODUCES DATA FOR VIEW  
private function set_data() 
{ 
    $data = ''; 
    // CHOOSE DATA-OBJECT AND DATA-HANDLER 
    switch($this->properties['step']) 
    { 
     case 1: 
      // DATA HANDLER 
      $handler = new calendar($this->properties); 
      $data['calendar'] = $handler->return_data(); 
      break; 

     case 2: 
      // DATA HANDLER 
      $handler = new form($this->properties); 
      $data['form'] = $handler->return_data(); 
      break; 
    } 

    return $data; 
} 


// CREATE OR UPDATE VIEW 

private function run_view($data) 
{ 
    new view('header',''); 

    switch($this->properties['step']) 
    { 
     default: 
      new view('chooser',''); 
      break; 
     case 1: 
      new view('calendar',$data['calendar'],$this->properties); 
      break; 

     case 2: 
      new view('form',$data['form'],$this->properties); 
      break; 
    } 

    new view('footer',''); 
} 

在不同的“处理程序”(在set_data())正在查询的数据库的那一刻,但在此之前为此,我需要检查是否提交了必填字段以及这些字段是否有效(它们是否存在于数据库中)。我真的不知道该在哪里进行验证。希望在一个单独的模型,但我不得不查询数据库在数据处理程序再次。也许你有一个想法?!

回答

1

我不知道你使用MVC的线索,但我更喜欢这样的:

$form = new MultipageForm('BubblePagesForm'); 
$form->importFromSession($app->getSession()); 
if ($form->validates($app->getRequest())) 
{ 
    $form->processRequest($app->getRequest()); 
    $form->exportToSession($app->getSession()); 
    $responseType = new SuccessfullFormRequest($form); 
} 
else 
{ 
    $responseType = new InvalidFormRequest($form); 
} 
$app->setResponse($responseType, array($form)); 
+0

如果有些吝啬的人会尝试从已经处理的请求改变形式的数据?这将允许他通过错误的表单数据访问更高级别的表单。事情是我不能使用会话,所以我必须依靠帖子并获取,这很容易被操纵。 – Anonymous 2012-04-11 12:28:03

+0

@DanSurfrider:不,表单的状态保存到会话中。这就是为什么有'importFromSession'和'exportToSession'。表单知道何时处理请求,该请求属于哪个页面/步骤。以前的数据不能改变客户端(仅在会话存储区内的服务器端)。 – hakre 2012-04-11 12:29:20

+0

抱歉忘了提及我不想使用会话,所以我不得不依赖帖子,不幸的是。 – Anonymous 2012-04-11 12:35:03