(MVC?) Korektne rozdelenie modelu [PHP][MUSTACHE]

Programovacie jazyky, rady, poradňa...
G0lDiER_
King
King
Používateľov profilový obrázok
Príspevky: 1948
Registrovaný: 16 máj 2007, 16:09
Bydlisko: Topolcany
Kontaktovať používateľa:

(MVC?) Korektne rozdelenie modelu [PHP][MUSTACHE]

Príspevok od používateľa G0lDiER_ »

Nazdar, mam trosku dilemu a chcem vediet aky je korektny postup.

Mam php skript (controller) ktory nacitava a spracuva data. Ide konkretne o hotely s detailami, medzi ktorymi je aj hodnotenie hotelu (hviezdicky). Hodnotenie je v ciselnom tvare s krokom 0.5, tzn napr 2, alebo 5, alebo 3.5...

Na vystupe tuto informaciu potrebujem zobrazit v obrazkovom tvare. Napr hodnotenie 2.5 by generovalo taketo html:

Kód: Vybrať všetko

<img src="/img/icon-star.png" alt="*">
<img src="/img/icon-star.png" alt="*">
<img src="/img/icon-star2.png" alt="+">
Tzn. 2 obrazky icon-star.png (cela hviezdicka) a jeden obrazok icon-star2 - (polovicna hviezdicka (.5) )

Z hladiska MVC modelu si myslim, ze by controller mal do sablony (view modelu) posielat tento udaj v surovom tvare - ako float (napr 2.5) a view model by sa mal postarat o vyrenderovanie tohto udaju do tvaru aky potrebujem v tomto pohlade - obrazkoveho.

Tento problem som riesel pomocou FILTERS v mustache, no nepaci sa mi, ze definicia obrazkov hviezdiciek sa nachadza v .php subore (controller.php), kdezto by sa mala nachadzat v template, kedze sa priamo tyka dizajnu / interpretacie.

rating.mustache:

Kód: Vybrať všetko

{{% FILTERS }}
{{{ rating | img_rating }}}
controller.php:

Kód: Vybrať všetko

$m = new Mustache_Engine();
$m->addHelper('img_rating', function($rating) {
	$output = str_repeat('<img src="/img/icon-sun.png" alt="*">', floor($rating));

	if ($rating > floor($rating)) {
		$output .= '<img src="/img/icon-sun2.png" alt="+">';
	}
	return $output;
});
$data = array(
	'rating' = 2.5,
);
echo $m->render('rating', $data);
Toto riesenie je funkcne, zaujma ma iba ci neexistuje vhodnejsie / elegantnejsie / korektnejsie riesenie.
Dufam, ze pisem zrozumitelne. Dakujem.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: (MVC?) Korektne rozdelenie modelu [PHP][MUSTACHE]

Príspevok od používateľa audiotrack »

neviem aké sú možnosti toho frameworku mustache lebo s ním nerobím, ale ak je toto čo si písal v controlleri tak to určite nie je dobre. Ten helper by mal byť samostatne a volaný by mal byť z pohladu. Či to je php alebo nejaký iný typ súboru nehrá podstatnú rolu

druhá možnosť by bola spraviť statický pohlad, v ktorom budeš hviezdičky vykreslovať javascriptom. Tú hodnotu pošleš k príslušnému hotelu (neviem ako to máš organizované, zrejme nejaký div) ako nejaký data parameter javascript vykreslí všetky hodnotenia naraz

obe riešenia majú výhody aj nevýhody, treba si vybrať čo je pre teba výhodnejšie
G0lDiER_
King
King
Používateľov profilový obrázok
Príspevky: 1948
Registrovaný: 16 máj 2007, 16:09
Bydlisko: Topolcany
Kontaktovať používateľa:

Re: (MVC?) Korektne rozdelenie modelu [PHP][MUSTACHE]

Príspevok od používateľa G0lDiER_ »

Ten helper mam v skutocnosti vysunuty v subore helpers.php a z controlleru ho mam includnuty, to som prredtym nepovedal. V tom pripade by to bol spravny postup?

Napada mi este trochu odlisne risenie:

helpers.php:

Kód: Vybrať všetko

