Předání hodnoty do komponenty

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

Zdravím, potřeboval bych poradit ohledně předání hodnoty do komponenty formuláře. Ale výsledkem je, že se mi vykreslí pouze stránka s hlavičkou ale formulář ne. Na addForm přesměrovámá pomocí n:href=„Site:add $event->id“. Předem děkuji za rady.

add.latte

{block content}
<div id="banner">
	<h1 n:block=title>Přidání strany</h1>
</div>
{control createSiteForm $eventId}

{/block}

SitePresenter.php

<?php
namespace App\Modules\Admin\Presenters;

use Nette;
use App\Model;
use App\Forms;
use Nette\Forms\Container;
use App\Presenters\BaseAdminPresenter;
use Zend\Hydrator;

class SitePresenter extends BaseAdminPresenter
{
    /** @var Forms\CreateSiteFormFactory @inject */
    public $createSiteFactory;

    /** @var Forms\EditSiteFormFactory @inject */
    public $editSiteFactory;

    /** @var Model\Facades\SiteFacade @inject */
    public $siteFacade;



    public function renderDefault()
    {

    }

    public function renderAdd($id = NULL)
    {
        $this->template->eventId = $id;
    }

    public function actionEdit($id = NULL)
    {
        $site = $this->siteFacade->getSite($id);
        if ($site !== NULL)
        {
            $hydrator = new Hydrator\ArraySerializable();
            $site = $hydrator->extract($site);
            $this["editSiteForm"]->setDefaults($site);
        }
    }

    /**
     * @secured
     */
    public function handleDeleteSite($siteId)
    {
        try {
            $this->siteFacade->delete($siteId);
            $this->flashMessage('Strana byla úspěšně smazána.', 'success');
        } catch (\Exception $exc) {
            $this->flashMessage($exc->getMessage(), 'danger');
        }
        $this->redirect('this');
    }

    protected function createComponentEditSiteForm()
    {
        return $this->editSiteFactory->create(function () {
            $this->flashMessage("Strana byla úspěšně upravena", 'success');
            $this->redirect(':Admin:Event:show');
        });
    }

    protected function createComponentCreateSiteForm()
    {
        return $this->createSiteFactory->create(function () {
            $this->flashMessage("Strana byla úspěšně vytvořena", 'success');
            $this->redirect(':Admin:Event:show');
        });
    }

}

createSiteFormFactory.php

<?php

namespace App\Forms;

use Nette;
use Nette\Application\UI\Form;
use Nextras\Forms\Bridges\NetteDI\FormsExtension;
use Nette\Localization\ITranslator;
use App\Model;
use App\Model\Facades\SiteFacade;
use App\Model\Facades\EventFacade;


class CreateSiteFormFactory
{
    use Nette\SmartObject;

    /** @var SiteFacade  */
    protected $siteFacade;

    /** @var EventFacade  */
    protected $eventFacade;

    /** @var ITranslator */
    private $translator;

    /** @var FormFactory */
    private $factory;

    /** @var Model\Entities\Event */
    protected $event;

    public function __construct(ITranslator $translator, FormFactory $factory, SiteFacade $siteFacade, EventFacade $eventFacade)
    {
        $this->translator = $translator;
        $this->factory = $factory;
        $this->siteFacade = $siteFacade;
        $this->eventFacade = $eventFacade;
    }

    public function render($eventId)
    {
        $this->event = $this->eventFacade->getEvent($eventId);
    }

    public function translate($word){
        return $this->translator->translate($word);
    }

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

        $form->addCheckbox('visible','Viditelný');
        $form->addText('name', 'Název akce')
            ->setRequired();
        $form->addText('ename', 'Název akce anglicky')
            ->setRequired();

        $form->addInteger('price1','Cena 1')
            ->setRequired();
        $form->addInteger('eprice1','ECena 1')
            ->setRequired();

