从Zend Framework获取表单输入

时间:2013-04-18 19:01:58

标签: php zend-framework post zend-form

我正在冒险进入Zend Framework并决定构建一个简单的应用程序来实践。我正在构建的应用程序是一个简单的计算器,允许用户添加,减去,乘以和除以两个数字。

我无法检索用户输入来计算答案。当我在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进行处理?

2 个答案:

答案 0 :(得分:1)

我猜你正在做大部分事情,但我个人认为你不应该在控制器中做那么多的编程。你的控制器不仅将数据传递给模型,它实际上试图找出要调用的函数。

这应该是由模型完成的。问题很简单,解决方案也是如此,但这不可扩展。考虑到您希望添加操作,您必须在模型中创建它的功能,并在控制器中添加一个案例。

我通常做的是

检查表单是否有效:$form->isValid()

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

将数据传递给模型:$calc->process($form->getValues())

process()将是我模型中唯一的公共方法。 switch case语句将进入该方法并调用适当的受保护方法。 我也会让模型决定表单中operator元素的选项 $op->setMultiOptions(Model::$availableOperations) 这样,只要我需要添加操作,我就可以更新我的模型。

我希望这一切对某人有意义。 :)

答案 1 :(得分:0)

我找到了解决这个问题的方法。

我将$data = $this->getRequest()->getParams();更改为$data = $this->getRequest()->getPost();,我开始正确获取数据。我不知道是什么阻止数据通过getParams();传出,但我发现getParams();不使用Zend_Filter();函数验证数据,getPost();但是。

计算器应用程序现在完成的代码与此处粘贴的代码完全不同。您可以在https://github.com/TylerB24890/Zend-Calculator

查看最终产品

在我的最终应用程序中,我必须为数字输入创建一个单独的验证器类,以允许整数和浮点数。我没有将这些内容分配给Zend_Filter()函数,因为我无法正确地使用这些函数。如果有人有关于如何进行这些工作的任何提示,请在上面的链接中为GitHub项目做出贡献。