Formulář na basePresenter – odkazování na jiný presenter

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Rudolf247
Člen | 38
+
0
-

Dobrý den, potřebuji udělat jednoduchou věc.
Mám formulář na basePresenteru, který se vykresluje na layoutu, ale po jeho odeslání potřebuji přistoupit na jiný presenter respektive i na jinou šablonu.

Tak jsem bádal a dospěl jsem k tomu, že potřebuji vytvořit komponentu, postupoval jsem podle návodu, ale dostanu chybu „Argument 1 passed to Nette\Bridges\FormsLatte\Runtime::renderFormBegin() must be an instance of Nette\Forms\Form, instance of FilterForm given, called in…“

Takže mám komponentu s názvem FilterControl

use Nette\Application\UI;
use Nette\Forms\Form;
use App\Model;
class FilterForm extends UI\Control
{

    /** @var Model\Filter */
    private $filter;

    private $database;

    public $onFilterSave;

    public function __construct(App\Model\Filter $filter)
    {
        parent::__construct();
        $this->database = $filter;
    }

    public function createComponentForm()
    {
        $form = new Form;
        $form->addSelect('type', NULL, $this->filter->getType())
            ->setPrompt('Typ');
        $form->addSelect('brand', NULL, $this->filter->getBrand())
            ->setPrompt('Značka');
        $form->addSelect('model')
            ->setPrompt('Model');
        $form->addSelect('price')
            ->setPrompt('Cena od-do');
        $form->addSelect('year')
            ->setPrompt('Rok výroby od');
        $form->addSelect('fuel')
            ->setPrompt('Palivo');
        $form->addSelect('km')
            ->setPrompt('Najeto km');
        $form->addSelect('transmission')
            ->setPrompt('Převodovka');
        $form->addSelect('places')
            ->setPrompt('Počet míst');
        $form->addSubmit('send', 'Odeslat');
        $form->onSuccess[] = [$this, 'processForm'];
        return $form;
    }

    public function processForm($form)
    {
        $this->onFilterSave($this, $filter);
    }
}
    interface IFilterFormFactory{
        /** @return \FilterForm */
        function create();
}

továrničku mám zaregistrovanou jako

services:
    - IFilterFormFactory

a v basePresneteru mám

/** @var \IFilterFormFactory @inject */
    public $filterFormFactory;

    protected function createComponentFilterForm()
    {
        $control = $this->filterFormFactory->create();

        $control->onFilterSave[] = function (FilterForm $control, $filter){
            $this->redirect('this');
        };

        return $control;
    }

Děkuji za každou odpověď.

Hug0
Člen | 35
+
0
-

Ahoj,
je v tom nějaký chaos:

1)

Takže mám komponentu s názvem FilterControl

je asi ten „FilterForm“

2)

<?php
$this->database = $filter;
?>

má být asi:

<?php
$this->filter = $filter;
?>

a parametr onFilterSave potom:

<?php
$this->onFilterSave($this, $this->filter);
//nebo
$this->onFilterSave($this, $form);
?>

3)
Renderování bych akorát opisoval od Davida