Volání funkce z presenteru

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

Zdravím,

S nette se teprve seznamuji, prohledal jsem fórum, ale s chybou jsem nehnul. Snažím se v šabloně volat funkci z presenteru, ale stále mi to hlásí stejnou chybu.

Děkuji všem za rady :)

Presenter

class TurnajePresenter extends BasePresenter
{

	private $database;



    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

	  public function team_name($PlayerId)
    {
      $team_name = $database->
      query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);

    }
    public function renderTurnaj($turnajId)
    {

    $this->template->turn = $this->database->table('turnaje');
    $this->template->hraci_top = $this->database->table('turnaje_players')
         ->order('goly, asistence');


    $turnaj = $this->database->table('turnaje')->get($turnajId);
    if (!$turnaj) {
        $this->error('Turnaj nebyl nalezen');
    }

    $this->template->turnaj = $turnaj;
    }


}

šablona

	{foreach $hraci_top as $hrac}
        <tr>
					<td>2</td>
					<td>{$hrac->name}</td>
					<td>{$hrac->goly}</td>
          			<td>{? $Turnaje->team_name($hrac->id); }</td>
					<td>{$hrac->pozice}</td>
				</tr>
{/foreach}

Hlásí to stále chybu Undefined variable: Turnaje
Xantes
Člen | 28
+
0
-

V presenteru posíláš do šablony proměnou turnaj, ale v šabloně používáš proměnnou turnaje.

Tomáš Votruba
Moderator | 1114
+
0
-

Ahoj,

monžná je chyba v názvu proměnné, tj. místo:

$this->template->turn = $this->database->table('turnaje');

zkus

$this->template->Turnaje = $this->database->table('turnaje');
Zechy
Člen | 24
+
0
-

Potřebuji zavolat tu funkci, aby mi vrátila název týmu hráče, dle Id hráče. Tu potřebuji zavolat a s něčím se to kope a nevím s čím přesně. To turn tam mám právě schválně, aby se to nepralo se presenterem, který se právě nešťastně jmenuje také Turnaje.

Etch
Člen | 403
+
0
-

Zechy napsal(a):

Potřebuji zavolat tu funkci, aby mi vrátila název týmu hráče, dle Id hráče. Tu potřebuji zavolat a s něčím se to kope a nevím s čím přesně.

To nic nemění na tom, že tu že tu proměnou $Turnaje do té šablony prostě nepředáváš!

Zechy napsal(a):

To turn tam mám právě schválně, aby se to nepralo se presenterem, který se právě nešťastně jmenuje také Turnaje.

Proč by se měla proměnná $Turnaje prát s názvem presenteru? To tak nějak nechápu co tím myslíš.

Zechy
Člen | 24
+
0
-

Dobře, můžete mi tedy poradit jak by se měla zavolat ta funkce?

Mysteria
Člen | 797
+
0
-

Chápu to správně, že chceš pomocí

$Turnaje->team_name($hrac->id);

ze šablony zavolat tuhle metodu presenteru?

public function team_name($PlayerId) {
      $team_name = $database->query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);
}
Zechy
Člen | 24
+
0
-

Mysteria napsal(a):

Chápu to správně, že chceš pomocí

$Turnaje->team_name($hrac->id);

ze šablony zavolat tuhle metodu presenteru?

public function team_name($PlayerId) {
      $team_name = $database->query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);
}

Ano o to se snažím, předpokládám, že to volám špatně…

Editoval Zechy (22. 2. 2014 18:25)

JDC
Člen | 19
+
0
-

Zkus $presenter->team_name() nebo $_presenter->team_name() ale nezkoušel jsem. Ale teoreticky by to mělo jít, měla by tím jít zavolat funkce presenteru přímo.

Pavel Macháň
Člen | 282
+
0
-

Zechy napsal(a):

Zdravím,

S nette se teprve seznamuji, prohledal jsem fórum, ale s chybou jsem nehnul. Snažím se v šabloně volat funkci z presenteru, ale stále mi to hlásí stejnou chybu.

Děkuji všem za rady :)

