Jak na tvorbu komponent a k čemu vlastně komponenty v nette slouží?

Roman Halaxa
Člen | 60
+
0
-

Zdravím,

Předem se omlouvám za svůj amatérismus, s Nette (a vlastně i PHP) pracuji pouhý měsíc.

Potřebuji vytvořit komponentu tabulky (stavěnou na ublaboo gridu), která bude základem pro všechny další tabulky. Jedná se o tabulky které budou mít své kontrolní prvky, jako tlačítko na přidání, editaci, filtrování, atd… Komponentu vytvořit umím, ale mám vzato že taková komponenta by měla být znovupoužitelná součást aplikace. Vlastně mi je celá problematika komponent docela neznámá a všechny zdroje co jsem o neťáckých komponentách objevil docela matoucí.

Tímto nežádám o řešení daného problému, který vlastně sám neumím specifikovat, natož ho vyřešit. Žádám vás pouze o odkaz na nějaké zdroje, které by mi mohli pomoci při dalším učení se o komponentách a jak je vlastně správně tvořit. Jak je vlastně členit, best practises apod. Vše o komponentách z dokumentace i kuchařky jsem přečetl, ale není mi to stále jasné. Komponenty co jsem používal v jiných jazycích (např. c#) byli prostě objekty, které se do jakékoliv aplikace jednoduše včlenili bylo li potřeba takové funkcionality (aktuální příklad je tabulka pro správu nad nějakými daty, jejich editace, přidávání defacto nových řádků do databáze a jejich upráva…).

Zkrátka se potřebuji od něčeho odpíchnout. Po několika dnech čtení o komponentách mi příjde že prostě nechápu ani jejich základní podstatu v nette. Ani nevím jestli se jí snažím vytvořit na něco u čeho to dává smysl. Předem děkuji za odpovědi.

Phalanx
Člen | 310
+
+3
-

S Nette je to jako s ženou – nejdřív na ni čumíš jako vyjevený a nevíš co máš dělat, ale postupem času najdeš ty správné body, které ti pomůžou se dostat k cíli rychleji :)

Komponentu ber jako zapouzdření nějaké funkčnosti. Nejčastěji komponenty používám, pokud potřebuju vytvořit nějakou funkčnost, která bude na více místech, ale bude mít jiné parametry a jiné výstupy. Například – chceš vypsat na homepage seznam nejnovějších článků – jednou v pravém sloupci s obrázky a pak ještě v patičce (jen titulky).

<?php
class HomepagePresenter extends Presenter
{
    /** @var ILastArticlesFactory @autowire */
    public $iLastArticlesFactory;

    // ve view {control lastArticlesSidebar}
    public function createComponentLastArticlesSidebar()
    {
        $control = $this->iLastArticlesFactory->create();
        $control->setLayout('sidebar');
        return $control;
    }

    // ve view {control lastArticlesFooter}
    public function createComponentLastArticlesFooter()
    {
        $control = $this->iLastArticlesFactory->create();
        $control->setLayout('footer');
        return $control;
    }
}

// pak mám například v app/UI/Controls komponenty (můžeš si je dát jinam)
interface ILastArticlesFactory extends Control
{

	/** @return LastArticles */
	function create();
}

final class LastArticles extends Control
{
	/** @var Articles */
	private $articles;

    private $layout;

	public function __construct(
		Articles $articles
	) {
		$this->articles = $articles;
	}


    // getLayout, setLayout

	// render metoda s getLayout();
}
?>

Dalším typickým použitím pro komponenty jsou formuláře. Ten samý formulář můžeš mít na několika místech v aplikaci a můžeš ho trochu pozměňovat. Celková funkčnost zůstává v komponentě.

ublaboo/datagrid tvořím pouze v aktuálním presenteru. Už z něj komponentu nevytvářím, protože ho použiju jenom na jednom místě. Samozřejmě ti nic nebrání si z něho vytvořit svoji komponentu.

<?php
use Ublaboo\DataGrid\DataGrid;

class SimplePresenter extends BasePresenter
{

	public function createComponentSimpleGrid($name)
	{
		$grid = new DataGrid($this, $name);

		$grid->setDataSource($this->db->select('*')->from('ublaboo_example'));
		$grid->addColumnText('name', 'Name');
	}

}
?>

Mrkni na:
http://jecas.cz/…e-komponenty
https://doc.nette.org/…s/form-reuse
https://www.youtube.com/watch?…

