Formulář s dependent selectem nevrátí hodnotu
- Desttro
- Člen | 126
Zdravím,
mám problém s formulářem. Postupoval jsem podle tohoto návodu
Nevím proč, ale formulář neveme hodnotu value z předchozího selectu.
Zkoušel jsem do handleFirstChange nastavít přímo místo
setItems(array()) nastavit nějakou proměnnou s polem a po
změně prvního selectu se vyhodilo pole – takle to má být, akorát se
pole má načíst z databáze a ne takhle napevno.
Když zvolím z prvního selectu, tak ajax funguje dobře, v logu Network,
když vyberu BMW tak se objeví:
?do=searchCar-firstChange&value=BMW – to si myslím, že
je správně, ale furt to nevyfiltruje v druhém selectu nepředá pole
z proměnné $modelItems, která tahá z databáze.
Nevím si s tím rady, pomohl by mi někdo prosím? Dám sem svoji komponentu.
Děkuji.
SearchCarControl.php:
use Nette\Application\UI\Control;
use Nette\Application\UI\Form;
class SearchCarControl extends Control
{
/** @var Nette\Database\Context */
private $database;
public function __construct(\Nette\Database\Context $database)
{
parent::__construct();
$this->database = $database;
}
public function render()
{
$template = $this->template;
$template->setFile(__DIR__ . '/SearchCarControl.latte');
// required to enable form access in snippets
$this->template->_form = $this['searchForm'];
$template->render();
}
/**
* Load values to second select
* @param int
*/
public function handleFirstChange($value)
{
if ($value) {
$modelItems = $this->getModel($value);
$this['searchForm']['model']->setPrompt('Nerozhoduje')
->setItems($modelItems);
} else {
$this['searchForm']['model']->setPrompt('Nerozhoduje')
->setItems(array());
}
$this->invalidateControl('searchSnippet');
}
protected function createComponentSearchForm()
{
$firstItems = $this->getManufacturer();
$form = new Form;
$form->addSelect('manufacturer', 'Značka:', $firstItems)
->setPrompt('Nerozhoduje');
$form->addSelect('model')
->setPrompt('Nerozhoduje');
$form->addSubmit('send', 'Vyhledej vozidla dle výběru');
$form->onSuccess[] = $this->processSelectForm;
return $form;
}
/**
* @param form
*/
public function processSelectForm(Form $form)
{
// $form->getValues() ignores invalidated input's values
$values = $form->getHttpData();
unset($values['do']);
unset($values['send']);
//dump($values);
$this->redirect('Catalog:list', $values);
// ...
}
public function getManufacturer() {
$row = $this->database->table('cars')
->select('DISTINCT manufacturer')
->order('manufacturer ASC')
->fetchPairs('manufacturer', 'manufacturer');
return ($row) ? $row : NULL;
}
public function getModel($manufacturer) {
$row = $this->database->table('cars')
->select('DISTINCT model')
->where('manufacturer = ?', $manufacturer)
->order('model ASC')
->fetchPairs('model', 'model');
return ($row) ? $row : NULL;
}
}
SearchCarControl.latte:
<form n:name=searchForm class="views-exposed">
<div class="field field-manufacture">
<label n:name=manufacturer>Výrobce</label>
<select n:name=manufacturer class="selectpicker" data-style="btn">
</select>
</div><!-- /.field -->
<div n:snippet=searchSnippet class="field field-model">
<label n:name=model>Model</label>
<select n:name=model class="selectpicker" data-style="btn">
</select>
</div><!-- /.field -->
<button n:name=send class="btn btn-primary btn-lg btn-block">
Hledat
</button><!-- /.views-exposed -->
</form>
<script>
{include #jsCallback, input => manufacturer, link => firstChange}
</script>
{define #jsCallback}
$('#{$control["searchForm"][$input]->htmlId}').on('change', function() {
$.nette.ajax({
type: 'GET',
url: '{link {$link}!}',
data: {
'value': $(this).val(),
}
});
});
{/define}