Ajaxové zpracování formu, který obsahuje dependent select

Jarek92
Člen | 91
+
0
-

Ahoj,

mám formulář, který se zpracovává pomocí ajaxu. Toto řešení používám prakticky pořád a vždy mi fungovalo. Teď jsem však tvořil form, který funguje tak, že když zadám do textového pole rok narození a v radio boxu označím pohlaví, tak se mi na základě těchto hodnot zavolá handle, který vybere dostupné kategorie a ty pak vloží do select boxu a tento select překreslí. To funguje bez problémů. Nicméně když pak dokončím vyplnění formu a odešlu ho, tak si sice zavolá ajax (metoda pro zpracování formu), nicméně už se mi bohužel nepřekreslí snippet, který obaluje celý form (viz. zdrojový kod). Stalo se už někomu něco podobného?

Šablona formuláře (komponenta RaceRegistrationForm)

{snippetArea area}
{snippet raceRegistrationForm}
<form n:name="raceRegistrationForm" role="form" class="ajax">
    <div role="alert" class="alert alert-danger fade in" n:foreach="$form->ownErrors as $error">
        <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
        {$error}
    </div>
    <div class="form-group">
        <label>Příjmení: *</label>
        <input n:name="surname" class="form-control" id="surname" type="text">
        <span id="icon-surname"></span>
        <span id="surname-error" class="error-field-text hidden">Zadejte prosím Vaše příjmení.</span>
    </div>
    <div class="form-group">
        <label>Jméno: *</label>
        <input n:name="name" class="form-control" id="name" type="text">
        <span id="icon-name"></span>
        <span id="name-error" class="error-field-text hidden">Zadejte prosím Vaše jméno.</span>
    </div>
    <div class="form-group">
        <label>Rok narození: *</label>
        <input n:name="year" class="form-control" id="year" type="text">
        <span id="icon-year"></span>
        <span id="year-error" class="error-field-text hidden">Zadejte prosím Váš reálný rok narození ({$ageInterval['min']} - {$ageInterval['max']}).</span>
    </div>
    <div class="form-group">
        <label>Pohlaví: *</label><br />
        {foreach $form[gender]->items as $key => $label}
            <div class="radio">
                <input type="radio" n:name="gender:$key" id="{$key}" value="{$key}">
                <label n:name="gender:$key" for="{$key}">
                    {$label}
                </label>
            </div>
        {/foreach}
    </div>
    <div class="form-group spinnering">
        {snippet categories}
        <label>Kategorie: *</label>
        <select class="form-control" n:name="categories"></select>
        <span class="warning-field-text">Vyplňte prosím správně rok narození a pohlaví, aby Vám systém mohl nabídnout dostupné kategorie.</span>
        {/snippet}
    </div>
    <div class="form-group">
        <label>Oddíl (obec):</label>
        <input n:name="club" class="form-control" type="text">
    </div>
    <div class="form-group">
        <label>Email:</label>
        <input n:name="email" class="form-control" id="email" type="text">
        <span id="icon-email"></span>
        <span id="email-error" class="warning-field-text hidden">Zadejte prosím email ve správném formátu.</span>
        <span class="help-block">
            Pokud zadáte Váš email, obratem Vám pošleme potvrzení o registraci,
            po skončení závodu pak do Vaší emailové schránky dostanete kompletní výsledky jako první!
        </span>
    </div>
    <div class="form-group">
        <input type="submit" n:name="send" class="btn btn-lg btn-block btn-success" value="Registrovat" />
    </div>
    <div n:foreach="$flashes as $flash" role="alert" class="alert {$flash->type} fade in">
        <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
        {$flash->message}
    </div>
</form>
{/snippet}
{/snippetArea}

metoda, která se zavolá ajaxově při změně radio boxu pohlaví nebo změně hodnoty roku narození:

	public function handleUpdateCategories() {
    try {
        $data = $this->httpRequest->getPost();
        $raceId = (int) $data["raceId"];
        $year = (int) $data["year"];
        $gender = $data["gender"];
        if($year < $this->ageInterval["min"] || $year > $this->ageInterval["max"]) {
            throw new \CompetitionsNotFoundException;
        }
        $competitions = $this->competitionRepository->findAvailables($raceId, $year, $gender);
        $this["raceRegistrationForm"]["categories"]->setPrompt(self::SUCCESS_CATEGORY_PROMPT);
        $this["raceRegistrationForm"]["categories"]->setItems($this->getCompetitons($competitions));
        $defaultCompetitionId = $this->getDefaultCompetition($competitions, $year);
        if($defaultCompetitionId) {
            $this["raceRegistrationForm"]["categories"]->setValue($defaultCompetitionId);
        }
    } catch (\CompetitionsNotFoundException $ex) {
        $this["raceRegistrationForm"]["categories"]->setPrompt(self::BAD_CATEGORY_PROMPT);
        $this["raceRegistrationForm"]["categories"]->setItems([]);
    } finally {
        $this->redrawControl("area");
        $this->redrawControl("categories");
    }
}

metoda pro zpracování formu:

	public function processForm(Form $form) {
    $values = $form->getValues();
    // doit
    $this->flashMessage("Vaše registrace na závod proběhla úspěšně. Děkujeme!", "alert-success");
    $form->setValues(["raceId" => $values->raceId], true);
    if($this->getPresenter()->isAjax()) {
        $this->redrawControl("area");
        $this->redrawControl("raceRegistrationForm");

    }
}