nefunkcny persistentni parameter v komponente pomocou create

- duskohu
 - Člen | 778
 
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
 
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
 
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
 
nanuqcz napsal(a):
Ahoj,
myslím, že je to tím, že nepředáváš parametry$parenta$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í.

- enumag
 - Člen | 2118
 
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.

- Filip Procházka
 - Moderator | 4668
 
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
 
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
 
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;
}