Link v modelu

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

Zdravím,

rád bych se zeptal, zda je možné udělat link už v modelu (obdoba $this->link())?

Postupně vybírám z databáze a výsledky různě obaluji tagy li a ul a celek poté postupným přidáváním ukládám do proměnné, kterou předám presenteru a poté šabloně. Proto potřebuji ten link udělat už v modelu.

Díky.

Editoval raketoplan2005 (21. 7. 2009 17:28)

Ondřej Mirtes
Člen | 1536
+
0
-

No, „obalování“ výsledků z databáze tagy bys měl nechat až na šabloně :)

Každopádně, metodu link ve svém modelu si zpřístupníš tak, že ho podědíš od Controlu. Ale opravdu takovéto řešení nedoporučuji.

PetrP
Člen | 587
+
0
-

Ještě je možné zvrácené řešení Environment::getApplication()->getPresenter()->link(...);. Ale je to už za hranicí normality. ;]

jasir
Člen | 746
+
0
-

PetrP napsal(a):

Ještě je možné zvrácené řešení Environment::getApplication()->getPresenter()->link(...);. Ale je to už za hranicí normality. ;]

Když už se rozhodnu, že budu vytvářet linky z modelu, což je samo o sobě „zvláštní“, tak mi toto řešení přijde nejčistší…

raketoplan2005
Člen | 147
+
0
-

Díky všem, musím se zamyslet nad jiným řešením :) Jde o to, že z databáze vytahuji nadpisy článků/rubrik + presenter a akci která se používá. Cílem je vygenerovat mapu stránek. Tady mi právě vyvstává problém s tím, že každý typ položky má jiný presenter a jinou akci.

na1k
Člen | 288
+
0
-

To ti ale nebrání přesunout to „obalování“ až do šablony, ne? Model data dodá (například celou tabulku v nějakém poli) a v šabloně to projdeš, obalíš, upravíš a vykreslíš.

Jaký smysl by potom měly šablony, kdyby v nich bylo jen {$output} :)

Petr Motejlek
Člen | 293
+
0
-

Mě by docela zajímala ta otázka použití modelu jako komponenty. Když teď máme ty super továrničky, tak mě to už párkrát svádělo si udělat model jako extender Controlu, ale pořád se něčeho bojím, takže jsem to reálně nezkoušel. Nemuselo by to být úplně špatné, kdybych například v presenteru, který renderuje např. pohled na detail produktu v e-shopu, použil model toho produktu jako komponentu, co myslíte?

(Jestli jsem teď někoho neskutečně pohoršil nebo ho přivedl do nauseátního stavu, omlouvám se ;))

jasir
Člen | 746
+
0
-

m0t3jl napsal(a):

Mě by docela zajímala ta otázka použití modelu jako komponenty. Když teď máme ty super továrničky, tak mě to už párkrát svádělo si udělat model jako extender Controlu, ale pořád se něčeho bojím, takže jsem to reálně nezkoušel. Nemuselo by to být úplně špatné, kdybych například v presenteru, který renderuje např. pohled na detail produktu v e-shopu, použil model toho produktu jako komponentu, co myslíte?

(Jestli jsem teď někoho neskutečně pohoršil nebo ho přivedl do nauseátního stavu, omlouvám se ;))

Já jsem nad podobnou věcí také přemýšlel, ale co by to přineslo, kromě toho, že by model byl dostupný přes getComponent()? Signály nepřijímá, nevykresluje se se, nepřesměrovává…?

romansklenar
Člen | 655
+
0
-

Dávat model jako Control je blbost. Pokud to chcete udělat pro to, aby byl model součástí komponentového stromu, podědil bych ho od Component.

Občas jsem taky v situaci, kdy bych si potřeboval šáhnout na presenter – například pro jazyk, podle kterého bude model vybírat data.

jasir
Člen | 746
+
0
-

romansklenar napsal(a):