Presenter

class TurnajePresenter extends BasePresenter
{

    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

	  public function team_name($PlayerId)
    {
      $team_name = $database->
      query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);

    }
.....
}
	private $database;

	public function team_name($PlayerId)
	{
		$team_name = $database->query('....');
	}

Sice pěkný, že si přez konstruktor předáš DB context ale ve funkci team_name voláš nedefinované $database … když už tak zavolat $this->database

Jak uk už tady psali ostatní, nemůžeš v šabloně volat $Turnaje které si do šablony z presenteru nepředáš.

JDC napsal(a):

Zkus $presenter->team_name() nebo $_presenter->team_name() ale nezkoušel jsem. Ale teoreticky by to mělo jít, měla by tím jít zavolat funkce presenteru přímo.

Šablona nemá volat žádné funkce prezenteru. V action(render) metodě si to složíš a předáš šabloně.

Editoval EIFEL (23. 2. 2014 1:14)

Zechy
Člen | 24
+
0
-

Předal jsem to celé do renderTurnaj, jestli jsem to tedy dobře pochopil. Mám ale problém s tím, že nevím jak předat té funkci $PlayerId z té šablony.

public function renderTurnaj($turnajId, $PlayerId)
    {

    $this->template->team_name =  $this->database->query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);

    $this->template->turnaje = $this->database->table('turnaje');
    $this->template->hraci_top = $this->database->query('SELECT tp.name, tp.cislo, tp.rocnik, tp.goly, tp.asistence, tp.pozice FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id inner join turnaje t on tt.id_turnaj = t.id where t.id =', $turnajId ,'ORDER BY tp.goly');


    $turnaj = $this->database->table('turnaje')->get($turnajId);
    if (!$turnaj) {
        $this->error('Turnaj nebyl nalezen');
    }

    $this->template->turnaj = $turnaj;
    }

Editoval Zechy (23. 2. 2014 16:19)

Zechy
Člen | 24
+
0
-

Bump

Mohl by mi někdo poradit?
Potřebuji v šabloně vykreslit jméno týmu, dle id hráče. Napsal jsem si na to funkci

public function teamName($PlayerId)
{

     $row =  $this->database->query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.teams = tt.id where tp.id =', $PlayerId);

    return ($row) ? $row : NULL;
}

Jenom nevím jak v šabloně předat té funkci id hráče. Zkoušel jsem něco jako, ale to je určitě špatně.

{foreach $hraci_top as $hrac}
          <tr>
      		   <td></td>
                   <td>{$hrac->name}</td>
                   <td>{$hrac->rocnik}</td>
                   <td>{? TurnajePresenter::teamName($hrac->id); }</td>
  		   <td>{$hrac->pozice}</td>
                   <td>{$hrac->goly}</td>
                   <td>{$hrac->asistence}</td>
         </tr>
{/foreach}

Určitě jdu na to špatně, takže bych byl rád, kdyby mě někdo navedl na správnou cestu. Budu rád za každou radu, děkuji.

Editoval Zechy (20. 3. 2014 22:54)

enumag
Člen | 2118
+
0
-

Ideální to neni, ale mělo by fungovat.

{$presenter->teamName($hrac->id)}
Zechy
Člen | 24
+
0
-

Děkuji, z DB to už vytáhne, ale při vykreslení to pořád háže chybu.

htmlspecialchars() expects parameter 1 to be string, object given

Mariocz
Člen | 52
+
0
-
{$presenter->teamName($hrac->id)->team_name}

ale spíš bys měl použít cizí klíče v db, provázat hráče a team (sloupec team_id v tabulce hráče) a pak v šabloně tahat název týmu takhle

$hrac->team->name

https://doc.nette.org/…ase/explorer

Zechy
Člen | 24
+
0
-

V DB mám použité PK a FK takže to provázané je, jenom nevím jak to přesně zavolat v šabloně a presenteru tak, aby to nette přechroupalo :)

Mariocz
Člen | 52
+
0
-

