Pole hodnot checkboxlist všechny firmy
- Nevinho
- Člen | 77
nette 2.0.6, php 5.3
Zdravím, už dlouho si lámu hlavu s jednou maličkostí a nemůžu přijít jak na to. Mám továrničku, a potřebuju do checkboxlistu nějak narvat možnost zaškrtnout všechny firmy.
<?php
protected function createComponentFiltrForm()
{
$firmaPairs = $this->firmy->findAll()->fetchPairs('ID', 'nazev_firmy');
$form = new appForm();
$form->addGroup('Firmy:');
$form->addCheckboxList('firmy', '',$firmaPairs);
//$form->addMultiSelect('firmy', 'Firmy:',array($firmaPairs,0=>'Všechny firmy'));
$form->addSubmit('show', 'Zobrazit');
$form->onSuccess[] = $this->FiltrFormSubmitted;
return $form;
}
?>
První řádek s addCheckBoxlist mi vypíše všechny firmy, pokoušel jsem to vyřešit zakomentovaným řádkem pod tím, ale to vypíše zese jen možnost „všechny firmy“.
Poradí někdo jak to udělat aby se vypsali všechny firmy, plus možnost vybrat všechny firmy?
Dík
- jiri.pudil
- Nette Blogger | 1032
Přidat tu možnost do pole:
$firmaPairs[0] = "Všechny firmy";
Nebo to, co je v tom zakomentovaném řádku, přepsat takhle:
..., 'Firmy:' , array_merge(array(0 => "Všechny firmy"), $firmaPairs));
- Nevinho
- Člen | 77
Díky moc, funguje :-).
Ještě jsem se chtěl zeptat, mám vytvořený formulář kde vybírám v prvním kroku firmu, a potom druh informací které chci vypsat, a nevím si nějak rady s ošetřením, když je zadána např: Firmy – Microsoft, Data: financni_informace abych zobrazil ty finanční informace použe pro vybranou firmu?
<?php
protected function createComponentFiltrForm()
{
$firmaPairs = $this->firmy->findAll()->fetchPairs('ID', 'nazev_firmy');
$firmaPairs[0] = 'Všechny firmy';
$form = new appForm();
$form->addGroup('Firmy:');
//$moznosti=array(0=> 'Všechny firmy',1=>$firmaPairs[1],2=>$firmaPairs[2], 3=>$firmaPairs[3], 4=>$firmaPairs[4], 5=>$firmaPairs[5]);
$form->addCheckboxList('firmy', '',$firmaPairs );
$form->addGroup('Typ dat:');
$items = array(1 => 'Finanční ukazatele', 2 => 'Výrobní informace', 3 => 'Fakturační informace', 4 => 'Osoby', 5 => 'Vztahy', 6 => 'Adresy',7 => 'Kontakty', 8 => 'Aktivity');
$form->addCheckboxList('data', '', $items);
$form->setDefaults(array('data' => array(1))); // defaultně budou nastaveny finanční informace
$form->addSubmit('show', 'Zobrazit');
$form->onSuccess[] = $this->FiltrFormSubmitted;
return $form;
}
?>
dík moc
- Nevinho
- Člen | 77
Poradí prosím někdo jak na to? Už se nad tím trápím 2 dny a nemůžu přijít na to že když si v checkboxlistu zatrhnu firmu a v selectu data ( např firma Microsoft, data financni_informace) aby když zmáčku tlačítko, tak aby se zobrazily data z tabulky financni_informace pouze pro firmu Microsoft s id 1.
Díky moc za rady
- enumag
- Člen | 2118
Nejsem si jistý, zda jsem správně pochopil problém, ale zdá se mi, že je to závislé až na zpracování dat z formuláře, ne na jeho definici.
EDIT: Obojí jsou chackboxlisty takže z formuláře dostaneš ID (1 nebo více) firmy a index (1 nebo více) jaká data potřebuješ. Jak si to nakombinuješ a jaké SQL dotazy z toho poskládáš už je čistě na tobě.
EDIT2: Přesněji na metodě $this->FiltrFormSubmitted.
Editoval enumag (19. 11. 2012 10:52)
- Nevinho
- Člen | 77
Tomu rozumím, ale potřeboval bych trošku nakopnout, ukázat trošku kód, jak by to mělo vypadat.
Trošku jsem změnil formulář, a místo jednoho checkboxu jsem dal selectbox.
Zde je kód:
<?php
protected function createComponentFiltrForm()
{
$firmaPairs = $this->firmy->findAll()->fetchPairs('ID', 'nazev_firmy');
$firmaPairs[0]='Všechny firmy';
$form = new appForm();
$form->addGroup('Firmy:');
$form->addCheckboxList('firmy', '',$firmaPairs );
$form->setDefaults(array('firmy' => array(0)));
$form->addGroup('Typ dat:');
$items = array(1 => 'Finanční ukazatele', 2 => 'Výrobní informace', 3 => 'Fakturační informace', 4 => 'Osoby', 5 => 'Vztahy', 6 => 'Adresy',7 => 'Kontakty', 8 => 'Aktivity');
$form->addSelect('tabulky', 'Data',$items)
->setPrompt('-Vyberte data-');
$form->addSubmit('show', 'Zobrazit');
//$form->onClick[] = callback($this, 'filtrForm_show_click');
$form->onSuccess[] = $this->FiltrFormSubmitted;
return $form;
}
?>
Nevím si rady jak napsat tu metodu FiltrFormSubmitted aby i to vypisovalo třeba všechny řádky z tabulky finanční informace, viz příklad výše.
- enumag
- Člen | 2118
Na to se těžko odpovídá když nevím jaký používáš model a databázovou vrstvu. :-D Ani nevím jestli každý typ dat představuje jeden sloupec v tabulce firem nebo je za tím nějaká složitější logika.
Jestli ve formuláři jsou checboxlisty nebo selecty je víceméně jedno. Spíš ukaž jak ten fomulář poté zpracováváš (metodu FiltrFormSubmitted). Pokud tu metodu vůbec nemáš tak řekni něco o svém modelu. :-)
- ViPEr*CZ*
- Člen | 817
Nevinho napsal(a):
nette 2.0.6, php 5.3
Zdravím, už dlouho si lámu hlavu s jednou maličkostí a nemůžu přijít jak na to. Mám továrničku, a potřebuju do checkboxlistu nějak narvat možnost zaškrtnout všechny firmy.
S jednou… proč mám pocit, že tu programujeme celou aplikaci :-) A co
neznalost js z jiného vlákna… to je velká maličkost :-)
Jinak je to prosté… když chci všechno… použiju něco jako fetchAll(); a
pokud chci aby se používalo vše… jednoduše udělám jeden checkbox
s labelem „Použít všechny firmy“.
To je asi nejjednodušší na práci, takovýto výsledek… pokud to chceš
mít nějak vymakaně… budeš muset přemýšlet… a používat nějaký
pluginy do jQuery například pro nějaký multiselecty.
Editoval ViPEr*CZ* (19. 11. 2012 11:09)
- Nevinho
- Člen | 77
No právěže tu metodu FiltrFormSubmitted neumím nějak navrhnout :-(.
Obsah modelu:
UzivatelRepository
Financni_informaceRepository(id, id_firmy, zakladni_kapital, aktiva,
zisk…)
FirmyRepository(id, nazev_firmy)
používám klasicky Nette/Database
Potřebuju když třeba je zašrtlé v checkboxlistu např: firma Microsoft(v tabulce financni_informace id=1) a např data Financni_informace( představuje v selectboxu id 1) tak abych zobrazil pouze data k firmě microsoft.
- enumag
- Člen | 2118
Jo já vlastně neřekl ještě jednu důležitou věc. :-D
public function filterFormSubmitted($form) //používáme camel case a angličtinu
{
$values = $form->getValues();
//tady si dumpni $values->firmy a $values->tabulky abys věděl co tam je
//případně nějak uprav
//a vlož do perzistentních parametrů
}
Ty perzistentní parametry pak použiješ v metodě renderNěco pro vytažení těch správných dat a předání šabloně. Šablona se pak podívá jaká data má k dispozici a podle toho je vypíše.
Anebo předáš do šablony ty perzistentní parametry a model. Data si pak vytáhneš v šabloně až když jsou potřeba.
EDIT: Tím mám na mysli že v té metodě filterFormSubmitted ty data ještě z databáze tahat nepotřebuješ. Potřebuješ si pouze poznamenat jaká data a vytáhnout je až později. Filtrování obecně vlastně znamená že se změnily požadavky jaká data vykreslit při výpisu což znamenaná že se změnil stav komponenty (presenteru) ⇒ perzistentní parametry.
Ono ti to teď možná nedává smysl a připadá ti to nějaké podivně složité. Věř mi, že důvody časem pochopíš a zjistíš, že je to vlastně úplně jednoduchá věc. ;-)
Editoval enumag (19. 11. 2012 11:24)
- ViPEr*CZ*
- Člen | 817
Nevinho napsal(a):
No právěže tu metodu FiltrFormSubmitted neumím nějak navrhnout :-(.
Jak se odesílají formuláře je v dokumentaci. FiltrFormSubmitted je jen jméno metody, které je potřeba nastavit formuláři jako callback. Najdeš to i v sandboxu.
Obsah modelu:
UzivatelRepository
Financni_informaceRepository(id, id_firmy, zakladni_kapital, aktiva, zisk…)
FirmyRepository(id, nazev_firmy)používám klasicky Nette/Database
Potřebuju když třeba je zašrtlé v checkboxlistu např: firma Microsoft(v tabulce financni_informace id=1) a např data Financni_informace( představuje v selectboxu id 1) tak abych zobrazil pouze data k firmě microsoft.
No furt nechápu … jestli neumíš udělat checkbox nebo jestli neumíš při odeslání formu zjistit jakej checkbox (potažmo jakou má value) zjistit nebo jestli neumíš jen do DB položit dotaz, aby jsi vyhledal data (řádek) s ID = 1 ???
Editoval ViPEr*CZ* (19. 11. 2012 11:45)
- tatyalien
- Člen | 239
Tak si výsledek projeď foreach a u true hodnoty si přeulož jeho idčko do pole a ve výsledku filtruj podle vytvořeného pole.
Píšu z hlavy:
$values = $form->getValues();
if(!$values['firmy']) {
// filtr na vše
} else {
$firmy = Array();
foreach($values['firmy'] as $val) {
if($val) {
$firmy[] = $val;
}
}
if(!empty($firmy)){
$rows = $this->model->getTable()->select('xy')->where('id', $firmy);
}
}
Editoval tatyalien (19. 11. 2012 12:43)
- Nevinho
- Člen | 77
dala by se použít i metoda kterou mám uloženou v Repository, ze které
dědí všechny modely?
To by mělo vracet řádek na základě id nebo ne? Ale nevím jak ten dotaz
propojit s tím formulářem a jednotlivýma položkama tak aby kdyz zaskrtnu
firmu a data, tak aby to vrátilo příslušný řádek.
<?php
public function findBy($id)
{
return $this->getTable()->where($id);
}
?>
Editoval Nevinho (19. 11. 2012 12:33)
- ViPEr*CZ*
- Člen | 817
Nevinho napsal(a):
tak jak vidíš nahoře, tak checkbox vytvořit umím, tady jde o tom, že nevím jak říct metodě filtrFormSubmitted, aby vypsala jen ty data z databáze na základě těch zaškrtnutých checkboxů a vybraných položek ze selectu.
Nijak… tadle metoda nic vypisovat ani nemá!!! Tato metoda se má postarat
o odeslaná data z formuláře, data spracovat (třeba uložit). Metoda pro
vykreslení pak má data vzít a podle nich sestavit výstup k uživateli.
Tolik teorie.
Spracování dat si můžeš například uložit do URL… viz:
public function filterFormSubmitted($form) //používáme camel case a angličtinu
{
$values = $form->getValues();
//tady si dumpni $values->firmy a $values->tabulky abys věděl co tam je
//případně nějak uprav
//a vlož do perzistentních parametrů
}