Dávat model jako Control je blbost. Pokud to chcete udělat pro to, aby byl model součástí komponentového stromu, podědil bych ho od Component.

No, to jsem myslel svým příspěvkem. Asi to nebylo zřejmé.

Občas jsem taky v situaci, kdy bych si potřeboval šáhnout na presenter – například pro jazyk, podle kterého bude model vybírat data.

Ale to je dost málo na to udělat model potomkem Component.

Editoval jasir (22. 7. 2009 20:57)

Ondřej Mirtes
Člen | 1536
+
0
-

jasir napsal(a):
Ale to je dost málo na to udělat model potomkem Component.

Výhodu vidím v lazy přístupu, tzn., vytvoří se, až když ho potřebuji.

jasir
Člen | 746
+
0
-

LastHunter napsal(a):

jasir napsal(a):
Ale to je dost málo na to udělat model potomkem Component.

Výhodu vidím v lazy přístupu, tzn., vytvoří se, až když ho potřebuji.

To je pravda, ale to samé vyřeší třeba něco takového:

<?php
public function getModel() {
   static $model;
   if(!$model) {
	$model = new Model;
   }
   return $model;
}
?>

…nebo podobně jedoduché řešení ala továrnička
Ale máš pravdu, tady už nějaké + je.

romansklenar
Člen | 655
+
0
-

jasir: Proč by to mělo být málo?

class Model extends Component implements IModel
{
	...

	/**
	 * @return Presenter
	 */
	public function getPresenter()
	{
		return $this->lookup('Nette\Application\Presenter', TRUE);
	}
}
jasir
Člen | 746
+
0
-

romansklenar napsal(a):

jasir: Proč by to mělo být málo?

class Model extends Component implements IModel
{
	...

	/**
	 * @return Presenter
	 */
	public function getPresenter()
	{
		return $this->lookup('Nette\Application\Presenter', TRUE);
	}
}

Promiň, teď ti nerozumím. Myslel jsem tím, že přidávat model do stromu jen pro možnost získání prezenteru je málo. Můžu přeci použít třeba (zde na fóru tedy nedávno označené za nenormální) Environment::getApplication()->getPresenter(). Ale stejně – má z hlediska návrhu model vědět o prezenteru? Nebo mi něco uniká?

Editoval jasir (22. 7. 2009 22:17)

romansklenar
Člen | 655
+
0
-

To by neměl, máš samozřejmě pravdu.

Ondřej Mirtes
Člen | 1536
+
0
-

BTW: Vzpomínám si, že jsem umisťoval logiku odesílání e-mailu do modelu, takže jsem potřeboval metodu createMyTemplate z Controlu (Model jsem podědil od něj). Je to správné nebo jsem měl e-mail odesílat v souvisejícím Controlu?

Petr Motejlek
Člen | 293
+
0
-

Když jsem psal můj příspěvek, měl jsem v hlavě Component, ale psal jsem Control ;). Mě se na tom právě líbí ten líný přístup (i když je jasné, že ten model u toho presenteru je z toho důvodu, aby se z něj četlo, ale kdo ví ;)). Ta možnost šahat si třeba na jazyk je taky zajímavá (i když zrovna jazyk se dá okoukat i jinde). Schválně to někde zkusím implementovat, jak by se to chovalo.

PetrP
Člen | 587
+
0
-

Ještě další důvod proč sahat z modelu na presenter:
Když mám validaci v modelu, tak potřebuju vyhazovat případně chybové hlášky, tedy Presenter::flashMessage(). Otázka je jestli to neni špatněj návrh.

Ondřej Mirtes
Člen | 1536
+
0
-

PetrP napsal(a):

Ještě další důvod proč sahat z modelu na presenter:
Když mám validaci v modelu, tak potřebuju vyhazovat případně chybové hlášky, tedy Presenter::flashMessage(). Otázka je jestli to neni špatněj návrh.