Tak šup přečíst odkaz o dva posty výš. A kdyby to i pak nefungovalo tak pošli strukturu databáze abysme mohli poradit líp

Zechy
Člen | 24
+
0
-

Ten link odkazuje špatně :)

Zechy
Člen | 24
+
0
-

Chápu-li to dobře, tak zápis toho by měl být takto

{$hrac->turnaje_teams->name}

Schéma db: http://prntscr.com/32v34z

David Matějka
Moderator | 6445
+
0
-

koukni jeste sem, kde se povida jen o activerow. pro „to one“ neni dulezity nazev cilove tabulky, ale nazev spojujiciho sloupecku, takze

{$hrac->turnaj->name}

(jak uz ti Mariocz poradil o nekolik prispevku vyse)

Zechy
Člen | 24
+
0
-

Teď mi to zase hlásí „Trying to get property of non-object“.
V presenteru mám zapsáno takto

public function renderTurnaj($turnajId)
    {



    $this->template->turnaje = $this->database->table('turnaje');
    $this->template->hraci_top = $this->database->table('turnaje_players');


    $turnaj = $this->database->table('turnaje')->get($turnajId);
    if (!$turnaj) {
        $this->error('Turnaj nebyl nalezen');
    }

    $this->template->turnaj = $turnaj;
    }

a volám

{foreach $hraci_top as $hrac}
                        <tr>
      					    <td></td>
                            <td>{$hrac->name}</td>
                            <td>{$hrac->rocnik}</td>
                            <td>{!$hrac->team_id->name}</td>
      					    <td>{$hrac->pozice}</td>
                            <td>{$hrac->goly}</td>
                            <td>{$hrac->asistence}</td>
      				     </tr>
                    {/foreach}

je tom tím, že se to rendruje dříve, než je tam schopen dosadit hodnotu, tudíž tam dosadí null že?

Editoval Zechy (21. 3. 2014 21:25)

David Matějka
Moderator | 6445
+
0
-
{$hrac->turnaj->name}

a ne

{$hrac->turnaj_id->name}

to prvni vrati active row na tym, to druhe vrati ID

Editoval matej21 (21. 3. 2014 21:32)

Zechy
Člen | 24
+
0
-

matej21 napsal(a):

{$hrac->turnaj->name}

a ne

{$hrac->turnaj_id->name}

to prvni vrati active row na tym, to druhe vrati ID

Díky, jenom ne $hrac->turnaj->name ale $hrac->team->name. Chci vrátit název teamu :) Ale díky moc, už to funguje. Jenom to musím ještě více prostudovat, abych to lépe pochopil.

Mysteria
Člen | 797
+
0
-

@Zechy: Na tom není skoro žádná věda, prostě ze základní tabulky A se pomocí $a->b dostaneš k tabulce B úplně stejně, jako kdyby jsi měl rovnou $b a to i vícenásobně.

Například máš tabulku User, Address a Town a provázané cizíma klíčema nebo konvencema a budeš chtět vypsat jméno města uživatele, tak prostě dáš $user->address->town->name. V $user „máš“ tabulku User, pomocí ->address se přesuneš na tabulku Address a z ní pomocí ->town do tabulky Town a ->name je už prostě název nějakýho sloupečku v tabulce Town.

Pro přesun mezi tabulkama se používají samotné názvy tabulek, tys tam místo toho „cpal“ název sloupečku, přes který jsou spojený, což je špatně.

Editoval Mysteria (21. 3. 2014 22:23)

Zechy
Člen | 24
+
0
-

Když se ale vrátím k tomu, že to jméno týmu budu volat přes fci, tak v čem je chyba?

public function teamName($PlayerId)
    {
      $row = $this->database->
      query('SELECT tt.name FROM `turnaje_players` tp inner join turnaje_teams tt on tp.team_id = tt.id where tp.id =', $PlayerId);

        return ($row) ? $row : NULL;

    }
{!$presenter->TeamName($hrac->id)}
Zechy
Člen | 24
+
0
-

Mysteria napsal(a):

