Zpracování formuláře – formData
- jokas
- Člen | 14
Ahojte,
při zpracovávání formuláře používám již namísto $form->getValues() formData (TestFormData) entitu. Při události na onSuccess vše funguje bez problému, ale v případě změny události na onSubmit dotávám error:
Too few arguments to function Module\Web\WebPresenter::formTestSucceeded(), 1 passed in C:\xampp\htdocs\portal\vendor\nette\utils\src\Utils\SmartObject.php on line 35 and exactly 2 expected
public function formTestSucceeded(Form $form, TestFormData $testFormData):
void
358: {
359: Debugger::barDump($form->values);
360: Debugger::barDump($testFormData);
361: try {…
Je možné, že entita sa nemůže používat s události onSubmit?
Děkuji
- jokas
- Člen | 14
Ahojte,
ještě rozšířím dotaz ohledně zpracovávání formuláře pomocí formData. Při využívaní formData(entita) s události onSuccess, vytvářím i kontejnery. Problém nastává u použití snippetů v kombinací s kontajnerama.
Dostávám chybu po překleslení v handle:
Component with name ‚city‘ does not exist. – jedná se o city
kontejner.
$this->global->formsStack[] = $formContainer = $_form =
end($this->global->formsStack)[„city“];
Tuhle chybu odstráním, když obalím celej form do snippetu a v handle
překreslím jak celej form, tak daný kontejner.
Problém je v tom, že při překreslení celého formuláře přicházím
o již vyplněné hodnoty.
Kód:
public function renderCarrier()
{
$this->template->getLatte()->addProvider('formsStack', [$this['carrierForm']]);
$this->template->getLatte()->addProvider('formsStack', [$this['carrierForm-state']]);
$this->template->getLatte()->addProvider('formsStack', [$this['carrierForm-city']]);
$this->template->getLatte()->addProvider('formsStack', [$this['carrierForm-user']]);
}
$state = $form->addContainer('state');
$state->addSelect('id_state', 'Štát:', $stateItems)
->setRequired();
$city = $form->addContainer('city');
$city->addSelect(CityFormData::ID_CITY, 'Město:', ['' => ''] + $this->selectCities())
->setRequired();
$form->addText(CarrierFormData::FOREIGN_CITY, 'Zahraničí')
->addRule($form::MAX_LENGTH, null, CarrierFormData::FOREIGN_CITY_LENGTH);
public function handleChangeState($id_state): void
{
$form = $this['carrierForm'];
$city = $form['city'];
$city['id_city']->setItems(['' => ''] + $this->selectCities());
if ($id_state == 1) {
$form['foreign_city']->setDisabled(true);
$city['id_city']->setDisabled(false);
} else {
$form['foreign_city']->setDisabled(false);
$form['foreign_city']->setRequired(true);
$city['id_city']->setDisabled(true);
}
if ($this->isAjax()) {
$this->redrawControl('s_city');
$this->redrawControl('s_foreignCity');
}
}
<div class="form-row" n:snippet="s_city">
{formContainer city}
<div class="form-group col-md-12">
<label n:name="id_city">Město</label>
<select n:name="id_city" class="form-control form-control-sm"></select>
</div>
{/formContainer}
</div>
Pointa je, že pro města ČR používám select2 a pro zahraniční města textové pole. Na základě státu (selectBox) skrývám a odkrývam div a zárověň nastavuji povinnost polí.
Při použití události onSubmit funguje zpracování, ale vypadne mi
formData.
Nějaký nápad v čem dělám chybu, že kontejner city po
překreslení nezná?
Děkuji