olicek/form-selectize nastaveni default value
- hancs
- Člen | 57
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
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
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
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]);
- ivo
- Člen | 4
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
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
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
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
Ž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
- vit.peprnicek
- Člen | 20
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.