@Zechy: Na tom není skoro žádná věda, prostě ze základní tabulky A se pomocí $a->b dostaneš k tabulce B úplně stejně, jako kdyby jsi měl rovnou $b a to i vícenásobně.

Například máš tabulku User, Address a Town a provázané cizíma klíčema nebo konvencema a budeš chtět vypsat jméno města uživatele, tak prostě dáš $user->address->town->name. V $user „máš“ tabulku User, pomocí ->address se přesuneš na tabulku Address a z ní pomocí ->town do tabulky Town a ->name je už prostě název nějakýho sloupečku v tabulce Town.

Pro přesun mezi tabulkama se používají samotné názvy tabulek, tys tam místo toho „cpal“ název sloupečku, přes který jsou spojený, což je špatně.

Děkuji za vysvětlení, ale právě když se používají názvy tabulek, tak proč jsem to volal přes $hrac->team->name a vypsalo to název toho týmu, když žádnou tabulky team nemám. To mi vrtá hlavou :)
Schéma DB jsem postoval výše.

David Matějka
Moderator | 6445
+
0
-

jo tam za to sorry, nevsim jsem si :)

precti si doc, konkretne tuhle cast
kratka verze:
Nette\Database nenajde zadny sloupecek team v te tabulce, ale zato najde sloupecek team_id, ktery to slovo obsahuje a tento sloupecek team_id ma FK na turnaje_teams

Zechy
Člen | 24
+
0
-

matej21 napsal(a):

jo tam za to sorry, nevsim jsem si :)

precti si doc, konkretne tuhle cast
kratka verze:
Nette\Database nenajde zadny sloupecek team v te tabulce, ale zato najde sloupecek team_id, ktery to slovo obsahuje a tento sloupecek team_id ma FK na turnaje_teams

Jo jasný, takže on vyhledal sloupec, který tomu byl podobný. Už je mi to jasnější. Teď ale bych potřeboval poradit v tom, že abych nemusel ručně přes SQL joinovat tabulky, tak chci vytáhnout z DB všechny hráče, kteří jsou zapsáni v turnaji, kde se pomocí get předává ID turnaje a vytáhnout vše. Jenom nevím co přesně mám dát do clausule where, aby odkazovala na záznam z té tabulky turnaje_teams.id_turnaj

Mariocz
Člen | 52
+
0
-
$database->table('turnaje_players')->where('team.id_turnaj = ?', $turnajId);

a nad tím zase tahat údaje hráče který potřebuješ nebo jestli chceš celej řádek tak za to ještě ->fetchAll().

A doporučil bych ti v DB upravit názvy buďto do češtiny nebo angličtiny, vyhodit slovíčko turnaje kde neni potřeba → tabulky hrac, tym, turnaj a u cizích klíčů používat všude stejný zápis = turnaj_id a ne id_turnaj

už teď při psaní jednoho řádku mi z toho šla hlava kolem :D

Editoval Mariocz (21. 3. 2014 23:05)

Zechy
Člen | 24
+
0
-

Mariocz napsal(a):

$database->table('turnaje_players')->where('team.id_turnaj = ?', $turnajId);

a nad tím zase tahat údaje hráče který potřebuješ nebo jestli chceš celej řádek tak za to ještě ->fetchAll().

A doporučil bych ti v DB upravit názvy buďto do češtiny nebo angličtiny, vyhodit slovíčko turnaje kde neni potřeba → tabulky hrac, tym, turnaj a u cizích klíčů používat všude stejný zápis = turnaj_id a ne id_turnaj

už teď při psaní jednoho řádku mi z toho šla hlava kolem :D

Ok díky, zkusím to pak nějak zakomponovat. Teď už mi jde z toho už také slušně hlava kolem. Musím přepsat tu db :D To je tak, když to vzniká z pochodu a pak si vždycky člověk vzpomene, že tam ještě není to či ono. Ten prefix turnaje_ tam musí být, jelikož to je pro turnaje jenom a pak tam bude ještě prefix club_ a vesměs stejné názvy tabulek.

Ale díky moc všem, pomohli jste mi dost! :)