Změna modelu/prezenteru/sablony

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

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
+
0
-

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
+
0
-

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
+
0
-

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)