Formulářový prvek AdSelect a návratová hodnota

gizer
Člen | 67
+
0
-

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 | 736
+
0
-

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 ;).

gizer
Člen | 67
+
0
-

Děkuji moc za odpověď pane m.brecher. Nechápu ale stále, proč getSelectedItem() nevrací hodnotu, když by měl. Jinak totiž Tracy žádnou chybu implementace nehlásí a ta metoda musí být zpracována.

Nemůžete prosím přidat ten funkční zápis kódu, když Vám to funguje? Děkuji moc.

m.brecher
Generous Backer | 736
+
0
-

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)

gizer
Člen | 67
+
0
-

Ano funguje, děkuji opravdu moc. Pokud tu metodu getSelectedItem() zavolám v ovladači události nebo callback metodě, tak už to opravdu funguje :-)

Každopádně ještě jednou moc děkuji za vyřešení problému.