Autor Zpráva
CarlosK
Profil *
Dobrý den, pokouším se v nette udělat vícestránkovou registraci pomocí komponent. Každý formulář mám v jiném souboru a funguje jako komponenta. Formulář se v pořádku vykreslí, ale nefunguje submit tlačítko, které vyhazuje chybu: "The signal receiver component 'registerForm' is not found.".

RegistrationPresenter.php
<?php
class RegistrationPresenter extends BasePresenter
{
    public function renderRegister($id)
    {
        $session = $this->presenter->session->getSection('register');
        switch($id)
        {
            case null: /* http://localhost:8080/www/registration/register/ */
                $this['registerForm'] = new RegisterForm($session);
                break;
            
            case 'druha': /* http://localhost:8080/www/registration/register/druha/ */
                $this['registerForm'] = new RegisterDruhaForm($session);
                break;    

            case 'treti': /* http://localhost:8080/www/registration/register/treti/ */
                $this['registerForm'] = new RegisterTretiForm($session);
                break;                
            
            default:
                throw new \Nette\Application\BadRequestException;
                break;
        }
    }
}

RegisterForm.php
<?php
use \Nette\Application\UI\Form,
    \Nette\Http\SessionSection;

class RegisterForm extends Form
{
    private $session;
    
    public function __construct(SessionSection $session)
    {
        $this->session = $session;
        
        parent::__construct();
        $this->addText('Nick', 'Nick', null, 32)
        $this->addPassword('password', 'Heslo', null, 32)
        $this->addSubmit('submit', 'Pokračovat');
        $this->onSuccess[] = callback($this, 'complete');
    }
    
    public function complete(Form $form)
    {
        $this->session = $form->httpData;
        $this->presenter->redirect('Registration:register', 'druha');
    }
}

RegisterDruhaForm.php
<?php
use \Nette\Application\UI\Form,
    \Nette\Http\SessionSection;

class RegisterForm extends Form
{
    private $session;
    
    public function __construct(SessionSection $session)
    {
        $this->session = $session;
        
        parent::__construct();
        $this->addText('name', 'Jméno', null, 32)
        $this->addPassword('surname', 'Příjmení', null, 32)
        $this->addSubmit('submit', 'Pokračovat');
        $this->onSuccess[] = callback($this, 'complete');
    }
    
    public function complete(Form $form)
    {
        $this->session = $form->httpData;
        $this->presenter->redirect('Registration:register', 'treti');
    }
}

register.latte
{block #content}
    {control registerForm}
{/block}
Jan Tvrdík
Profil
CarlosK:
1) public function renderRegister($id) -> public function actionRegister($id)
2) Místo $form->httpData; používej $form->getValues(TRUE);
3) $this->session = $form->httpData; je blbost, takhle ty hodnoty do session rozhodě neuložíš.
CarlosK
Profil *
Děkuji za odpověď. Hodnoty se mi do session ukládají (možná jste přehlédl že v konstruktoru předávám instanci Nette\Http\SessionSection). Chtěl jsem mít adresy ve tvaru /registration/register/ (První stránka) a /registration/register/druha/ (Druhá stránka) apod., ale nevím, jestli je takovýto nápad použitelný, protože se nezpracuje metoda complete v třídě RegisterForm.
Jan Tvrdík
Profil
CarlosK:
Hodnoty se mi do session ukládají
Nevěřím tomu. $this->session = $form->httpData; přiřadí do vlastnosti $session třídy RegisterForm hodnotu z $form->httpData, ale samotnou hodnotu session nezmění. To by tam muselo být něco jako $this->session->data = $form->httpData;.

protože se nezpracuje metoda complete v třídě RegisterForm
Přejmenoval jsi renderRegister na actionRegister?


Jinak ještě řádek
$session = $this->presenter->session->getSection('register');
můžeš nahradit za
$session = $this->getSession('register');
CarlosK
Profil *
Ano, vše už funguje jak má. Mockrát děkuji. Ještě bych měl jednu otázku. Je možné pomocí anotace povolit přístup k akci jen neregistrovaným uživatelům?
Jan Tvrdík
Profil
CarlosK:
Je možné pomocí anotace povolit přístup k akci jen neregistrovaným uživatelům?
Nette nemá, jak rozlišit registrované a neregistrované uživatele. Může pouze rozlišit přihlášené a nepřihlášené. Standardně je implementováno pouze omezení přístupu pro přihlášené uživatele, ale můžeš si doimplementovat cokoliv, co potřebuješ.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: