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$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í.
- 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;
}