jak použít NMultiplier s NAppForm
- petr.pavel
- Člen | 535
Přečetl jsem ohledně Multiplieru, co se dalo, ale pořád mi něco uniká. Snažím se ho použít na formulář.
V níže uvedeném kódu vyskočí Laděnka s chybou „Component with name
‚1‘ does not exist.“ a to konkrétně v
NComponentContainer-> getComponent()
při pokusu vrátit
podkomponentu pomocí:
<?php
return $this->components[$name]->getComponent($ext, $need);
// $name: scoreForm; $ext: 1; $this->components[$name] je NMultiplier
?>
<?php
class PokusPresenter extends NPresenter {
public function createComponentScoreForm() {
$presenter = $this;
return new NMultiplier(function($playerId) use ($presenter) {
/*
* $playerId se sem dostane, ale nevím, jak zařídit, aby se
* vytvořila podkomponenta - předání konstruktoru AdminScoreForm nepomůže
*/
return new AdminScoreForm($presenter, $playerId);
});
}
}
?>
<?php
class AdminScoreForm extends NAppForm {
public function __construct($parent = null, $name = null) {
parent::__construct($parent, $name);
$this->addHidden('player');
// ...
}
// ...
?>
{for $playerId = 1; $playerId < 10; $playerId++}
{form "scoreForm-$playerId"}
[{$playerId}] {input handicap} {input submit}<br>
{/form}
{/for}
Až vyřeším tohle, budu teprve řešit, jak předat výchozí hodnoty, ale zatím nepředbíhejme :-)
Nette Framework 2.0.1 (revision 94abcaa released on 2012–02–29), zkoušel jsem i s 2.0.3
- davidm
- Člen | 81
a takhle by to nefungovalo??
<?php
class PokusPresenter extends NPresenter {
protected function createComponentScoreForm() {
return new NMultiplier(function($playerId) {
return new AdminScoreForm();
});
}
}
btw mas php 5.3 kdyz pouzivas prefixovanou verzi?
Editoval davidm (10. 4. 2012 14:28)
- petr.pavel
- Člen | 535
Bomba! Funguje.
Ještě zajímavost. Autor tohoto vlákna získává rodiče komponenty jako parametr při volání továrny. V mojí verzi by to tedy bylo:
<?php
return new NMultiplier(function($playerId, $parent) {
return new AdminScoreForm($parent, $playerId);
});
?>
Dokonce to i funguje :-)
Sice nevím proč, ale tuším, že takto je to správnější, než volání
bez rodiče.
Mohl bys mi, prosím, vysvětlit, za jakých okolností je volání bez rodiče
v pořádku?
Každopádně ještě jednou dík, nakopl's mě správným směrem.
- petr.pavel
- Člen | 535
Re PHP 5.3 a prefixovaná verze:
Nemám
rád jmenné prostory, proto používám prefixovanou verzi i pod
PHP 5.3.
- davidm
- Člen | 81
Nette ti komponentu automaticky pripoji k rodici v metode getComponent() … Pokud componenta jeste nebyla vytvorena zavola crateComponent ⇒ pak zkontroluje jestli ma rodice, pokud ne pripoji ji k presenteru … takze pokud chces mit jako rodice presenter, neni duvod predavat ho pres konstruktor