jak použít NMultiplier s NAppForm

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

petr.pavel
Člen | 535
+
0
-

Děkuju za vysvětlení, jsem rád, že jsem pochopil zase o kousek víc. Dík!