<?php


use Nette,
	Nette\Application\UI;


class FooForm extends UI\Control
{

  	// EN: define Nette event http://doc.nette.org/en/2.2/php-language-enhancements#toc-events
  	// CS: definujeme si Nette Event http://doc.nette.org/cs/2.2/php-language-enhancements#toc-udalosti
	
	public $onFormSuccess; 
	
	// EN: define our variables, which we will need to process the form
	// CS: definujeme si vlastní proměnné, které potřebujeme při zpracování formuláře, například pro uložení dat
	
	private $books;
	private $fooParam;

	// EN: if we need to send some parameters to our form, let's do it through constructor
	// CS: pokud si do formuláře potřebujeme předat nějaké parametry, uděláme to skrz konstruktor

	public function __construct($fooParam, BookRepository $books)
	{
		$this->books = $books;
		$this->fooParam = $fooParam;
	}

	/**
	 * @return Form
	 */
	protected function createComponentMyForm()
	{
		$form = new UI\Form;
		$form->addText('book', 'Název knihy:');

		$form->addSubmit('send', 'Vložit knihu');

		$form->onSuccess[] = $this->processForm;

		return $form;
	}

	public function processForm($form, $values) {

	  // EN: here form values are processed, we can use our variables from constructor
	  
	  // CS: zde můžeme si zpracujeme data odeslané formulářem
	  // a můžeme využít proměnné z konstruktoru
	  
	  // EN: now we need to call the event we defined. It is because we will add more process stuff
	  // which will be specific for a presenter. E.g. $this–>redirect('some:where')
	  
	  // CS: zde je potřeba zavolat vlastní událost, abychom mohli v presenteru na ni navěsit 
	  // další zpracování formuláře, které bude typické pro to konkrétní využití formuláře
	  // v presenteru. Například $this->redirect('Pokazde:jinam') apod.

		$this->onFormSuccess();


	}
	
	// EN: assign own template to the form
	// CS: formuláři přiřadíme jeho vlastní šablonku, která je uložena v souboru hned vedle

	public function render()
	{

		// EN: we have to send this variable into template at least to render the form with macros
		// CS: do šablony je potřeba přidat alespoň tuto proměnnou, abychom formulář mohli vykreslit pomocí maker

		$this->template->render(__DIR__ . '/FooForm.latte');
		
	}


}

// EN: create an interface, which will help us inject the form into a presenter
// it has to have only one method create(), which contains parameters that is not possible to send automatically by config

// CS: vytvoříme si interface, který nám pomůže formulář nainjectovat do presenteru
// musí mít právě jednu metodu create, která obsahuje parametry, jenž nejdou předat
// auotmaticky configem. 
// více zde http://pla.nette.org/cs/create-components-with-autowiring

interface IFooFormFactory
{
	/**
	 * @param $fooParam
	 * @return FooForm
	 */
	function create($fooParam);
}