Autocomplete, invalidateControl
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- basovnik
- Člen | 23
Ahoj, mám takový problém. Chci udělat našeptávač u vyhledávače, ale nechci používat ani payload, ani suggestInput. Mám toho už dost hotové, ale nedaří se mi docílit toho, aby se mi komponenta překreslila pomocí invalidateControl(). Stahují se mi do pole $data neustále všechny položky z databáze. Buď nějak nefunguje perzistence nebo nějak nefunguje něco jiného. Jinak ajax mám zprovozněný, protože ajaxové flashMessages mi fungují správně (invaliduji je v BasePresenteru). Poradil by mi někdo?
Searcher.php
<?php
namespace Components;
use Nette\Application\UI\Control;
use Nette\Application\UI\Form;
use dibi;
class Searcher extends Control
{
/** @persistent */
private $keyword = "";
protected function createComponentSearcher($name)
{
$form = new Form($this, $name);
$form->getElementPrototype()->class('ajax');
$form->addText('keyword', 'Klíčové slovo')
->setAttribute('placeholder', 'Zadejte text...')
->getControlPrototype()
->onkeyup("$(this).closest('form').ajaxSubmit();");
$form->addSubmit('send', 'Hledat');
$form->onSuccess[] = array($this, 'formSent');
return $form;
}
public function formSent($form)
{
if ($this->getPresenter()->isAjax())
{
$this->getPresenter()->flashMessage('ajax');
$formValues = $form->getValues();
$this->keyword = $formValues['keyword'];
$this->invalidateControl();
}
else {
$this->getPresenter()->flashMessage('klasik');
}
}
public function render()
{
$template = $this->template;
$template->searcher = $this['searcher'];
$template->setFile(dirname(__FILE__) . '/Searcher.latte');
$result = dibi::query('SELECT DISTINCT [title] FROM [films] WHERE [title] LIKE %s ORDER BY [title]', '%'.$this->keyword.'%');
$data = array();
foreach ($result as $n => $row) {
$data[] = $row['title'];
}
$template->data = $data;
$template->render();
}
}
?>
Searcher.latte
{control searcher begin}
{control searcher errors}
{!$searcher['keyword']->control}
{!$searcher['send']->control}
<script type="text/javascript">
$("#frmsearcher-keyword").autocomplete({$data});
</script>
{control searcher end}