olicek/form-selectize nastaveni default value

hancs
Člen | 57
+
0
-

Ahoj,

chtěl bych se zeptat, jak nastavím defaultní hodnotu u selectize, pokud data tahám až při psaní pomocí ajaxu. Nejlépe, kdyby to šlo nastavit přímo někde v addSelectize.

<?php

	$form->addSelectize('zakaznik', 'Zákazník', NULL, [
					'create' => false,
					'mode' => 'select',
					'class' => 'author-selectize'
				])
				->setAjaxURL($this->link('ajaxSelectZakaznik!'));

?>

kód na vytažení dat při psaní:

<?php
	public function handleAjaxSelectZakaznik() {

		$string = $this->getHttpRequest()->getQuery('query');

		$result = $this->EntityManager->createQueryBuilder()
						->select('p.id, p.nazev as name')
						->from(Model\zakaznik::class, 'p')
						->where('p.nazev LIKE :name')
						->setMaxResults(10)
						->setParameter('name', '%' . $string . '%')->getQuery()->getResult();
		$this->getPresenter()->sendJson($result);
	}

?>

Zákazníka, kterého chci dát jako default jsem schopen si před addSelectize vytáhnout.

Předem díky za rady

Oli
Člen | 1215
+
0
-

Ahoj,

$form->addSelectize('zakaznik', 'Zákazník', NULL, [

Místo NULL si tam pošli pole (jakoby jsi nepoužival ajax), ale měj tam jen ty aktuální prvky (ostatní nepotřebuješ). Pokud by jsi tam neměl jen ty defaultní, tak díky tomuhle se ti do šablony pošlou stejně jen ty defaultní, ale budeš je zbytečně tahat z databáze.


Edit:
Plus teda samozřejmě musíš v nějakým $form->setDefaults([]) ty defaultní data specifikovat. Tohle jen udělá to, že se budou mít ty defaultní data na co namapovat :)

Editoval Oli (30. 8. 2016 13:04)

hancs
Člen | 57
+
0
-

Vypadalo to slibně, ale udělal jsem jak popisuješ:

<?php

		$zakaznici = $this->DB->dataForSelectize('zakaznik', $data->zakaznik->id, "nazev");

?>

Tohle mi vrací pole ve formatu [id ⇒ 1, name ⇒ testZakaznik]

<?php

		$form->addSelectize('zakaznik', 'Zákazník', $zakaznici, [
					'create' => false,
					'mode' => 'select',
					'class' => 'author-selectize'
				])
				->setAjaxURL($this->link('ajaxSelectZakaznik!'));



		$form->setDefaults(['zakaznik' => $data->zakaznik->id]);


?>

Ale stále se mi vykreslí jen prázdný input:

<?php
<div class="selectize-control selectize single plugin-remove_button">
	<div class="selectize-input items not-full">
		<input type="text" autocomplete="off" tabindex="" style="width: 4px; opacity: 1; position: relative; left: 0px;">
	</div>
	<div class="selectize-dropdown single selectize plugin-remove_button" style="display: none;">
		<div class="selectize-dropdown-content">
		</div>
	</div>
</div>


?>

Když vyberu prvek z našeptávače přes ajax, tak vypadá input takto:

<?php

<div class="selectize-control selectize single plugin-remove_button">
	<div class="selectize-input items has-options full has-items">
		<div data-value="1" class="item">TEst</div>
			<input type="text" autocomplete="off" tabindex="" style="width: 4px; opacity: 0; position: absolute; left: -10000px;">
	</div>
	<div class="selectize-dropdown single selectize plugin-remove_button" style="display: none; visibility: visible; width: 476px; top: 41px; left: 0px;">
		<div class="selectize-dropdown-content">
			<div data-value="1" data-selectable="" class="option selected">TEst</div>
			<div data-value="95" data-selectable="" class="option">Obec Otěšice</div>
			<div data-value="474" data-selectable="" class="option">Obec Otěšice</div>
		</div>
	</div>
</div>
?>

Nevíš, kde by mohl být zakopaný pes?

Oli
Člen | 1215
+
0
-

Jestli používáš selectize.js, tak možná tady. Testoval jsem to jen se starším javascriptem. Protože jsem na starším projektu potřeboval přidat tu funkcionalitu.

Můžeš si to zkusit hodit do console.log co se ti tam dostane, když zapneš ajax, vypneš, atd. Jestli mě zbude čas, tak se na to navečer kouknu.

Případně se můžeš podívat jaký hodnoty máš tady.
$this->entity je to pole, které předáváš jako 3. parametr
$this->options['valueField'] je IDčko podle kterýho to hledáš
$this->selectizeBack je to co nastavuješ v $form->setDefaults(['zakaznik' => $data->zakaznik->id]);

hancs
Člen | 57
+
0
-

Dostanu se na to až příští týden, pak to všechno zkusím a dám vědět, zatím moc díky.

ivo
Člen | 4
+
0
-

Ahojte,
riešim preste tento problém už niekoľko dní a stále bezvýsledne. Skúšal som všemožné debugovania, ale zdá sa, že problém je niekde v javascripte a javascript zatiaľ ešte veľmi neovládam.
Toto zapracovanie selectize do Nette sa mi veľmi páči, tak by som už nechcel skúšať niečo iné.
Nevyriešili ste to prosím?

Ďakujem

Oli
Člen | 1215
+
0
-

Ahoj @ivo jsem rád, že se ti doplněk líbí. Zkus tenhle pull request: https://github.com/…pull/9/files. Dej sem pak prosím feedback jestli to pomohlo. Neměl jsem čas to sám vyzkoušet. Jestli ti to pomůže, tak to rovnou margenu (když už jste 2 není na co čekat :P)

ivo
Člen | 4
+
0
-

Ahoj Oli,
ďakujem veľmi pekne za reakciu. pull request čiastočne pomohol.
Mám to takto

obsah pola $pole:
{id:6;name:Firma 6}

<?php
$form->addSelectize('dodavatel', 'Dodávateľ', $pole , ['create'=>false,'mode'=>'select'])->setAjaxURL($this->link('vyberDodavatela!'))->setValueField('id');
$form->setDefaults(['dodavatel' => 6]);
?>

zobrazene na stranke:
data-entity=„{id:6;name:Firma 6}“

<div data-value=„6“ class=„item“>6</div>

Teda už to dalo default hodnotu, ale chcel by som dosiahnuť <div data-value=„6“ class=„item“>Firma 6</div>

Čo robím prosím zle? :)