To řeším tak, že vyhazuji IOException (ale můžeš i jiný typ, hlavně ne obecnou Exception kvůli zachytávání přesměrování) a výše (v Controlu) v catchi házím $e->getMessage() do $form->addErrors().

Jod
Člen | 701
+
0
-

PetrP moje modely vracajú len true a false, podľa čoho presenter vyhodnotí úspešnosť operácie a model môže prípadnu chybu zalogovať.

PetrP
Člen | 587
+
0
-

Jod napsal(a):

PetrP moje modely vracajú len true a false, podľa čoho presenter vyhodnotí úspešnosť operácie a model môže prípadnu chybu zalogovať.

$model->getNecoById($id) vrací taky true? ;] jen žertuju, rozumim ti.

Oba máte pravdu že je to lepší, na většině míst to tak používám. Jen mám pořád koncepční problem s tím jestli vytváření Forms (kvůly validaci, atd) a případné callbacky nepatří do modelu. Ale protože pak mám potřebu komunikovat z presenterem, tak to asi neni ideální. ;/

Ondřej Mirtes
Člen | 1536
+
0
-

PetrP napsal(a):

Jod napsal(a):

PetrP moje modely vracajú len true a false, podľa čoho presenter vyhodnotí úspešnosť operácie a model môže prípadnu chybu zalogovať.

$model->getNecoById($id) vrací taky true? ;] jen žertuju, rozumim ti.

Oba máte pravdu že je to lepší, na většině míst to tak používám. Jen mám pořád koncepční problem s tím jestli vytváření Forms (kvůly validaci, atd) a případné callbacky nepatří do modelu. Ale protože pak mám potřebu komunikovat z presenterem, tak to asi neni ideální. ;/

O formulářích v modelu se uvažuje a David má kvůli tomu přijít do Nette s něčím novým, aspoň takhle jsem to někde na fóru zahlédl.

Jod
Člen | 701
+
0
-

Zatiaľ takú potrebu nemám, ale nedávno ma trochu koplo a spravil som si takzvané definície v modelu, ktoré používali všetky componenty. Niečo ako:

<?php
public $definition = array(
	'name' => array(
		'type' => 'string',
		'visibled' => array('DataGrid', 'AppForm')
		'validation' => array('required'));
?>

Či tak nejak, ale som to zmazal, lebo by s tým bolo vela roboty, to plnohodnotne zapracovať :) . Mne to ako je teraz zatiaľ celkom vyhovuje.
Keď si vezmeš v RoR máš vytváranie formulára v šablone a model len validuje položky, tj. pole ktoré mu pošleš.

Nette zatiaľ nijak nepracuje s modelmi, takže na takéto featury si asi ešte počkáme :) . Ale skôr by som sa modelu pýtal na validáciu, než v modeli vytváral validáciu formulára.
Jedno malé riešenie ma už napadlo, uvidím čo z toho bude :)

amsys
Člen | 20
+
0
-

Se mi tohle zrovna hodilo, sorry šoupnul jsem to do tohodle threadu, jsem narychlo hledal IModel :-) ale to je fuk.

<?php

class ModelLoader extends Object {

    protected $models = array();

    /**
     * Model loader
     * @param string $name Model name
     * @return IModel
     * @throws MemberAccessException
     */
    public function &__get($name)
	{
        if (isset($this->models[$name])) {
            return $this->models[$name];
        } elseif (class_exists($name . 'model')) {
            $r = new ReflectionClass( $name . 'model' );
            if ($r->implementsInterface('IModel')) {
                $this->models[$name] = $r->newInstance();
                unset($r);
                return $this->models[$name];
            }
            throw new MemberAccessException(ucfirst($name) .
                'Model does not implement IModel.');
        }
        throw new MemberAccessException(ucfirst($name) .
            'Model does not exist.');
	}
}

někde ve startup…

$this->model = new ModelLoader;
$this->model->articles->getArticle();

Editoval amsys (26. 10. 2009 7:12)