Dalsia praca so ziskanou hodnotou z DB. Ako na to?

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

Som uplny zaciatocnik co sa tyka Nette a OOP.

Mam model:

	public function vypisSeznamTovaru()
	{
		return dibi::select('*')->from($this->table);
	}

presenter:

final class SeznamTovaruPresenter extends BasePresenter {
	public function renderShow() {
		$seznamTovaru = new SeznamTovaru;
		$this->template->seznamTovaru = $seznamTovaru->vypisSeznamTovaru();
	}
}

no a vo view mam nieco taketo:

{foreach $seznamTovaru as $seznamTovarus}
<tr>
	<td>{$seznamTovarus->nazev_tovaru}</td>
	<td>{$seznamTovarus->na_predpis}</td>
	<td>{$seznamTovarus->id_dodavatele}</td>
</tr>
{/foreach}

No a moze mi niekto poradit, ako (bez pouzitia nejakeho JOINu viacerych tabuliek) pracovat dalej s tou premennou „id_dodavatele“ napriklad v tom presenteri? napriklad by som chcel k tomu id pridat nejaky string alebo zistit nazov toho dodavatela z inej tabulky a potom to nejak vypisat vo view… neviem na to prist vobec..ako? Vdaka.

Jan Endel
Člen | 1016
+
0
-

Takže:

  • tohle moc na nette foru nepatri, od toho jsou treba Tyhle fóra
  • v modelu vracíš resource a asi chceš object (dopiš za from ještě ->fetch()
  • míchání slovenštiny a angličtiny (Tovarus) je fujík :-)
  • a pokud chceš pracovat s objektem musíš ten objekt načíst a ne jen ho natvrdo vypisovat čili něco na způsob:
$seznamTovaru = new SeznamTovaru;
$seznamTovaru = $seznamtovaru->vypisSeznamTovaru();
$this->template->seznamTovaru = $seznamTovaru;
// zde už existuje promena $seznamTovaru->id_dodavatele se kterou si můžeš dělat co chceš

poznámka není to příliš elegantní, ale je to nejjednodušší, ideálně by se celý ten objekt měl načítat už v modelu za pomocí konstruktoru.

matmatmat
Člen | 7
+
0
-

no fajn, to je mi jasne, ale ako potom sformulovat ten template? takto, ked je tam foreach, tak je fajn ze tam to fetch() neni, a pracuje s tym ako s nejakym polom (zoznamom?).
ale do hlavy mi proste nejde ako napisat tomu template aby vypisoval vsetky riadky tabulky ale v tom jednom stlpci (id_dodavatela) nevypisoval to id, ale uz tu novy premennu prejdenu cez (napr.) fciu getNazovDodavatela($id)…
najlepsie keby si mi to nazorne napisal na tom mojom priklade hore :P moc by si mi pomohol

matmatmat
Člen | 7
+
0
-

V skratke este raz moja otazka:

mam v DB v tabulke stlpec „id_dodavatela“ a chcel by som na konci v sablone vypisovat "id_dodavatela"*10