Ďakujem

Editoval ivo (4. 1. 2017 20:48)

Oli
Člen | 1215
+
0
-

Pokud používáš mode select, tak musí tvoje proměnná $pole obsahovat pole hodnot jako pro selectBox. Tzn [id => hodnota]. Takže:

$pole = [6 => 'Firma 6', 7 => 'Firma 7'];
// Pak vybereš tu hodnotu na základě array key
$form->setDefaults(['dodavatel' => 6]);

Koukám, že to v dokumentaci nemám. To musím doplnit :-)

ivo
Člen | 4
+
0
-

Žiaľ, ani takto mi to nefunguje.
Hodnota, ktorú zadám do

<?php
$form->setDefaults(['dodavatel' => 6]);
?>

sa na stránke vždy zobrazí v tvare <div data-value=„6“ class=„item“>6</div> .
Ako keby program (neviem, či to robí javascript alebo php ) nebral do úvahy pole, ale len túto setdefault hodnotu.
V tomto prípade mám nádej, že 6 sa namapuje na to pole.
Ak do setdefault zadám ľubovoľné číslo , alebo text , ktorý sa nemá ako namapovať na pole, tak ho zobrazí rovnako <div data-value=„lubovolnahodnota“ class=„item“>lubovolnahodnota</div>

Čo by ešte mohlo byť problém? :)

Ďakujem

Oli
Člen | 1215
+
0
-

Aha, zkusím to otestovat. Tohle jsem myslel, ze funguje :)

ivo
Člen | 4
+
0
-

Dakujem :)

hancs
Člen | 57
+
0
-

Ahoj, vrátil jsem se k tomu po nějaké době a taky se mi to ještě nepodařilo rozchodit, takže budu taky rád za nějakou radu :-)

vit.peprnicek
Člen | 20
+
0
-

Taky jsem na to narazil, udělal jsem úpravu v selectize.js na řádku 65 a funguje:

options: typeof this.settings.ajaxURL === 'undefined' ? Array.prototype.slice.call(this.element.data('entity')) : null
na
options: Array.prototype.slice.call(this.element.data('entity'))

zároveň je potřeba vložit tu jednu položku třetím parametrem.