Vykreslenie formulára SignInFormFactory cez Bootstrap3renderer

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

Ahoj, do projektu som pridal https://github.com/…rap3renderer (5* autorom za komponentu). Ak v SignPresenter vykreslujem formulár definovany v createComponentSignInForm() všetko prebehne OK form sa zobrazí v BS3 tagoch. Ale ak chcem vykresliť form definovany v SignInFormFactory síce app nekončí chybou, ale vykreslí sa prázdna obrazovka. Netušíte kde je chyba viz. case 02? Vopred dikes…

case 01:

<?php
class SignPresenter extends Nette\Application\UI\Presenter
{
	/** @var \Instante\ExtendedFormMacros\IFormFactory @inject */
    public $formFactory;

	protected function createComponentSignInForm()
	{
		$form = $this->formFactory->create();
		$form->addText('username', 'Username:')->setRequired('Please enter your username.');
    	$form->addPassword('password', 'Password:')->setRequired('Please enter your password.');
    	$form->addSubmit('send', 'Sign in');
    	$form->onSuccess[] = [$this, 'signInFormSucceeded'];
		return $form;
	}
?>

case 02:

<?php
class SignPresenter extends Nette\Application\UI\Presenter
{
	/** @var \Instante\ExtendedFormMacros\IFormFactory @inject */
    public $formFactory;

	protected function createComponentSignInForm()
	{
		$form = $this->formFactory->create(SignInFormFactory::class);
		$form->onSuccess[] = [$this, 'signInFormSucceeded'];
		return $form;
	}
?>

SignInFormFactory

<?php
class SignInFormFactory extends Form
{
    /**
     * @return Form
     */
    public function create()
    {
        $form = new Form;

        $form->addText('username', 'Username:')->setRequired('Please enter your username.');
        $form->addPassword('password', 'Password:')->setRequired('Please enter your password.');
        $form->addSubmit('send', 'Sign in');

        return $form;
    }
}
?>
CZechBoY
Člen | 3608
+
+1
-

Extendujes form, to bys nemusel/nemel delat.
Hlavne si injectujes prazdnou factory jako v prvnim pripade.. injectni si tu tvoji factory (viz phpdoc @var). Nezapomen registrovat do sluzeb v config.neon.

procomputer
Člen | 5
+
0
-

ad Extend Form, OK dikes (bol to iba pokus, bez toho to padalo…)
ad config.neon sluzbu mam registrovanu viz. config.neon
ad Bootstrap3renderer aktuálne, ale netuším ako donútit SignPresenter, vykresliť SignInFormFactory pomocou Bootstrap3renderer. App končí exception „Call to a member function create() on null“ na riadku $form = $this->formFactory->create();
Poradíte mi niečo? Vopred dikes

config.neon

services:
	- App\Forms\SignInFormFactory
	router: App\RouterFactory::createRouter
	authenticator: HelpdeskAuthenticator
	formFactory: Instante\Bootstrap3Renderer\BootstrapFormFactory
<?php
class SignPresenter extends Nette\Application\UI\Presenter
{

  /** @var \App\Forms\SignInFormFactory @inject */
	public $signInFactory;

	/**
	 * Sign-in form factory.
	 * @return Nette\Application\UI\Form
	 */
	protected function createComponentSignInForm()
	{
		$form = $this->signInFactory->create();
		$form->onSuccess[] = [$this, 'signInFormSucceeded'];
		return $form;
	}
?>
<?php
class SignInFormFactory
{
    /** @var \Instante\ExtendedFormMacros\IFormFactory @inject */
    public $formFactory;

    public function create()
    {
        $form = $this->formFactory->create();
		$form->addText('username', 'Username:')->setRequired('Please enter your username.');
        $form->addPassword('password', 'Password:')->setRequired('Please enter your password.');
        $form->addSubmit('send', 'Sign in');

        return $form;
    }
}
?>
procomputer
Člen | 5
+
0
-

Tak už som to vyriešil… Dikes za rady

<?php

namespace App\Forms;

use Instante\Bootstrap3Renderer\BootstrapFormFactory;

class SignInFormFactory
{
    /**
     * @return Form
     */
    public function create()
    {
        $form = (new BootstrapFormFactory)->create();

        $form->addText('username', 'Username:')->setRequired('Please enter your username.');
        $form->addPassword('password', 'Password:')->setRequired('Please enter your password.');
        $form->addSubmit('send', 'Sign in');

        return $form;
    }
}
?>

Editoval procomputer (31. 3. 2017 20:58)

CZechBoY
Člen | 3608
+
+1
-

jasne, v obycejne tride nefunguji injecty – je potreba použít konstruktor.

namespace App\Forms;

use Instante\Bootstrap3Renderer\BootstrapFormFactory;

class SignInFormFactory
{
/** @var \Instante\ExtendedFormMacros\IFormFactory */
    private $formFactory;

    public function __construct(\Instante\ExtendedFormMacros\IFormFactory $formFactory)
    {
        $this->formFactory = $formFactory
    }

    /**
     * @return Form
     */
    public function create()
    {
        $form = $this->formFactory->create();

        $form->addText('username', 'Username:')->setRequired('Please enter your username.');
        $form->addPassword('password', 'Password:')->setRequired('Please enter your password.');
        $form->addSubmit('send', 'Sign in');

        return $form;
    }
}