Sloučení dvou komponent do jedné

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

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)

Felix
Nette Core | 1247
+
0
-

Zkusil jsi mit hlavni komponentu a v ni tyhle 2? Komponenty muzes libovolne zanorovat. I Presenter je vlastne komponenta.

Petr Parolek
Člen | 455
+
0
-

jak se zanořují komponenty?

artemevsin
Člen | 61
+
0
-

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

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

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í.

Petr Parolek
Člen | 455
+
0
-

@Šaman takže, jak to mám teď, je to nejlepší řešení?

Šaman
Člen | 2666
+
+1
-

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.)