Link na záznam v databázi… Jak na to?
- boneofsin
- Člen | 25
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
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
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));
}
}