Sloučení dvou komponent do jedné
- Petr Parolek
- Člen | 455
Ahoj, nevím, jak sloučit dvě komponenty do jedné a mít jeden presenter.
Presenter kategorie
namespace App\FrontModule\Presenters;
use Nette,
Nette\Application\UI\Form,
App\Model,
FrontComponents\Category\ICategoryControlFactory;;
/**
* Homepage presenter.
*/
class CategoryPresenter extends BasePresenter
{
/** @var ICategoryControlFactory @inject */
public $categoryControlFactory;
private $currentCategory;
public function renderShow($path)
{
$this->template->path = $this->getParameter("path");
}
public function actionShow($path) {
if(!($this->currentCategory = $this->articles->fetchArticlesByPath($path))){
throw new \Nette\Application\BadRequestException(404);
}
}
protected function createComponentCategory() {
return $this->categoryControlFactory->create($this->currentCategory);
}
}
{block content}
{control category $path}
presenter článku
namespace App\FrontModule\Presenters;
use Nette;
use FrontComponents\Article\IArticleControlFactory;
class ArticlePresenter extends BasePresenter {
/** @var IArticleControlFactory @inject */
public $articleControlFactory;
private $currentArticle;
public function renderShow($path,$id,$alias)
{
$this->template->id = $this->getParameter("id");
}
public function actionShow($path, $id, $alias) {
if(!($this->currentArticle = $this->articles->getArticle($id))){
throw new \Nette\Application\BadRequestException(404);
}
}
protected function createComponentArticle() {
return $this->articleControlFactory->create($this->currentArticle);
}
}
{block content}
{control article $id}
Komponenta kategorie
namespace FrontComponents\Category;
use Nette\Application\UI\Control,
App\Model\Articles,
App\Model\Categories;
class CategoryControl extends Control {
/**
* @var Categories $categories
*/
public $categories;
/**
* @var Articles $articles
*/
public $articles;
public function __construct(Articles $articles, Categories $categories)
{
$this->articles = $articles;
$this->categories = $categories;
}
public function render($path)
{
$template = $this->template;
$template->setFile(__DIR__ . '/templates/articles.latte');
$template->path = $path;
$template->articles = $this->articles->fetchArticlesByPath($path);
$template->render();
}
}
interface ICategoryControlFactory
{
/** @return CategoryControl */
function create();
}
<div class="blog-item">
{foreach $articles as $article}
<div class="row">
<div class="col-sm-12 blog-content">
<h2><a href="{plink :Front:Article:show $path,$article->id,$article->alias}">{$article->title}</a></h2>
{$article->introtext|noescape}
</div>
</div>
{/foreach}
</div>
Komponenta článku
namespace FrontComponents\Article;
use Nette\Application\UI\Control,
App\Model\Articles;
class ArticleControl extends Control {
/**
* @var Articles $articles
*/
public $articles;
public function __construct(Articles $articles)
{
$this->articles = $articles;
}
public function render($id)
{
$template = $this->template;
$template->setFile(__DIR__ . '/templates/article.latte');
$template->article = $this->articles->getArticle($id);
$template->render();
}
}
interface IArticleControlFactory
{
/** @return ArticleControl */
function create();
}
<div class="blog-item">
<div class="row">
<div class="col-sm-12 blog-content">
<h2>{$article['title']}</h2>
{$article['introtext']|noescape}
</div>
</div>
</div>
Prosím poraďte mi někdo, jak na to. Díky moc.
Editoval ppar (3. 9. 2016 15:17)
- artemevsin
- Člen | 61
rozepiš podrobněji, čeho chceš dosáhnout. Nějak nevidím důvod slučovat dva presentery do jednoho… Nepotřebuješ spíš nastavit vlastní routy? aby se to navenek tvářilo jako stejný presenter?
- Petr Parolek
- Člen | 455
Jde mi spíš o naučení se práci s komponentami. Nechci mít několik komponent, co dělají podobné věci, ale jednu, která obstará vše.
- Šaman
- Člen | 2666
ppar napsal(a):
Jde mi spíš o naučení se práci s komponentami.
Na to je dobrá přednáka z Poslední soboty.
ppar napsal(a):
Nechci mít několik komponent, co dělají podobné věci, ale jednu, která obstará vše.
Nevím o co přesně ti jde, ale obecně je lepší mít něco rozdělené do více kusů kódu (metod, tříd, komponent), než mít jeden kus co umí vše. Lépe se to pak udržuje a ladí.
- Šaman
- Člen | 2666
ppar napsal(a):
@Šaman takže, jak to mám teď, je to nejlepší řešení?
Podle toho, jak často to budeš používat pohromadě. Pokud často, pak si klidně udělej další komponentu, která ti ty dvě obalí. (Vnořování je stejné jako jejich vytváření v presenteru a je ukázáno v tom videu.)
Ale obecně ano, většinou je lepší mít komponentu na články a jinou na kategorie, i když pracují se stejnými repozitáři. (Můžeš pak obě použít samostatně, třeba detail článku už o kategoriích nepotřebuje vědět.)