82 lines
2.7 KiB
PHP
82 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Presenters;
|
|
|
|
|
|
use Nette\Application\UI\Presenter;
|
|
use App\Model\CalculatorManager;
|
|
use Nette\Application\UI\Form;
|
|
use Nette\Utils\ArrayHash;
|
|
|
|
/**
|
|
* Presenter kalkulačky.
|
|
* @package App\Presenters
|
|
*/
|
|
|
|
class CalculatorPresenter extends Presenter{
|
|
|
|
const
|
|
FORM_MSG_REQUIRED = 'Tohle pole je povinné.',
|
|
FORM_MSG_RULE = 'Tohle pole má neplatný formát.';
|
|
|
|
/** @var CalculatorManager Instance třídy modelu pro práci s operacemi kalkulačky. */
|
|
private $calculatorManager;
|
|
|
|
/** @var int|null výsledek operace nebo null */
|
|
private $result = null;
|
|
|
|
public function __construct(CalculatorManager $calculatorManager){
|
|
parent::__construct();
|
|
$this->calculatorManager = $calculatorManager;
|
|
}
|
|
|
|
/** Výchozí vykreslovací metoda tohoto presenteru. */
|
|
public function renderDefault(){
|
|
// Předání výsledku do šablony.
|
|
$this->template->result = $this->result;
|
|
}
|
|
|
|
/**
|
|
* Vrátí formulář kalkulačky.
|
|
* @return Form formulář kalkulačky
|
|
*/
|
|
|
|
protected function createComponentCalculatorForm(){
|
|
|
|
$form = new Form;
|
|
// Získáme existující operace kalkulačky a dáme je do výběru operací.
|
|
$form->addRadioList('operation', 'Operace:', $this->calculatorManager->getOperations())
|
|
->setDefaultValue(CalculatorManager::ADD)
|
|
->setRequired(self::FORM_MSG_REQUIRED);
|
|
$form->addText('x', 'První číslo:')
|
|
->setType('number')
|
|
->setDefaultValue(0)
|
|
->setRequired(self::FORM_MSG_REQUIRED)
|
|
->addRule(Form::INTEGER, self::FORM_MSG_RULE);
|
|
$form->addText('y', 'Druhé číslo:')
|
|
->setType('number')
|
|
->setDefaultValue(0)
|
|
->setRequired(self::FORM_MSG_REQUIRED)
|
|
->addRule(Form::INTEGER, self::FORM_MSG_RULE)
|
|
// Ošetříme dělení nulou.
|
|
->addConditionOn($form['operation'], Form::EQUAL, CalculatorManager::DIVIDE)
|
|
->addRule(Form::PATTERN, 'Nelze dělit nulou.', '^[^0].*');
|
|
$form->addSubmit('calculate', 'Spočítej výsledek');
|
|
$form->onSuccess[] = [$this, 'calculatorFormSucceeded'];
|
|
return $form;
|
|
}
|
|
|
|
/**
|
|
* Funkce se vykonaná při úspěšném odeslání formuláře kalkulačky a zpracuje odeslané hodnoty.
|
|
* @param Form $form formulář kalkulačky
|
|
* @param ArrayHash $values odeslané hodnoty formuláře
|
|
*/
|
|
public function calculatorFormSucceeded($form, $values) {
|
|
// Necháme si vypočítat výsledek podle zvolené operace a zadaných hodnot.
|
|
$this->result = $this->calculatorManager->calculate($values->operation, $values->x, $values->y);
|
|
}
|
|
}
|
|
|
|
|
|
|