Změna modelu/prezenteru/sablony
- MzK
- Člen | 127
Navazuje na https://forum.nette.org/…vypis-clanku?…
Mám ArticlesModel, který umí vypsat všechny články (index).
Mám ArticleModel, který umí vypsat 1 článek dle URL článku.
Mám DefaultPresenter který naplní šablonu Default.default.phtml pomocí ArticlesModel seznamem článků.
A teď se ptám. Pro 1 článek (ne vypis několika) mám mít asi
samostatnou šablonu, samostatný presenter, samostatný model?
Nebo mám jen přidat funkci do stávajícího modelu, presenteru?
A teď, v DefaultPresenter mám fci:
<?php
public function handleGetArticle($url) { // chci jenom 1 clanek
$this->redirect('Clanek:getArticle');
}
?>
Která samozřejmě nejde.
Zkoušel jsem Clanek:presenter, Default.clanek.phtml apod.
Co tam mám napsat, aby se mi změnila šablona na Default.clanek.phtml +
použil ClanekPresenter a zachovala URL, dle které se vybere konkrétní
článek.
- Ondřej Mirtes
- Člen | 1536
V DefaultPresenteru si vytvoř action article
:
public function renderArticle($id) {
}
A v něm vezmi data z modelu k aktuálnímu ID a v šabloně Default.article.phtml je vypiš.
Link na toto view je {link Default:article $id}
.
Obě metody (getArticles a getArticle) můžeš mít v jedné třídě, proč také ne. Anebo to lze elegantně sloučit do jedné metody pomocí DibiDataSource.
- MzK
- Člen | 127
Ať to zkouším jakkoliv, tak nejde:
–DefaultPresenter.php
<?php
class DefaultPresenter extends Presenter {
public function renderDefault() { //vypise list clanku
$model = new ArticlesModel;
$this->template->articles = $model->getArticles();
}
public function renderArticle($url) {
$model = new ArticlesModel;
$this->template->article = $model->getArticle($url);
}
?>
Takle vypadá šablona (zkoušel jsem různé možnosti linku jaky je spravny?) Default.default.phtml
{foreach $articles as $article}
<div class="post">
<h2><a href="{link getArticle($article->url)}">{$article->name}</a></h2>
<h2><a href="{link Clanek:getArticle $article->url}">{$article->name}</a></h2>
<a href="<?php echo $presenter->link('getArticle!',$article->url) ?>">link</a>
{$article->description}
</div>
{/foreach}
No a Articlesmodel je : 2 metody pro clanky a pro clanek.
<?php
class ArticlesModel extends Object {
public function getArticles() {
return dibi::fetchAll('SELECT url, name, description FROM [blog] ORDER BY name DESC LIMIT 10');
}
public function getArticle($url) {
return dibi::fetchAll('SELECT id,url, name, description,text FROM [blog] WHERE `url` = %s ORDER BY name DESC LIMIT 10', $url);
}
}
?>
A dotaz zní, co mám špatně a jak volat sablonu článku což je:
Default.clanek.phtml
{foreach $articles as $article}
<div class="post">
<h2>{$article->name}</a></h2>
{$article->description}
{$article->text}
</div>
{/foreach}
Mám vše dobře pojmenované?
Jak změnit šablonu v metodě renderArticle?
- davidm
- Člen | 81
Model: v getArticle() mas uplne zbytecne ORDER BY …, protože máš jen jeden výsledek
<?php
class ArticlesModel extends Object {
public function getArticles() {
return dibi::fetchAll('SELECT * FROM [blog] ORDER BY name DESC');
}
public function getArticle($url) {
return dibi::fetch('SELECT * FROM [blog] WHERE url=%s', $url);
}
}
Default.default.phtml:
{foreach $articles as $article}
<div class="post">
<h2><a href="{link Default:article $article->url}">{$article->name}</a></h2>
{$article->description}
</div>
{/foreach}
Default.clanek.phtml – musi se jmenovat Default.article.phtml, protože máš v presenteru renderArticle
<div class="post">
<h2>{$article->name}</h2>
{$article->description}
{$article->text}
</div>
Editoval davidm (4. 11. 2009 12:28)