2013-04-18 91 views
0

我正在冒險進入Zend框架,並決定構建一個簡單的應用程序來練習。我正在構建的應用程序是一個簡單的計算器,允許用戶添加,減去,乘以和除以兩個數字。從Zend框架獲取表單輸入

我無法檢索用戶輸入算出答案。當我在IndexAction()方法中使用Zend_Debug::dump($this->getRequest()->getParams());時,它會在頁面上正確顯示錶單數據,但是如何將數據發送到適當的模型進行處理?

這裏是IndexController.php文件:

<?php 

class IndexController extends Zend_Controller_Action 
{ 

    //initialize calculator form on controller call 
    public function init() 
    { 

     //istantiate Zend_Form object 
     $form = new Zend_Form(); 
     $form->setAction('') 
      ->setMethod('post'); 


     //first number input 
     $num1 = $form->createElement('text', 'num1'); 
     $num1->addValidator('Digits') 
      ->setRequired(true) 
      ->setAttrib('placeholder', 'Enter First Number'); 

     //second number input  
     $num2 = $form->createElement('text', 'num2'); 
     $num2->addValidator('Digits') 
      ->setRequired(true) 
      ->setAttrib('placeholder', 'Enter Second Number'); 

     //math operator select box 
     $op = $form->createElement('select', 'operator'); 
     $op->setRequired(true) 
       ->setMultiOptions(array('1'=>'+', '2'=>'-', '3'=>'X', '4'=>'/')) 
       ->setRequired(true); 

     //add elements to form 
     $form->addElement($num1) 
      ->addElement($op)   
      ->addElement($num2) 
      ->addElement('submit', 'equal', array('label' => '=')); 

     return $form; 
    } 

    public function indexAction() 
    { 
     //render the form view 
     $this->view->form = $this->init(); 
     $this->render('index'); 

    } 


    public function calcAction() 
    { 

     $form = $this->form; 
     $data = $this->getRequest()->getParams(); 

     if ($data->isPost()) { 

      if($data->isValid()) { 

       $calculator = new Calculator_Model; 

       switch($data['operator']) { 
        case $data['operator'] === '1': 
         $ans = $calculator->addNums($data['num1'], $data['num2']); 
         return $ans; 
         break; 
        case $data['operator'] === '2': 
         $ans = $calculator->subtractNums($data['num1'], $data['num2']); 
         return $ans; 
         break; 
        case $data['operator'] === '3': 
         $ans = $calculator->multiplyNums($data['num1'], $data['num2']); 
         return $ans; 
         break; 
        case $data['operator'] === '4': 
         $ans = $calculator->divideNums($data['num1'], $data['num2']); 
         return $ans; 
         break; 
       } 

      } else { 
       return $form->getMessages(); 
      } 
     } 
    } 

} 

我試着放置calcAction()腳本到indexAction()方法,但隨後的頁面不呈現在所有。我怎樣才能讓用戶輸入到Calculator_Model進行處理?

+2

'$ calculator = new Calculator_Model'應該是'$ calculator = new Calculator_Model()' –

+0

糟糕!感謝您指出了這一點! –

+0

如果你只是冒險進入Zend框架,我會建議看看他們的2.0版本https://github.com/zendframework/zf2 – aporat

回答

0

我找到了解決這個問題的辦法。

我改變$data = $this->getRequest()->getParams();$data = $this->getRequest()->getPost();,我開始得到正確的數據。我不知道什麼是從哪裏來通過與getParams();停止數據,但我發現,getParams();不使用Zend_Filter();功能對數據進行驗證,但是getPost();做。

的計算器應用程序現在已經完成了完全不同的代碼比什麼是粘貼在這裏。您可以查看最終產品:https://github.com/TylerB24890/Zend-Calculator

在我的最終應用程序中,我必須爲數字輸入創建一個單獨的驗證器類,以允許整數和浮點數。我沒有將這些分配給Zend_Filter()函數,因爲我無法正確地使這些函數正常工作。如果任何人有關於如何做這些工作的任何提示,請參閱上面鏈接的GitHub項目。

1

我猜你正在做的大多數事情的權利,但我個人認爲你不應該在控制器做這麼多編程。你的控制器不僅僅將數據傳遞給模型,它實際上是試圖找出要調用的函數。

這應該由模型完成。問題很簡單,因此可能是解決方案,但這不會是可擴展的。考慮你想添加一個操作,你將不得不在模型中創建它的功能,並在你的控制器中添加一個案例。

我最常做的是

檢查的形式是有效的:$form->isValid()

實例化模型:$cal = new Model()

將數據傳遞給模型:$calc->process($form->getValues())

()的過程將是隻有在我的模型中的公共方法。 switch case語句將進入該方法並調用適當的受保護方法。 還我先給模型決定形式 $op->setMultiOptions(Model::$availableOperations) 這樣,每當我需要添加一個操作我可以更新我的模型操作元素的選項。

我希望這一切都對某人有意義。 :)

+0

我實際上做到了這一點,現在一切都很好。您可以在https://github.com/TylerB24890/Zend-Calculator查看最終代碼 –

+0

@Ty Bailey除了冗餘驗證程序以外,還不錯。你不需要控制器中的'Int'驗證器,因爲你已經將它附加到你的表單中,只需測試整個表單的isValid:'$ form-> isValid($ data);'然後'$ form-> getValues( )或 - > getValue('value Key')'將檢索過濾和驗證的表單值。 – RockyFord

+0

@RockyFord當我這樣做,我得到一個內部服務器錯誤? –