        $form->addInteger('price2','Cena 2');
        $form->addInteger('eprice2','ECena 2');
        $form->addInteger('price3','Cena 3');
        $form->addInteger('eprice3','ECena 3');
        $form->addInteger('price4','Cena 4');
        $form->addInteger('eprice4','ECena 4');
        $form->addInteger('price5','Cena 5');
        $form->addInteger('eprice5','ECena 5');

        $form->addInteger('placeprice','Cena na miste')
            ->setRequired();
        $form->addInteger('eplaceprice','ECena na miste')
            ->setRequired();

        $form->addInteger('maxmembers','Pocet clenu');
        $form->addInteger('carlimit','Pocet aut');


        $form->addEmail('email', 'copyMail pri registraci')
            ->addRule($form::EMAIL);

        $form->addProtection('Security token has expired, please submit the form again');
        $form->addSubmit('send', 'Vytvořit site');

		$form->onSuccess[] = function (Form $form, $values) use ($onSuccess) {

            $this->siteFacade->createSite($this->event,$values);

			$onSuccess();
		};
		return $form;
	}

}
Čamo
Člen | 798
+
0
-

Chýba ti tam čiarka

{control createSiteForm, $eventId}
jarda256
Člen | 130
+
0
-

Čamo napsal(a):

Chýba ti tam čiarka

{control createSiteForm, $eventId}

Ani když přidám čárku, tak se mi form nevykreslí. (cache sem promazal) :(

JaxP
Člen | 62
+
0
-

Zrovna řeším stejný problém. Nic z toho mi nefunguje (resp. hodnoty nedorazí):

{control createSiteForm, $eventId}
{control createSiteForm $eventId}
{control createSiteForm, "eventId" => $eventId}
{control createSiteForm "eventId" => $eventId}
jarda256
Člen | 130
+
+2
-

@JaxP napadlo mě řešení, kterým jsem to schopen předat ale né v šabloně, ale už v presenteru

    protected $eventId;
public function actionCreate($id = NULL)
    {
        $this->eventId = $id;
    }
protected function createComponentCreateSiteForm()
    {
        return $this->createSiteFactory->create($this->eventId,function () {
            $this->flashMessage("Strana byla úspěšně vytvořena", 'success');
            $this->redirect(':Admin:Event:show');
        });
    }
JaxP
Člen | 62
+
0
-

@jarda256 walkaround pěkný, ale podle mě zde musí být přímá cesta :).

Zapracoval jsem to dle tvého návrhu rovnou do handleru a funguje. Stejně mě ale štve ten nevyužitý potenciál volání komponenty s proměnnou :).

Editoval JaxP (1. 12. 2016 19:51)

jarda256
Člen | 130
+
0
-

@JaxP Taky bych raději přímou cestu (vypadá lépe), ale bohužel podle dokumentace je ten zápis správný, ale nefunguje :(
ale bohužel jsem teď dospěl k jinému problému :(

https://forum.nette.org/…alovace-form

CZechBoY
Člen | 3608
+
0
-

Doporucuju nepouzivat render parametry, protoze treba v ajaxu se nepredavaji a vola se render().

newPOPE
Člen | 648
+
0
-

Hosi ale ako pozeram vy to mate cele nejake divne.

Vo factory sice vytvarate form ale pokial viem tak formu sa predat parametre nedaju (edit: ok, da sa to ale nie je to dobre).

Cize bud si dany formular obalit do komponenty alebo tam ten parameter nedavat.

@CZechBoY ma pravdu, predavat si parametre az v sablone nie je moc dobry pristup. Lebo potom na AJAX-e napriklad si tzv. „rozbijete hu**“.

Editoval newPOPE (1. 12. 2016 20:36)

jarda256
Člen | 130
+
0
-

@newPOPE @CZechBoY
Také už jsem to podle toho upravil :) bohužel jsem dospěl k dašímu problému. Na jedné url se mi formulář vykresluje bez obalovače <form> ale na jiné to je ok (dospěl jsem tedy k závěřu, že továrnička na form je ok…bohužel nevím čím by to mohlo být)