Dalsia praca so ziskanou hodnotou z DB. Ako na to?
- matmatmat
- Člen | 7
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
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
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
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
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
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
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
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
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}