Vložení vlastního objektu do formuláře

Johny12369
Člen | 21
+
0
-

Zdravím, je možné si uložit vlastní objekt, který neimplementuje rozhraní IComponent do objektu formuláře v metodě create? V mém případě bych si chtěl uložit 2 Doctrine Entity objekty, aby byly použitelné v metodě …FormSubmited, kdy si je potřebuji ukládat. Posílám si je z presenteru, jako parametry do metody create, a nemohu si je uložit přes $form[‚firma‘] = $firma;, protože to neimplementuje IComponent, a když si je uložím v metodě create do privátního atributu továrničky formuláře, tak při odeslání jsou najednou tyto atributy null.

Dělat to přes addHidden, kam si uložím pouze ID firmy a po odeslání formuláře si teprve Entity objekt pomocí tohoto ID vyhledám se mi zdá míň praktický.

Díky moc za odpověď.

David Matějka
Moderator | 6445
+
0
-

ahoj to fungovat nebude a neni to dobry napad. radeji vyres, proc je po odeslani ta hodnota null. ukaz kod presenteru a tovarny, treba poradime :)

Johny12369
Člen | 21
+
0
-

Presenter:

<?php
use App\Model\Firmy;
use App\Forms\NovyEmailFormFactory;

class FirmyPresenter extends Presenter
{

	/** @var Firmy */
	private $firma;

	/** @var NovyEmailFormFactory @inject */
	public $novyEmailFactory;

	public function renderDetail($id)
    {
		$er_firmy = $this->em->getRepository(Firmy::class);
		$this->firma = $er_firmy->findOneBy(["id" => $id]);		//Do atributu si najdu podle ID objekt té firmy
	}

	/**
	 * NovyEmail form factory.
	 * @return Nette\Application\UI\Form
	 */
	protected function createComponentNovyEmailForm()
	{
		\Tracy\Debugger::barDump($this->firma, "Firma");	//Při načtení stránky je atribut firma správně, ale po odeslání formuláře je tady nejednou null

		$form = $this->novyEmailFactory->create($firma);
		$form->onSuccess[] = function() {
			$this->handleSetFlashMessage("success", "E-mail byl vytvořen a odeslán.", "this");
		};
		$form->onError[] = function() {
			$this->handleSetFlashMessage("error", "Nastala chyba, viz formulář.");
		};

		return $form;
	}
?>

Factory:

<?php
use App\Model\Firmy;

class NovyEmailFormFactory
{
	use Nette\SmartObject;

	/** @var Firmy */
	private $firma;

	/**
	 * @param App\Model\Firmy $firma
	 * @return Form
	 */
	public function create($firma)
	{
		if (empty($this->firma)) {
			$this->firma = $firma;
		}

		\Tracy\Debugger::barDump($this->firma);		//Při vytvoření opět správně a po odeslání null (obě proměnné $firma a $this->firma)


		$form = $this->factory->create();

		$form->addText('zprava')
				->setRequired('Prosím zadejte zprávu.');

		$form->addSubmit('send', 'Odeslat');

		$form->onSuccess[] = [$this, 'novyEmailFormSubmitted'];
		return $form;
	}

	public function novyEmailFormSubmitted(Form $form)
	{
		$values = $form->getValues();

		\Tracy\Debugger::barDump($this->firma);	//Tady po odeslání null
	}
}
?>

Při načtení stránky se mi v bardump vypíšou všechny atributy správně jako objekty Firmy, ale jak vyplním formulář a kliknu na Odeslat tak se všechno změní na null. Všechny ostatní atributy jako EntityManager, FormFactory si deklaruju správně, to jsem jenom do kódu nedal, aby tam bylo to hlavní.

petr.jirous
Člen | 128
+
+3
-

render metody se zpracovavaji az po formularich… koukni na zivotni cyklus presenteru do dokumentace… v tvem pripade by melo stacit inicializovat property firma uz v actionDetail

David Matějka
Moderator | 6445
+
+2
-

mimochodem, factory by melo byt bezstavove, spravne by to melo byt treba pres closuru:

<?php
use App\Model\Firmy;

class NovyEmailFormFactory
{
    use Nette\SmartObject;


    /**
     * @param App\Model\Firmy $firma
     * @return Form
     */
    public function create($firma)
    {


        $form = $this->factory->create();

        $form->addText('zprava')
                ->setRequired('Prosím zadejte zprávu.');

        $form->addSubmit('send', 'Odeslat');

        $form->onSuccess[] = function ($form) use ($firma) {
			$this->novyEmailFormSubmitted($form, $firma);
		};
        return $form;
    }

    public function novyEmailFormSubmitted(Form $form, $firma)
    {
        $values = $form->getValues();

    }
}
Johny12369
Člen | 21
+
0
-

No jo já jsem mimo. Už funguje, díky moc :)

Johny12369
Člen | 21
+
0
-

Já vím, ale nenapadlo mě vůbec, jak to udělat jinak. Díky :)

David Matějka napsal(a):

mimochodem, factory by melo byt bezstavove, spravne by to melo byt treba pres closuru:

<?php
use App\Model\Firmy;

class NovyEmailFormFactory
{
    use Nette\SmartObject;


    /**
     * @param App\Model\Firmy $firma
     * @return Form
     */
    public function create($firma)
    {


        $form = $this->factory->create();

        $form->addText('zprava')
                ->setRequired('Prosím zadejte zprávu.');

        $form->addSubmit('send', 'Odeslat');

        $form->onSuccess[] = function ($form) use ($firma) {
			$this->novyEmailFormSubmitted($form, $firma);
		};
        return $form;
    }

    public function novyEmailFormSubmitted(Form $form, $firma)
    {
        $values = $form->getValues();

    }
}