problem se ziskanim hodnoty ze slecetBoxu
- vosy
- Člen | 532
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
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
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
- enumag
- Člen | 2118
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
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 :(
- vosy
- Člen | 532
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)
- vosy
- Člen | 532
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)