Link na záznam v databázi… Jak na to?

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

Zdrawím,

píšu svou první aplikaci dle dokumentace (Píšeme první aplikaci) a zarazil mě jeden problém.. Nepíšu přímo úkolníček, ale rovnou ho při psaní upravuji na mou aplikaci.

A teď co bych potřeboval objasnit:
V tutariálu a v jeho části kde je zobrazena tabulka nesplněných úkolů v mé aplikaci zobrazuji tabulku odehranýh her kde jsou z tabulky Game vypsány údaje jako datum, kolo, jmnéna hráčů a jméno vítěze (to funguje dobře) – na konci každého řádku vypsaných her bych chtěl napsat „detail“ – odkaz na záznam z tabulky score, po kliknutí chci zobrazit stránku s detaily této hry. V databazi – v tabulce score mám sloupeček game_id obsahující ID hry v tabulce Game.

Co by měl obsahovat HomepagePresenter, ScorePresenter a jeho ScoreRepository?

Myslím že potřebuji do odkazu „detail“ v default.late (Hompage) dostat ID té určité hry, které se předá ScorePresenteru, kde následně vypíšu data z tabulky score které obsahují hodnotu game_id stejnou jako je předané ID z Hompage. Přemýšlím správně nebo jádro pudla bude někde jinde?

Default.late (hompage) tabulka her:

{foreach $games as $game}
	<tr>
		<td>{$game->date|date: 'd.m.y'}</td>
		<td>{$game->ref('disc')->zkr}</td> /** Zkratka názvu hry z tabulky discipline */
		<td>{$game->number}</td>
		<td>{$game->ref('player_one')->name} vs. {$game->ref('player_two')->name}</td> /** jména hráčů z tabulky player */
		<td>{$game->ref('win')->name}</td> /** jméno vítěze z tabulky player */
		<td>detail</td> /** zde by měl být odkaz na detail hry - hodnoty v tabulce score*/
castamir
Člen | 629
+
0
-

Pokud se nepletu, tak přes

$game->related('score', 'id'); // predpokladam, ze je id je PK v tabulce games, na ktery se odkazuje game_id z tabulky score

dostaneš GroupedSelection (dědí od Selection)

...
	<td>{$game->ref('win')->name}</td> /** jméno vítěze z tabulky player */
{foreach $game->related('score', 'id') as $score}
	<td><a n:href='Score:detail $score->id'>detail</a></td>
{/foreach}

ScorePresenter.php

// inject $scoreRepository

public function actionDetail($id) {
	$score = $this->scoreRepository->get($id);
	// osetreni, zda existuje
}

edit: opravena jedna velice trapná chybka :D

Editoval castamir (11. 4. 2013 10:34)

boneofsin
Člen | 25
+
0
-

Aha, vyzkouším… ano hodnota „game_id“ (ve score) je Primary Key v tabulce Game

boneofsin
Člen | 25
+
0
-

Ano funguje to, přikládám kody viz. níže. Jenom taková maličkost – odkaz „detail“ se mi nezobrazuje jako odkaz, takže není možné na něj kliknout..

Homepage – default.late

{block content}

<h1 n:block="title">Poslední útkání - homepage</h1>
<table>
    <thead>
        <tr>
            <th>Datum</th>
            <th>Disciplína</th>
            <th>Kolo</th>
            <th>Hráči</th>
            <th>Vítěz</th>
       </tr>
    </thead>
    <tbody>
    {foreach $games as $game}
        <tr>
            <td>{$game->date|date:'d.m.y'}</td>
            <td>{$game->ref('disc')->zkr}</td>
            <td>{$game->number}</td>
            <td>{$game->ref('player_one')->name} vs. {$game->ref('player_two')->name}</td>
            <td>{$game->ref('win')->name}</td>
            {foreach $game->related('score', 'id') as $score}
            <td n:href='Score:detail $score->id'>detail</td>
            {/foreach}
        </tr>
    {/foreach}
    </tbody>
</table>

{/block}

ScorePresenter

<?php

/**
 * Presenter, který zajišťuje výpis výsledků her.
 * @author Foizo
 */
class ScorePresenter extends BasePresenter

{
    /** @var @var Todo\ScoreRepository */
    private  $scoreRepository;

    protected function startup()
    {
        parent::startup();
        $this->scoreRepository = $this->context->scoreRepository;
    }

    private $score;


    public function actionDefault($id)
    {
        $this->score = $this->scoreRepository->find($id);
        if ($this->score === FALSE) {
            $this->setView('notFound');
        }
    }

    public function renderDefault()
    {
        $this->template->scores = $this->scoreRepository->findScore($this->score);

    }
}

ScoreRepository

<?php
namespace Todo;
use Nette;

/**
 * Tabulka score
 */
class ScoreRepository extends Repository
{
    public function  findScore($id)
    {
        return $this->findBy(array ('game_id' => $id));
    }


}
castamir
Člen | 629
+
0
-

Promiň. Asi jsem ještě spal, když jsem to psal :D

<td><a n:href='Score:detail $score->id'>detail</a></td>
boneofsin
Člen | 25
+
0
-

=) taky mě to mohlo trknout když do toho čumim.. jinak moc děkuju

boneofsin
Člen | 25
+
0
-

a teď je otázka jak udělat odkazy z jmen hráčů viz. Homepage – default.latte. Player_one a player_teo a win odkaz např. Player/default/1 (1 = ID hráče)

castamir
Člen | 629
+
0
-
<td>
    <a n:href="Player:default $game->ref('player_one')->id">
    	{$game->ref('player_one')->name}
    </a>
    vs.
    <a n:href="Player:default $game->ref('player_two')->id">
    	{$game->ref('player_two')->name}
    </a>
</td>

Editoval castamir (11. 4. 2013 12:02)