2013-04-18 4 views
0

Я вступаю в Zend Framework и решил создать простое приложение для практики. Приложение, которое я создаю, представляет собой простой калькулятор, который позволяет пользователю добавлять, вычитать, умножать и делить два числа.Получить форму ввода из 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

'$ 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())

Процесс(), будет только открытый метод в моей модели. Оператор case switch включится в этот метод и вызовет соответствующий защищенный метод. также я бы позволил модели решить варианты для элемента оператора в форме $op->setMultiOptions(Model::$availableOperations) Таким образом, я могу просто обновить свою модель всякий раз, когда мне нужно добавить операцию.

Я надеюсь, что все это имеет смысл для кого-то. :)

+0

Я действительно сделал это, и теперь все отлично работает. Вы можете просмотреть окончательный код на https://github.com/TylerB24890/Zend-Calculator –

+0

@Ty Bailey Неплохо, за исключением избыточного валидатора. Вам не нужен валидатор 'Int' в контроллере, потому что вы уже привязали его к своей форме, просто проверьте всю форму для isValid:' $ form-> isValid ($ data); 'then' $ form-> getValues ​​() или -> getValue ('value Key') 'будет получать отфильтрованные и проверенные значения формы. – RockyFord

+0

@RockyFord, когда я это делаю, я получаю ошибку внутреннего сервера? –