Autocomplete, invalidateControl

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
basovnik
Člen | 23
+
0
-

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}