problem se ziskanim hodnoty ze slecetBoxu

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

Ahoj mam problem pri ziskvani hodnoty ze selectboxu pri editaci zaznamu

use Nette\Application\UI\Form;

class ZiskyFormFactory
{
    public $presenter;

    public function newForm($opt)
    {
        $presenter = $opt['presenter'];
        $this->presenter = $presenter;

        $form = new MyForm();

        $form->getElementPrototype()->novalidate("novalidate");

        $form->addText('datumPrijeti', 'Datum přijetí:', array())
                ->setRequired('Zvolte datum přijetí.');

        $form->addSelect('dodavatel', 'Dodavatel:', $presenter->keyValPairDodavatele())
                ->setRequired('Zvolte prosím "Dodavatele".')
                ->setAttribute('class', 'chsn_noSearch')
                ->setPrompt(' -- ');

        $form->addSubmit('loadCislaFaktur', 'Nahrát čísla faktur')
                ->setAttribute('class', 'btn btn-small btn-info')
                ->setValidationScope(NULL)
                ->onClick[] = callback($this, 'loadCislaFaktur');

        $form->addSelect('cisloFaktury', 'Faktura:')
                ->setAttribute('class', 'chsn_noSearch input-xlarge')
                ->setPrompt(' Zvolte dodavatele ');

        $form->addText('jineZdanenePrijmyBezDph', 'Jiné zdaněné příjmy bez DPH:')
            ->setAttribute('placeholder','Zadejte hodnotu')
            ->setAttribute('class', 'input-small numbersOnly');

        $form->addText('prijmyBezFa', 'Přijmy bez faktury:')
            ->setAttribute('placeholder','Zadejte hodnotu')
            ->setAttribute('class', 'input-small numbersOnly')
                ->addConditionOn($form['cisloFaktury'], ~Form::FILLED)
                ->addConditionOn($form['jineZdanenePrijmyBezDph'], ~Form::FILLED)
                ->addRule($form::FILLED, 'Zvolte "fakturu" nebo vyplňte "jiné zdaněné příjmy" nebo "příjmy bez FA"');

        $form->addText('naklady', 'Náklady od subdodavatelů:')
            ->setAttribute('placeholder','Zadejte hodnotu')
            ->setAttribute('class', 'input-small numbersOnly');

        $form->addTextArea('poznamka', 'Poznámka:');


        $form->addSubmit('ulozit', 'Uložit')
                ->setAttribute('class', 'btn btn-small btn-success');

        $form->addSubmit('storno', 'Storno')
                ->setAttribute('class', 'btn btn-small')
                ->setValidationScope(NULL)
                ->onClick[] = callback($this, 'newFormStorno');

        $form->addSubmit('zpet', 'Zpět')
                ->setAttribute('class', 'btn btn-small btn-inverse')
                ->setValidationScope(NULL)
                ->onClick[] = callback($this, 'newFormZpet');


        $form->addProtection('Vypršel časový limit, odešlete formulář znovu');

        $form->onSuccess[] = callback($this, 'newFormSubmitted');
        // $form->onSubmit[] = array($this, "newFormSubmitted");

        return $form;
    }

	public function newFormSubmitted(MyForm $form)
    {
        $presenter = $form->getPresenter();
        $id = 0;
        if($presenter->getParam('id'))
        {
            list($typ, $id) = explode('-', $presenter->getParam('id'));
        }

        if ($form["ulozit"]->isSubmittedBy())
        {
            $vals = $form->values;
print_r($vals);
            $cisloFaktury = ($vals->cisloFaktury>0)?$vals->cisloFaktury:-1;
            $datumPrijeti = new DateTime;
            $datumPrijeti = $datumPrijeti->createFromFormat('d.m. Y', $vals->datumPrijeti)->format('Y-m-d');

            $fData = array('sqlData'=>array('datumPrijeti'=>$datumPrijeti,
                        'idDodavatel'=> $vals->dodavatel,
                        'faktury_id'=> $cisloFaktury,
                        'jineZdanenePrijmyBezDph'=> $vals->jineZdanenePrijmyBezDph,
                        'prijmyBezFa'=> $vals->prijmyBezFa,
                        'naklady'=> $vals->naklady,
                        'poznamka'=> $vals->poznamka));

            if($id>0)
            {
                $fData['id'] = $id;
                $fData['typ'] = $typ;
                $presenter->ZiskyRepository->updateZisk($fData);

                $presenter->flashMessage('Zisk byl úspěšně upraven.', 'info');
                $presenter->restoreRequest($presenter->backlink);
            }else
            {
                $presenter->ZiskyRepository->addZisk($fData);

                $presenter->flashMessage('Zisk byl úspěšně přidán.', 'info');
            }

            $presenter->redirect('default');
        }
    }

class

ZiskyPresenter extends InPresenter
{
    public $ZiskyFormFactory;
    public $ZiskyRepository;
    public $ZiskyService;

    /** @persistent */
    public $backlink = '';

    function inject(ZiskyFormFactory $ZiskyFormFactory,
                    ZiskyRepository $ZiskyRepository,
                    ZiskyService $ZiskyService)
    {
        $this->ZiskyFormFactory = $ZiskyFormFactory;

        $this->ZiskyRepository = $ZiskyRepository;

        $this->ZiskyService = $ZiskyService;
    }

function actionEdit($id='')
    {
        list($typ, $id) = explode('-', $id);

        $form = $this['newForm'];
        if(!$form->isSubmitted())
        {
            $fData = array('typ'=>$typ,
                            'id'=>(int) $id);
            $info = $this->ZiskyRepository->info($fData);

            if($info)
            {
                $datum = new DateTime($info['datumPrijeti']);
                $form['datumPrijeti']->setDefaultValue($datum->format('d.m. Y'));
                $form['dodavatel']->setDefaultValue($info['idDodavatel']);

                if($typ=='fa')
                {
                    $fData = array('idDodavatel'=>$info['idDodavatel'],
                                    'typ'=>'withId',
                                    'idFaktury'=>$info['faktury_id']);

                    $form['cisloFaktury']->setItems($this->ZiskyService->seznamNeuhrazenychFaktur($fData))
                        ->setPrompt(' -- ');

                    $form['cisloFaktury']->setDefaultValue($info['faktury_id']);
                }else
                {
                    $fData = array('idDodavatel'=>$info['idDodavatel']);

                    $form['cisloFaktury']->setItems($this->ZiskyService->seznamNeuhrazenychFaktur($fData))
                        ->setPrompt(' -- ');

                    if($info['jineZdanenePrijmyBezDph']>0)
                        $form['jineZdanenePrijmyBezDph']->setDefaultValue($info['jineZdanenePrijmyBezDph']);

                    if($info['prijmyBezFa']>0)
                        $form['prijmyBezFa']->setDefaultValue($info['prijmyBezFa']);
                }

                if($info['naklady']>0)
                    $form['naklady']->setDefaultValue($info['naklady']);

                $form['poznamka']->setDefaultValue($info['poznamka']);
            }
        }
    }

kdyz ukladam novou polozkuu tak se prenesou vsechny hodnoty.
pokud ale prijdu k editaci polozky tak se mi preda vsechno krome hodnoty z $form->addSelect(‚cisloFaktury‘, ‚Faktura:‘)

vosy
Člen | 532
+
0
-

prijde mi ze to je tim ze v actionEdit

$form['cisloFaktury']->setItems($this->ZiskyService->seznamNeuhrazenychFaktur($fData))
                        ->setPrompt(' -- ');

protoze kdyz toto dam primo do tovarnicky

$form->addSelect('cisloFaktury', 'Faktura:', $this->ZiskyService->seznamNeuhrazenychFaktur($fData))
                ->setAttribute('class', 'chsn_noSearch input-xlarge')
                ->setPrompt(' Zvolte dodavatele ');

tak to frci ale ja to nechci mit v tovarnicce

David Matějka
Moderator | 6445
+
0
-

nemuzes overovat if(!$form->isSubmitted()).. ty polozky se totiz museji znovu nastavit i pri zpracovavani formulare – nette podle toho kontroluje, jestli odeslana hodnota je v seznamu tech povolenych polozek

vosy
Člen | 532
+
0
-

kdyz tam nedam tu podminku a odeslu formular ktery nebude mit vyplnene pozadovane polozky tak se znova nactou puvodni data. :(

enumag
Člen | 2118
+
0
-

V době volání isSubmitted si formulář vytáhne odeslaná data a spáruje je s inputy ve formuláři. Problém je že tvůj select v tu chvíli ještě nemá hodnoty ⇒ odeslaná hodnota se neshoduje s žádnou v $items protože tehdy je $items ještě prázdné pole takže ji to zahodí.

Tzn. jediný co musíš je volat to setItems dříve než isSubmitted. Na ničem dalším (myslím) nezáleží.

A mimochodem volat setItems v továrně je mnohem čistší.

Editoval enumag (1. 10. 2013 0:01)

vosy
Člen | 532
+
0
-

je to peklo.
kdyz v select boxu dodavatel zmenim dodavatele tak ze zavola

$(document).on('change', '#frmnewForm-dodavatel', function() {
    $.nette.ajax({
        type: 'GET',
        url: '/zisky/edit/fa-52?backlink=54t8p&do=dodavatelChange',
        data: {
            'value': $(this).val(),
        },
        complete: function()
        {
            myChzn.setup();
        },
    });
});

postup akci je takovyto:
actionEdit
createComponentNewForm
newForm
handleDodavatelChange

ale az v handleDodavatelChange zjistim hodnotu idDodavatele a vytvorim novy seznam faktur:

function handleDodavatelChange($value)
    {
echo 'handleDodavatelChange</br>';

        $fData = array('idDodavatel'=>$value);
        $this['newForm']['dodavatel']->setValue($value);

        $this->selectedDodavatel = $value;
        $this['newForm']['cisloFaktury']->setItems($this->ZiskyService->seznamNeuhrazenychFaktur($fData))
                        ->setPrompt(' -- ');

        $this->invalidateControl('cisloFakturySnippet');
    }

takze zase setItems mam mimo tovarnicku.
novy seznam faktur se zobrazi, ale kdyz dam submit tak id zvolene faktury = 0 :(

enumag
Člen | 2118
+
0
-

Všimni si jak to setItems duplikuješ na několika místech – zcela jasný argument proč to má být v té továrně.

vosy
Člen | 532
+
0
-

mno ano rad bych to dle tvych argumentu dal do tovarny ale kdyz „handleDodavatelChange“ se vola az po tovarne Formulare a opet az v „handleDodavatelChange“ ziskam hodnotu dodavatele.
Nebo se pletu?

delal jsem to dle:
https://blog.nette.org/…-and-pure-js

Editoval vosy (1. 10. 2013 12:49)

enumag
Člen | 2118
+
0
-

Aha, máš pravdu. Už sice chápu co potřebuješ ale z hlavy to nevymyslím a bohužel nemám čas to zkoušet.

vosy
Člen | 532
+
0
-

ahaaaa takze asi problem je ze bych asi mel pouzit

$vals = $form->getHttpData();

misto

$vals = $form->values;
vosy
Člen | 532
+
0
-

tak predavani hodnot asi uz vyresene ale mam dalsi problem:
mam takoveto podminky ve formulari

$form->addSelect('cisloFaktury', 'Faktura:')
                ->setAttribute('class', 'chsn_noSearch input-xlarge')
                ->setPrompt(' Zvolte dodavatele ');

        $form->addText('jineZdanenePrijmyBezDph', 'Jiné zdaněné příjmy bez DPH:')
            ->setAttribute('placeholder','Zadejte hodnotu')
            ->setAttribute('class', 'input-small numbersOnly');

        $form->addText('prijmyBezFa', 'Přijmy bez faktury:')
            ->setAttribute('placeholder','Zadejte hodnotu')
            ->setAttribute('class', 'input-small numbersOnly')
                ->addConditionOn($form['cisloFaktury'], ~Form::FILLED)
                ->addConditionOn($form['jineZdanenePrijmyBezDph'], ~Form::FILLED)
                ->addRule($form::FILLED, 'Zvolte "fakturu" nebo vyplňte "jiné zdaněné příjmy" nebo "příjmy bez FA"');

problem je ze kdyz pomoci ajaxu nactu selectbox „cisloFaktury“ a zvolim na nem nejakou hodnotu
tak mi řve tato podminka

->addConditionOn($form['cisloFaktury'], ~Form::FILLED)
vosy
Člen | 532
+
0
-

aha tak vyreseno asi:
misto

->addConditionOn($form['cisloFaktury'], ~Form::FILLED)

pouzit

->addConditionOn($form['cisloFaktury'], ~$form::FILLED)