teda to id by som nasobil 10nou, alebo hocicim inym (napriklad nejakou premennou, alebo to prehnat nejakou funkciou spracujIdDodavatele($id_dodavatele)
ako by v tom mojom pripade, co som pisal uplne hore, vypadal model/presenter/view …

Editoval matmatmat (10. 10. 2010 15:30)

westrem
Člen | 398
+
0
-

A co ti brani napisat toto:

{$seznamTovarus->id_dodavatele * 10}
// pripadne
{= $seznamTovarus->id_dodavatele * 10}
matmatmat
Člen | 7
+
0
-

a ako to bude s tou fciou cez ktoru id_dodavatela prezeniem? to uz priamo v template neurobis nie? rad by som to spravil v presenteri, a v template uz len vypisal konecnu premennu

westrem
Člen | 398
+
0
-

Tak trochu nechapem, kde vidis problem, asi len myslienkovy blok co ako a kde spravit.

Predsa ked si vytiahnes tie veci z DB, nemusis ich hned priradovat do premennej v template, daj si ich do pola, a potom pomocou jedneho foreach-u preiteruj pole, porob co potrebujes a az potom prirad do template.

A inac ide to aj v template:

{= yourFunction($seznamTovarus->id_dodavatele)}
matmatmat
Člen | 7
+
0
-

asi mam zle myslienkove pochody ale aj tak mi to neda a chcem sa to naucit. takze:

model:

	public function vypisSeznamTovaru()
	{

		return dibi::select('*')->from($this->table)->fetch();
	}

presenter:

	public function renderShow() { // prva fcia co sa pusti (praca s pohladom)

		$seznamTovaru = new SeznamTovaru;
		$seznamTovaru = $seznamTovaru->vypisSeznamTovaru();
		// ??? ako upravim tuto napriklad id_dodavatela na nieco ine, tym ze ho spracujem?
		// a ako potom povodnu tabulku ale s novym, spracovanym id_dodavatela posuniem dalej do template? prosim o celu konstrukciu, teda aj foreach, ak ma byt nejaky aj tu, v presenteri


	}

template:

{foreach $seznamTovaru as $seznam}
<tr>
	<td>{$seznam->nazev_tovaru}</td>
	<td>{$seznam->dodavatel}</td>   <---- toto bude to nahradene, o co mi ide
	<td>{$seznam->popis}</td>



</tr>
{/foreach}
westrem
Člen | 398
+
0
-

No v prvom rade chces asi spracovat vsetky zaznamy, nie len jeden takze si oprav fetch() na fetchAll().

Dalej, nenapisal si co presne chces robit s danou hodnotou preto

1. ak chces vykonavat nejaku zmenu priamo na hodnote tak:

public function renderShow() {

        $seznamTovaru = new SeznamTovaru;
        $seznamTovaru = $seznamTovaru->vypisSeznamTovaru();
	foreach ($seznamTovaru as $tovar) {
		$tovar['id_dodavatela'] = someFunction($tovar['id_dodavatela']);
	}
	$this->template->seznamTovaru = $seznamTovaru;
}

2. mozno si len domyslam, ale ak chces namiesto id_dodavatela vypisat jeho meno (podla toho co pises v template) a mas dodavatelov v nejakej DB tabulke tak to musis upravit SQL.
Predpokladajme preto, ze mas nejak takto tabulky:

Tovary

id
id_dodavatela
..

a

Dodavatelia

id
meno
..

Tak vysledna metoda v modeli bude:

public function vypisSeznamTovaru()
{

        return dibi::query("
	SELECT
		t.*,
		d.meno AS dodavatel
	FROM
		Tovary AS t
	INNER JOIN Dodavatelia as d ON (
		t.id_dodavatela = d.id
	)
	")->fetchAll();
}

Co ti vrati objekt, kde budes mat pod premennou dodavatel meno dodavatela.

No dufam, ze najdes odpoved na tvoju otazku :)

matmatmat
Člen | 7
+
0
-

Super , toto mi uz pomohlo, ale aj tak jedna otazka neni zodpovedana pre mna:P ked mas ten prezenter takto:

public function renderShow() {
        $seznamTovaru = new SeznamTovaru;
        $seznamTovaru = $seznamTovaru->vypisSeznamTovaru();
        foreach ($seznamTovaru as $tovar) {
                $tovar['id_dodavatela'] = someFunction($tovar['id_dodavatela']);
        }
        $this->template->seznamTovaru = $seznamTovaru;
}

akym inym sposobom ulozim someFunction($tovar['id_dodavatela']) do premennej, aby mi zostalo aj povodne v $tovar['id_dodavatela'] a toto nove aby som tiez vedel pouzit, ked budem prechadzat foreach-om template.
alebo si mozem vymyslet novu premennu, napriklad $tovar['novy_dodavatel'] , aj ked taky stlpec v tabulke neni?

westrem
Člen | 398
+
0
-

Ano kludne mozes pouzit novy key na oznacenie novej hodnoty, primarne (pokial nespecifikujes) sa totiz vracia DibiRow object, ktory je robeny tak, ze donho mozes nacpat co chces.

Takze ten cyklus mozes napisat takto:

// v renderShow
foreach ($seznamTovaru as $tovar) {
	$tovar['nejaky_novy_kluc'] = someFunction($tovar['id_dodavatela']);
}
// v sablone potom
{$seznam->nejaky_novy_kluc}
westrem
Člen | 398
+
0
-

PS: na zvyraznovnie kodu pouzivaj tuto syntax:
zaciatok bloku /--php a koniec bloku \--

Teda pokial pojde o nejake PHP pripadne sablony.

matmatmat
Člen | 7
+
0
-

Vdaka, uz to frci, toto je cele co som potreboval vysvetlit, tak dik aspon tebe :P