簡體   English   中英

從Zend框架獲取表單輸入

[英]Get Form Input from Zend Framework

我正在嘗試使用Zend框架,並決定構建一個簡單的應用程序來進行實踐。 我正在構建的應用程序是一個簡單的計算器,允許用戶對兩個數字進行加,減,乘和除運算。

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

這是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進行處理?

我想您在大多數事情上都做對了,但是我個人認為您不應該在控制器中做太多的編程。 您的控制器不僅將數據傳遞給模型,而且還實際上試圖找出要調用的函數。

該工作應該由模型完成。 問題很簡單,解決方案也可以,但是這將不可擴展。 考慮到您希望添加一個操作,您將必須在模型中創建它的功能並在您的控制器中添加一個案例。

我通常要做的是

檢查表單是否有效: $form->isValid()

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

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

process()將是模型中唯一的公共方法。 switch case語句將進入該方法並調用適當的受保護方法。 我也會讓模型以$op->setMultiOptions(Model::$availableOperations)的形式決定運算符元素的選項,這樣我就可以在需要添加操作時隨時更新模型。

我希望所有這些對某人有意義。 :)

我找到了解決此問題的方法。

我更改了$data = $this->getRequest()->getParams(); $data = $this->getRequest()->getPost(); 然后我開始正確獲取數據。 我不知道是什么阻止了getParams();傳遞數據getParams(); 但是我發現getParams(); 不使用Zend_Filter();驗證數據Zend_Filter(); 函數, getPost(); 但是。

計算器應用程序現在完成的代碼與此處粘貼的代碼完全不同。 您可以在以下位置查看最終產品: https : //github.com/TylerB24890/Zend-Calculator

在我的最終應用程序中,我必須為數字輸入創建一個單獨的驗證器類,以允許整數和浮點數。 我沒有將它們分配給Zend_Filter()函數,因為我無法正確地使它們工作。 如果有人對如何實現這些工作有任何建議,請在上面的鏈接中為GitHub項目做出貢獻。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM