nefunkcny persistentni parameter v komponente pomocou create

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

Cauko, vedeli by ste mi niekto poradit nefunguje mi predavanie persistentneho parametru v komponente ktoru vytvaram pomocou create.

class MailerFormControl extends \BaseFormControl {

    /** @persistent */
    public $attachmentCount;

    public function __construct() {
        parent::__construct();
    }

    /**
     * COMPONENT FORM
     * @return \Nette\Application\UI\Form
     */
    protected function createComponentForm() {
        $form = new Form;
        .....
        Debugger::barDump($this->attachmentCount);
        return $form;
    }

    /**
     * RENDER - CONTROL
     */
    public function render() {
        $this->template->attachmentCount = $this->attachmentCount;
        parent::render();
    }

}

/**
 * IMailerFormControlFactory
 */
interface IMailerFormControlFactory {

    /** @return MailerFormControl */
    function create();
}

sablona:

<a n:href="this attachmentCount=>$attachmentCount+1">plus</a>

po kliknuti na odkaz mi v komponente dumpne null a v sablone +1, preco? Proste mi persistentni parameter prepise az po vytvoreni formulara. Dalo by sa to nejako riesit?

Editoval duskohu (5. 1. 2013 1:32)

nanuqcz
Člen | 822
+
0
-

Ahoj,
myslím, že je to tím, že nepředáváš parametry $parent a $name (což není nutnost, ale myslím že persistentní parametry kvůli tomu pak blbnou). Tedy konstruktor komponenty bude vypadat takto:

    public function __construct($parent = NULL, $name = NULL) {
        parent::__construct($parent, $name);
    }

a v presenteru továrnička takto:

    function createComponentMailerForm($name)
    {
        $form = new MailerFromControl($this, $name);
        ...

        return $form;
    }

Zkus a kdyžtak napiš, jestli to pomohlo ;-)

duskohu
Člen | 778
+
0
-

Hmm toto je klasicky sposob pripajania rodica „komponenty“ k presenteru, lenze ja som pouzil sposob cez inject, cize v neone mam:
teraz tam nic nepredavam, ale neskor budem predavat nejake modeli

        MailerForm:
            create: \MailerFormControl
            implement: IMailerFormControlFactory

a v presentru volam:

    /**
     * INJECT MailerFormControlFactory
     * @param \IMailerFormControlFactory $mailerFormControlFactory
     */
    public function injectAjaxMailerFormControlFactory(\IMailerFormControlFactory $mailerFormControlFactory) {
        $this->mailerFormControlFactory = $mailerFormControlFactory;
    }

    protected function createComponentMailerForm() {
        $control = $this->mailerFormControlFactory->create();
        $form = $control["form"];

        return $control;
    }

a potom hore spomenuta komponenta formulara.

Filip Procházka
Moderator | 4668
+
0
-

nanuqcz napsal(a):

Ahoj,
myslím, že je to tím, že nepředáváš parametry $parent a $name (což není nutnost, ale myslím že persistentní parametry kvůli tomu pak blbnou). Tedy konstruktor komponenty bude vypadat takto:

Mylná domněnka. Tohle nemá žádný vliv na persistentní parametry. Důrazně nedoporučuji připojování konstruktorem.


@duskohu: Výchozí hodnotu pro $attachmentCount dej nulu.

class MailerFormControl extends \BaseFormControl
{
    /** @persistent */
    public $attachmentCount = 0;

Dále bych si vytvořil signál

public function handlePlus($attachmentCount)
{
	// tady ani nemusíš nic psát
}

A odkaz upravil takto

<a n:href="plus, $attachmentCount+1">plus</a>

Pokud to nepomůže, tak zkus nastavit komponentu jako persistentní.

duskohu
Člen | 778
+
0
-

To som uz skusal , ked dam dump
v sablone, v render aj v handle sa navysena hodnota +1 prejavi ale v metode createComponentForm nie, je stale defaultna 0.

enumag
Člen | 2118
+
0
-

Protože v createComponentForm ještě komponenta není připojená k presenteru (ledaže bys použil to co psal @nanuqcz, ale to nedoporučuji). Imho by ten kód který pottřebuje perzistentní parametr té komponenty měl být až v startup/action/render/beforeRender etc., podle toho, o co jde.

nanuqcz
Člen | 822
+
0
-

Filip: Aha, tak to se omlouvám, měl jsem pocit, že mi persistentní parametry v jednom projektu nefungovaly právě kvůli tomuto.

Kde se o tom, proč je předávání parametru $parent a $name bad practise, můžu dočíst víc? (sry za offtopic)

Filip Procházka
Moderator | 4668
+
0
-

Tak jsem to testoval a takhle mi to funguje.

app/presenters/HomepagePresenter.php

class HomepagePresenter extends BasePresenter
{
	private $mailerFormControlFactory;

	public function injectAjaxMailerFormControlFactory(\IMailerFormControlFactory $mailerFormControlFactory)
	{
	    $this->mailerFormControlFactory = $mailerFormControlFactory;
	}

	protected function createComponentMailerForm()
	{
	    return $this->mailerFormControlFactory->create();
	}

}

interface IMailerFormControlFactory
{
    /** @return MailerFormControl */
    function create();
}

class MailerFormControl extends Nette\Application\UI\Control
{

    /** @persistent */
    public $attachmentCount;

    public function __construct()
    {
        parent::__construct();
    }

    protected function createComponentForm()
    {
        $form = new Nette\Application\UI\Form;
        $attch = $form->addContainer('attachements');

        Nette\Diagnostics\Debugger::barDump($this->attachmentCount);
        foreach (range(0, $this->attachmentCount) as $i) {
			$attch->addText($i, "Příloha " . $i);
        }

        return $form;
    }


    public function handlePlus($attachmentCount)
    {
    }


    public function render()
    {
    	$template = $this->createTemplate('Nette\Templating\Template');
        $template->plusCount = $this->attachmentCount + 1;
    	$template->setSource("{control form} <a n:href=\"plus, \$plusCount\">plus</a>");
        $template->render();
    }

}

app/templates/Homepage/default.latte

{#content}
<p>Hola!</p>
{control mailerForm}

app/config/config.neon

	factories:
		MailerForm:
			create: \MailerFormControl
			implement: IMailerFormControlFactory
duskohu
Člen | 778
+
0
-

Hmmm, tak som pouzil tvoj kod, este som dal prec aj BaseForm a dal tam Control pre istotu, ale mne to stale nefunguje, proste v url a v sablone sa mi navysena hodnota zmeni ale v createComponentForm je stale defaultna. No fakt uz neviem co mozem mat zle.

Edit: @enumag mi vysvetlil preco to nejde, lebo saham na formular este nez presenter o nom vie. Ale ako by sa to dalo riesit?

    protected function createComponentMailerForm() {
        $control = $this->mailerFormControlFactory->create();
        $form = $control["form"];

        $form->addSubmit('send', 'Odoslat');
        $form->onSuccess[] = callback($this, 'mailerSubmitted');

        return $control;
    }

Editoval duskohu (5. 1. 2013 14:09)

Patrik Votoček
Člen | 2221
+
0
-

duskohu napsal(a):

Hmmm, tak som pouzil tvoj kod, este som dal prec aj BaseForm a dal tam Control pre istotu, ale mne to stale nefunguje, proste v url a v sablone sa mi navysena hodnota zmeni ale v createComponentForm je stale defaultna. No fakt uz neviem co mozem mat zle.

Protože v createComponentForm ještě není ke komponentě připojený presenter.

Edit: @enumag mi vysvetlil preco to nejde, lebo saham na formular este nez presenter o nom vie. Ale ako by sa to dalo riesit?

    protected function createComponentMailerForm() {
        $control = $this->mailerFormControlFactory->create();
        $form = $control["form"];

        $form->addSubmit('send', 'Odoslat');
        $form->onSuccess[] = callback($this, 'mailerSubmitted');

        return $control;
    }
protected function createComponentMailerForm($name) { // pridas name
	$control = $this->mailerFormControlFactory->create();

	$this->addComponent($control, $name); // a tehle radek

	$form = $control["form"];

	$form->addSubmit('send', 'Odoslat');
	$form->onSuccess[] = callback($this, 'mailerSubmitted');

	return $control;
}