Komponenta – formular nevykona metodu – asi zly inject

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

Mam vytvorenu komponentu kontaktneho formularu. Vsetko sa mi vykresli, len sa nevykona metoda sendContactEmail. Pravdepodobne kvoli nespravnemu injectu. Popripade potrebujem $contactFacade nejak v presenteri nastavit, ale neviem ako…

Komponenta:

use Nette\Application\UI,
        Nette\Forms\Form;

class ContactControl extends UI\Control
{
    /** @var Model\ContactFacade @inject */
    private $contactFacade;

    public function render()
    {
        $template = $this->template;
        $template->setFile(__DIR__ . '/templates/ContactFormControl.latte');
        $template->render();
    }

    protected function createComponentContact()
    {
        $form = new UI\Form;
        $form->addText('meno', 'Meno')
            ->setRequired('Musíte vyplniť meno');
        $form->addText('email', 'Email')
            ->addRule(Form::EMAIL, 'Emailová adresa nie je v správnom tvare')
            ->setRequired('Musíte vyplniť email');
        $form->addTextArea('sprava', 'Správa')
            ->setRequired('Správa musí byť vyplnená');
        $form->addTextArea('antispam', '2+1')
            ->setRequired('Nevyplnili ste antispam')
            ->addRule(Form::EQUAL, 'Zle vyplnený antispam', 3);
        $form->addSubmit('send', 'Odoslať')
            ->setAttribute('class','hladat');
        $form->onSuccess[] = [$this, 'successContact'];
        return $form;
    }

    function successContact(UI\Form $form)
    {
        $vals = $form->values;
        $this->contactFacade->sendContactEmail($vals->email, '$vals->emailik', 'Kontaktný formulár', $vals->sprava);
        $this->flashMessage('Vaša správa bola odoslaná');
        $this->redirect('this');
    }

}

Presenter:

function actionContact()
{
    $control = $this->getComponent('contact');
}

protected function createComponentContact() {
    $control = new \ContactControl();
    return $control;
}
Pavel Kravčík
Člen | 1196
+
0
-
	/** @var Model\ContactFacade @inject */
private $contactFacade;
  1. Neměl bys používat anotační inject v komponentě
  2. A když ho používáš, proměnná musí být public

Injectni to tam přes constructor.

Creator13
Člen | 18
+
0
-

Mohol by si mi napisat konkretny inject prostrednictvom konstruktoru? Som v tom laik.

petr.jirous
Člen | 128
+
+1
-

udělej si továrničku

class ContactControl extends UI\Control
{
	/** @var Model\ContactFacade */
	protected $contactFacade;


	public function __construct(Model\ContactFacade $contactFacade)
	{
		$this->contactFacade = $contactFacade;
	}
}

interface IContactControlFactory
{
	/** @return ContactControl */
	public function create();
}

Editoval petr.jirous (4. 2. 2015 14:26)