Autocomplete – volání až po zadání

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

Zdravím a prosím o radu,

používám našeptávač – autocomplete a rád bych jej v tomto případě upravil tak, aby začal tahat data (zavolala getAddress()) az při zadání. Nejsou to data z mojí databáze, ale z API, kde si nemůžu stáhnout rovnou všechny položky.

Jak toto řešit, prosím?

protected function createComponentForm() {
	$form = $this->formFactory->create();
	$form->addSelect('address', 'Adresa:', $this->getPresenter()->getAddress())
		->setRequired('Zvolte položku')
                ->setPrompt('')
                ->setHtmlId('combobox');
	$form->addSubmit("s", "Hledej");
	$form->onSuccess[] = function (Form $form) {
	    $this->processForm($form, $form->getValues(TRUE));
	};
	return $form;
    }

a presenter

public function getAddress($string) {

	$formData = json_decode(file_get_contents($this->apiUrl . 'Adresy/Hledani?q=' . $string . '', false, $this->getContextForRequest()), false);

	foreach ($formData as $fd) {
	    foreach($fd as $val) {
		$formDataFinal[$fd->kod] = $fd->formatovanaAdresa;
	    }
	}

	return $formDataFinal;
    }
chap
Člen | 81
+
0
-

Nastavením delay, případně minLength nestačí? Pak možno přidat button a onclick zobrazit ten autocomplete? … To přesně nevím jak, ale asi něco ve stylu inicializace autocomplete on button click, pritom mu nastavit focus … a autocomplete ma moznost zobrazeni pri tomto eventu http://stackoverflow.com/a/4132099

MW
Člen | 626
+
0
-

Momentálně mam toto, ale to funguje, když mu podstrčím všechna data najednou, což teď nějde.. jedná se o tahání dat z API.

Takže by mělo stačit jen upravit ten source a ještě něco ? Omlouvám se, ale s JS trochu bojuju :)

Nevím jak to správně propojit s tím $this->getPresenter()->getAddress()) a podstrčit mu nějaký string..

Četl jsem tady o Nextras/TypeAhead ale nenašel jsem bohužel jediný příklad.

Díky!

Editoval MW (19. 3. 2016 9:59)

MW
Člen | 626
+
0
-

Snažím se s tím hnout.
Našeptávač se objeví, když mu jako data dam nějaky var přímo ve scriptu. Vše mě vrací to co ma, ale JS si nějak nebere ty data pokud jsou z handlu.. nebo je mám ve špatném formátu?

Kde může být problém prosím.. nebo na to jdu blbě? Moc díky!

Latte:

<script>
    $(function () {

	$("#inputTest").autocomplete({
	    source: "http://localhost/ikonis/cuzk/?do=getAddress",
	    minLength: 3,
	    delay: 1000,
	    autoFocus: true,
	});
    });
</script>


<div class="ui-widget">
	<label for="inputTest">Test: </label>
	<input id="inputTest">
</div>

Handle v presenteru:

public function handleGetAddress() {

	$string = $this->getParameter('term');

	If ($string) {
	    $formData = json_decode(file_get_contents($this->apiUrl . 'Adrs/Data?q=' . urlencode($string) . '', false, $this->getContextForRequest()), false);

	    $data = array();
	    foreach ($formData as $fd) {
		foreach ($fd as $val) {
		    array_push($data, $fd->adresa);
		}
	    }
	    return $data;
	}
    }

Handle vrací:

array(10) (
  [0] => (string) Mostecká 20, Litvínov - Horní Litvínov, 436 01
  [1] => (string) Mostecká 20, Litvínov - Horní Litvínov, 436 01
  [2] => (string) Mostecká 20, Mariánské Radčice, 435 32
  [3] => (string) Mostecká 20, Mariánské Radčice, 435 32
  [4] => (string) Mostecká 80/20, Horní Jiřetín, 435 43
  [5] => (string) Mostecká 80/20, Horní Jiřetín, 435 43
  [6] => (string) Mostecká 45/20, Praha - Malá Strana, 118 00
  [7] => (string) Mostecká 45/20, Praha - Malá Strana, 118 00
  [8] => (string) Mostecká 2098/20, Teplice, 415 01
  [9] => (string) Mostecká 2098/20, Teplice, 415 01
)\--
Šaman
Člen | 2666
+
+3
-

Neměl by ten handle vracet JSON?

MW
Člen | 626
+
0
-

I ten jsem zkoušel.. i když to proženu přes json_encode jakoby se to do javascriptu nedostalo…
Není problém v tom, že je to handle, který nic nevykresli?

CZechBoY
Člen | 3608
+
+2
-

Ja pokud nic neinvaliduju tak posilam

$this->sendJson($nejakyData);
MW
Člen | 626
+
0
-

To je ono.. moc díky !!!!!

Mimochodem, kdybych chtěl vrátit jen pole, jak to odešlu?

Díky!

Editoval MW (21. 3. 2016 20:41)