Formulářová komponenta neprovede redirect po submitu

theacastus
Člen | 81
+
0
-

Zdravím,

podle článku na planette o formulářích jako komponentách jsem si napsal prví 2 formuláře (edit a add), bohužel dva protože každý vyžaduje vlastní template (vykresuji různé věci v každém formuláři). No a v presenteru mám navěšený callback s redirectem, ten se ale neprovede ať dělám co dělám.

Formulář je odeslaný běžným requestem (ne ajaxově).

Komponenta formuláře (zkrácená):

<?php

namespace App\Forms\FTP;

use App\Model\Managers\FTPManagerException;

class CreateFTPUserForm extends Control
{
    public $onSuccess;

    public function createComponentCreateFTPUserForm()
    {
        $form = new Form();

		...

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

        return $form;
    }

    public function processForm(Form $form, $values)
    {
        $data = $form->getValues(true);

        $userPackages = $this->packageManager->getUserPackages($this->user->getId());

        foreach ($userPackages as $key => $package)
        {
            if ($key == $data['tarif']) {
                $packageLimit = $this->packageManager->getPackageLimits($package);

                $freeLeft = $packageLimit[$package['tarif_id']]['ftp_num'] - $this->ftpManager->getPackageCount($package['id']);

                break; // exit foreach
            }
        }

        if ($freeLeft < 1)
        {
            $form->addError('Pro zvolený balíček již nemáte volné FTP účty.');
            return; // exit function
        }

        try {
            $this->ftpManager->saveFTP($data, $this->user->getId());
        } catch (FTPManagerException $e) {
            $form->addError($e->getMessage());
        }
    }
}

interface ICreateFTPUserFormFactory
{
    /**
     * @return CreateFTPUserForm
     */
    public function create();
}

A výřez z presenteru:

<?php

namespace App\Presenters;

use App\Forms\FTP\ICreateFTPUserFormFactory;
use App\Forms\FTP\IEditFTPUserFormFactory;

class FTPEditPresenter extends BasePresenter
{
	/**
     * @var ICreateFTPUserFormFactory @inject
     */
    public $createFTPUserFormFactory;

    /**
     * @var IEditFTPUserFormFactory @inject
     */
    public $editFTPUserFormFactory;
	...
    public function createComponentCreateFTPUserForm()
    {
        $form = $this->createFTPUserFormFactory->create();

        $form->onSuccess[] = function ()
        {
            $this->redirect('FTPList:default');
        };

        return $form;
    }

    public function createComponentEditFTPUserForm()
    {
        $form = $this->editFTPUserFormFactory->create();

        $form->onSuccess[] = function ()
        {
            $this->redirect('FTPList:default');
        };

        return $form;
    }
}

Ale redirect $this->redirect('FTPList:default'); se prostě neprovede. Myslím že se ani nevolá callback který je v presenteru.

Vidí někdo co dělám špatně ?

David Matějka
Moderator | 6445
+
0
-

ahoj, vytvoril si v tve komponente event $onSuccess, napojujes se na nej, ale nikde ho nevolas. jde totiz o jiny onSuccess, nez ten formularovy.

staci, abys za radek

$this->ftpManager->saveFTP($data, $this->user->getId());

umistil neco jako

$this->onSuccess($this);
Šaman
Člen | 2666
+
0
-

Anebo nepoužívej komponentu, ale rovnou továrničku na formulář.

Anebo v té komponentě měj $form->onSuccess = $this->onSuccess; a ta proměnná $this->onSuccess bude pole callbacků. Ten processForm si pak zařaď do tohoto pole, nikoliv přímo formuláři.

theacastus
Člen | 81
+
0
-

Díky moc, zatím jsem se spokojil s tímto:

$this->onSuccess($this);

Funguje to a moc se mi nechce to předělávat na něco jiného, tohle byl jeden řádek do každé továrničky, to bylo celkem milé :D