Roman Halaxa
Člen | 60
+
0
-

@Phalanx Děkuji ti za odpověď. Alespoň to v mém mozku cvaklo zase o zub dál :)

Momentálně začínám od znova… Nic jiného než pokus omyl mi asi teď v začátcích nezbývá. Nette je pěkně tajemná mrcha :)

GEpic
Člen | 562
+
+1
-

Hele ono se to má tak, že na to prostě přijdeš sám. Já ze začátku všechno cpal do presenterů, ale časem mě samotného začalo štvát, že jeden formulář chci použít i jinde (znovupoužitelnost, jak psal @Phalanx) a musím kopírovat celý kód znova na jiné místo. Pak začneš přemýšlet, co by se dalo udělat pro to, aby to stačilo napsat jen jednou – KOMPONENTY. Poté ale zjistíš, že se formulář na obou místech v něčem liší – jeden slouží pro tvorbu, druhý pro editaci, další bude mít políčko navíc. Pak začneš přemýšlet, jak by se dalo docílit toho, abys neměl ve svém kódu zbytečné if / else kraviny a podobně a dojdeš k dalšímu bodu – DĚDIČNOST. No a tak tahle pohádka jde dál – prostě budeš trénovat své abstraktní myšlení postupem času, pokud teď něco nutně nepochopíš, tak to pochopíš v bodě, kdy to budeš potřebovat :).

Editoval GEpic (15. 8. 2018 11:16)

Roman Halaxa
Člen | 60
+
0
-

Ahoj @GEpic . Děkuji ti za komentář. Věc se má tak že jsem nastoupil do práce a byl jsem tak trochu vyhozen uprostřed širého moře :) Jako tady máš SQL server, tady máš PHP, tady máš NetBeansy, tady máš nette, hoď si k tomu doctrinu a tenhle datagrid, udělej tam přihlášení a takovouhle databázi no a uč se :) SQL a PHP základy jsem měl ale celá MVC architektura je pro mě docela nová. Stejně tak ORM a práce aplikace s databází. Hold na střední se toho opravdu moc nedozvíš. Tak se hold přizpůsobuji, tak po týdnu jsem si napsal authentikátor, dále tak nějak udělal model a autorizaci, no a teď řeším práci s tímhle modelem :) Jelikož je to reálná aplikace (ačkoliv jednoduchá), bude se reálně ve firmě používat a tak mi nezbývá než už od začátku hledat ty správné (pokud možno co nejlepší) postupy. Na komponentách jsem momentálně zamrzl :) Učení jde pomalu… Nejsou pořádně k nalezení zdroje. Takže takhle :)

CZechBoY
Člen | 3608
+
+1
-

A co ti třeba chybí v dokumentaci? https://doc.nette.org/…n/components

GEpic
Člen | 562
+
0
-

@RomanHalaxa hele ono pokud začínáš takhle se vším, nejen s Nette, je dobré si občas zkusit něco napsat v čistém PHP, naučit se OOP, ať se ti pak nepletou ryze čisté PHP způsoby s featurami v Nette. Klidně mi napiš PM, pokud budeš s něčím drobným potřebovat pomoct, rád ti pomůžu, neúčtuju si nic.

Editoval GEpic (15. 8. 2018 20:30)

chemix
Nette Core | 1296
+
+1
-

Doporucuju video od Honzy Tvrdika o komponentach. Zminoval jsem ho v newsletteru https://www.nette.pro/…azine-3-2018

Roman Halaxa
Člen | 60
+
0
-

@GEpic Moc díky za rady a nabídku. Kdyžtak se ozvu :)

@CZechBoY Jelikož jsem zastánce toho že by komponenta měla být opravdu univerzální a obrazně řečeno by měla jít „Drag & Dropnout“ do jakéhokoliv projektu bez komplikací, chybí mi třeba vysvětlení jak jí opravdu odstínit od presenterů. (Už jsem to našel jinde). Samozřejmě moje (ne)znalost PHP má taky velký podíl na tom proč s tím tolik zápasím. Dneska už jsem se docela posunul směrem k dobrému univerzálnímu a čistému řešení :) Je to jak řekl Phalanx. Po dostatečně dlouhém čumění už začínám nacházet ty správné body.

Roman Halaxa
Člen | 60
+
0
-

@chemix Děkuji ti za příspěvek.