$img_rating = function($rating) {
	$output = array();
	for ($i = 0; $i < floor($rating); $i++) {
		$output[]['full'] = true; 
	}
	if ($rating > floor($rating)) {
		$output[]['half'] = true;
	}
	return $output;
}
rating.mustache:

Kód: Vybrať všetko

{{% FILTERS }}
{{# rating | ck.img_rating }}
	{{# full}}
		<img src="/img/icon-sun.png" alt="*">
	{{/ full}}
	
	{{# half}}
		<img src="/img/icon-sun2.png" alt="+">
	{{/ half}}
{{/ rating}}
Toto znamena, ze sablona dostane premennu "rating" v ciselnom tvare, posle tuto premennu ako parameter do helperu img_rating, ten vrati takyto nejaky array:

Kód: Vybrať všetko

array(
	[0] => array('full' => true),
	[1] => array('full' => true),
	[2] => array('half' => true),
)
mustache prechadza tento array a ak je definovany index 'full', vypise obsah bloku {{# full }} ... {{/ full }},
ak je definovany index 'half', vypise obsah bloku {{# half }} ... {{/ half }}

Toto riesenie sa mi tiez nezda uplne idealne, no je citatelnejsie, vsetko sa nachadza v template, len ten array ma skaredu strukturu, no v kombinacii s musache mi nenapada ine riesenie.

Javascript v tomto pripade nepripada do uvahy..
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: (MVC?) Korektne rozdelenie modelu [PHP][MUSTACHE]

Príspevok od používateľa audiotrack »

toto je isto lepšie ako prvý variant. Ak ti ide iba o to pole, nemusí byť dvojrozmerné. Stačí mať true ak je celá, false ak polovičná. To pole ti predsa vracia iba hviezdy ktoré sú aspoň polovičné, a tie prázdne tam nemáš, tak dva stavy ti bohate stačia a nepotrebuješ to rozlišovať indexom.

ten helper includnutý do controlleru.. záleží akú logiku si stanovíš, ale obecne sa helper používa na pomocné funkcie pre view. Pomocné funkcie pre controller bývajú v componentoch.
G0lDiER_
King
King
Používateľov profilový obrázok
Príspevky: 1948
Registrovaný: 16 máj 2007, 16:09
Bydlisko: Topolcany
Kontaktovať používateľa:

Re: (MVC?) Korektne rozdelenie modelu [PHP][MUSTACHE]

Príspevok od používateľa G0lDiER_ »

Mas pravdu, stacia mi dva stavy, to mi nenapadlo. Je to elegantnejsie, no trochu menej citatelny template:

Kód: Vybrať všetko

{{% FILTERS }}
{{# rating | ck.img_rating }}
	{{# .}}
		<img src="/img/icon-sun.png" alt="*" title="*">
	{{/ .}}
	
	{{^ .}}
		<img src="/img/icon-sun2.png" alt="+" title="+">
	{{/ .}}
{{/ rating}}
{{ . }} v mustache znamena aktualny prvok pola, nieco ako "this".
^ je negacia

Volanie na renderovanie view je spravne v controlleri, vsak?
Funkciu / helper mam teda definovany v subore helpers.php:

Kód: Vybrať všetko

$helpers = array();
$helpers['nejaky_helper'] = function() { .. };
controller.php:

Kód: Vybrať všetko

include 'include/helpers.php';

$mustache_objekt = new Mustache_Engine();
$mustache_objekt->addHelper('nejaky_helper', $helpers['nejaky_helper']);
//autoeditácia príspevku (17 Jan 2015, 13:17)
Pomaly prichadzam na to, ze mustache asi nebude na moje ucely vhodny. Je to "logicless template, co mi asi robi problem. Ked mam mat jednotny model pre viacero views, tak mam v template problem interpretovat tieto data bez "logiky". helpery to sice mozu vyriesit, no zacinam vytvarat velmi skarede helpery, vdaka ktorym to zase stracia elegantnost.

mam nespravny pristup k tejto tematike, alebo sa mam pozriet po nejakom frameworku/template systeme s viac moznostami?

dakujem

//autoeditácia príspevku (17 Jan 2015, 13:37)
zamienam si pojem view a template...
Napísať odpoveď