Signály – konstruktor dostane null

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

Mám problém se signálem, hodí mi to chybovou hlášku:
Argument 2 passed to Dera\NepotvrzeneZapasyControl::__construct() must be an instance of Dera\ZapasRepository, null given, called in D:\BP\nette\Dera\app\presenters\HomepagePresenter.php on line 87 and defined s

Zkoušel jsem v konstruktoru třídy NepotvrzeneZapasyControl dát pryč, že proměnná musí být typu ZapasRepository, ale pak mi to zase hodí, že volám funkci na „neobjektu“. Takže k samotnému kódu:

model

class ZapasRepository extends Repository {
.
.
.
 public function potvrzeniZapasu($idZapasu)
     {
	// Vloží změnu stavu do dabáze
	 $this->findBy(array('idZapasu' => $idZapasu))->update(array('stav' => 2));
     }

presenter

class HomepagePresenter extends BasePresenter{

private $zapasRepository;
.
.
.
 protected function createComponentNepotvrzeneZapasy()
    {
	return new Dera\NepotvrzeneZapasyControl($this->zjistiNepotrvzeneZapasy(),$this->zapasRepository);
    }

komponenta

class NepotvrzeneZapasyControl extends Nette\Application\UI\Control  {

    private $selected;
    private $zapasRepository;

    public function __construct(array $selected,ZapasRepository $zapasRepository)
    {
        parent::__construct();
        $this->selected = $selected;
	$this->zapasRepository = $zapasRepository;
    }
.
.

 public function handlePotvrzeniZapasu($idZapasu)
    {
	$this->zapasRepository->potvrzeniZapasu($idZapasu);
	$this->presenter->redirect('this');
    }

šablona

{foreach $nepotvrzeno as $zapas}
<td><a n:href="potvrzeniZapasu! $zapas->idZapasu" class="tlacitko">potvrdit výsledek</a></td>
{/foreach}

Vycházel jsem z quickstartu.

jiri.pudil
Nette Blogger | 1032
+
0
-

Kde a jak předáváš ZapasRepository do presenteru?

wasek2611
Člen | 17
+
0
-

jestli myslíš, jestli mám zaregistrovanou službu v configu, tak mám

services:
		authenticator: Authenticator
		routerFactory: RouterFactory
		router: @routerFactory::createRouter
# Sluzby pro Dera
		zapasRepository: Dera\ZapasRepository
		hracVKlubuRepository: Dera\HracVKlubuRepository
		klubRepository: Dera\KlubRepository
		hracRepository: Dera\HracRepository

v HP mám metodu:

public function zjistiNepotrvzeneZapasy()
  {
    // Najdeme si idKlubu pomoci spravneho modelu
    $idKlubu = $this->context->hracVKlubuRepository->najdiIdKlubu($this->hrac);

    // Vybereme zapasy a vratime pro zpracovani prislusneho view
    return  $this->context->zapasRepository->nepotvrzeneZapasyKlubu($idKlubu);
  }

doufám, že je to to, cos myslel. Ale spíš jsi narážel asi na to, že mi tam něco chybí, pořád si porovnávám svůj kód s quickstartem a nemůžu nějakou odlišnost najít (jediná, že já předávám parametr konstrukotru componenty jako pole)

hAssassin
Člen | 293
+
0
-

do presenteru dej:

protected $zapasRepository = NULL;

public function injectZapasRepository(\Dera\ZapasRepository $repos)
{
	$this->zapasRepository = $repos;
}
wasek2611
Člen | 17
+
0
-

moc díky, už mi to funguje :)

a ještě bych se chtěl zeptat, jak potom to id zápasu z komponenty přenesu do homepage presenteru (ještě se s tou hodnotou dělá víc věcí, než jen potvrzuje zápas, metodu mám HPP a k tý metodě další pomocné metody a nechce se mi je všechny zbytečně kopírovat do komponenty)

naprosto by stačilo, kdybych mohl metodu z HPP použít v té komponentě.

Editoval wasek2611 (23. 4. 2013 17:32)

+
0
-

Jsem začátečník, ať mě někdo opraví, pokud se to tak nemá dělat,

ale z komponenty můžeš používat metody presenteru přes $this->presenter->metodaPresenteru();

hAssassin
Člen | 293
+
0
-

@stehlikpetr@msn.com > ano, ale proc bys to delal? a za druhy si tim znacne snizujes prenositelnost komponenty (coz je jeji hlavni vlastnost/prednost), protoze je pak vazana pouze na ty presentery, ktery maji implementovanou metodu metodaPresenteru().

wasek2611
Člen | 17
+
0
-

@stehlikpetr@msn.com

moc díky ;) funguje to jak má

Editoval wasek2611 (26. 4. 2013 0:16)