Formulářový prvek AdSelect a návratová hodnota
- gizer
- Člen | 67
Dobrý den,
zkouším použití formulářového prvku AdSelect. Dle dokumentace vrací klíč vybrané položky, nebo null. Rád bych získal přímo zadanou hodnotu. Mám to stručně zapsáno následovně.
//Presenter
$form->addSelect('company', 'Firma:',$this->searchBranchManager->getPreselectionCompany())
->getSelectedItem();
V modelu selektuji distinktivně firmu z databáze jako předvolbu. Toto bez problému funguje a zobrazuje duplicitní hodnoty v databázi jako jednu položku.
//Model
public function getPreselectionCompany() {
return $this->database->fetchPairs('SELECT DISTINCT company FROM branchclients');
}
V presenteru chci zadanou hodnotu zapisovat do StdClass $values jako hodnoty. Proto jsem použil metodu ->getSelectedItem(), která by měla vrátit místo klíčů hodnoty. Problém, je v tom, že to celé stále vrací pouze klíče vybraných hodnot a ne vybrané hodnoty.
Kde může být problém? Děkuji moc za případnou radu.
- m.brecher
- Generous Backer | 873
Ahoj,
Metodu ->getSelectedItem() jsem zkoušel a mě vrací správně hodnotu, nikoliv klíč! Máš ji asi nesprávně použitou – asi není úplně nejlepší nápad přidat prvek metodou ->addSelect() a ihned na něm volat ->getSelectedItem(). Zkus oddělit build formuláře (přidání prvků) od získávání dat do různých fází zpracování formuláře. Metodu ->getSelectedItem() dej do ovladače události formuláře např. onSubmit a mělo by to fungovat ;).
- m.brecher
- Generous Backer | 873
Pokud Vám při psaní kódu aplikace něco nefunguje, je nejlepší si to vytrasovat v Nette třeba pomocí funkce dump(), bdump().
Zkuste třeba tohle: kód v presenteru, Váš formulář jsem nazval companyForm:
public function createComponentCompanyForm() // factory pro tvorbu formuláře
{
$form = new Nette\Application\UI\Form;
....... přidávání prvků formuláře
$selectItems = $this->searchBranchManager->getPreselectionCompany();
dump($selectItems);
// Váš prvek select, tady v něm ještě nejsou data od uživatele !!
$form->addSelect('company', 'Firma:', $selectItems);
......
$form->onSuccess[] = [$this, 'handleCompanyFormSuccess'];
return $form;
}
.......
// ovladač události onSuccess, tady už formulář data uživatele má
public function handleCompanyFormSuccess(Nette\Application\UI\Form $form)
{
$values = $form->getValues(); // načte data z formuláře
dump($values);
$selectedKey = $values->company; // takhle získáme key
dump($selectedKey);
$selectElement = $form['company']; // tohle je objekt formulářového prvku select
dump($selectElement);
$selectedValue = $selectElement-> ->getSelectedItem(); // takhle získáme value
dump($selectedValue);
......
}
Důležité je si uvědomit, že dokud factory která provádí $form = new Nette\Application\UI\Form sestavený formulář neodešle return $form tak ve formuláři nejsou žádná data od uživatele. Nette naplní formulář daty až po vytvoření a sestavení formuláře. Proto s daty formuláře lze pracovat jedině v událostech formuláře pomocí ovladačů událostí – já jsem tam použil ovladač onSuccess[].
Editoval m.brecher (3. 10. 2021 11:32)