Ajaxizace Nette – dynamické snippety – prosím o pomoc
- ragulin
- Člen | 58
Ahoj,
Mám problém s ajaxizací mojí tabulky. Problém je ten, že k tabulce
mám vytvořené nějaké filtry a vyhledávání.
Nejdříve jsem zkoušel plugin datatables
https://datatables.net/
Ale kdykoliv jsem kliknul na tlačítko v tabulce, zrušili se veškerá data
v naklikaná v pluginu, protože pracuje pouze s HTML. Pak jsem zkoušel
jejich AJAX řešení, nějakým způsobem posílat data přes JSON do handlu
když se přepíše snippet, ale nedal jsem to dohromady, složitý paskvil.
Přešel jsem tedy na plugin list.js
https://listjs.com/
Sort jsem si napsal sám přes handly.
Nyní zkouším, jak zapojit ajax tlačítka do celého řešení.
Pokusím se sepsat kód tak, jak je, jakožto vzor, abych sem nevypisoval úplně vše, bylo by to hodně složité.
tabulka.latte
<div class="live-search-wrapper">
<div class="input-group-sm mb-3>
<input class="form-control search ajax" id="search-field" placeholder="Hledat">
</div>
</div>
{snippet tableTable}
<div class="pre-scrollable" id="table">
<table class="table" id="dataTable">
<thead class="thead-light">
<tr>
<th><a {if $orderByAttr =='p.id' && $orderByDirection == 'DESC'} href="{link changeOrderBy!, 'p.id', ASC'}"
{else}
href="{link changeOrderBy!, 'p.id', 'DESC'}"{/if} class="ajax">
{if $orderByAttr != 'p.id'}
<span class="fa fa-sort"> ID:</span>
{else}
<span n:class="fas, $orderByAttr == 'p.id' && $orderByDirection == 'ASC' ? fa-sort-up : fa-sort-down">ID:</span>
{/if}
</a>
</th>
<!--Dejme tomu, že takových sloupců zde máme více-->
<th>Ajax tlač.:</th>
<th>Ajax tlač1.:</th>
</tr>
</thead>
<tbody class="list">
{foreach $items as $item}
<tr n:class="$item["conditionOne"] == 1 ? bg-success">
<td class="align-middle id">{$item['id']}</td>
<td class="align-middle">
{snippet $item->id}
{if $item['conditionTwo'] == null && $userRole == "user"}
<a class="btn btn-primary btn-sm ajax" n:href="do! '1', $item->id">Do</a>
{else}
<a class="btn btn-success btn-sm disabled">Done</a>
{/if}
{/snippet}
</td>
<td class="align-middle">
{snippet $item->id}
{if $item['conditionThree'] == null && $userRole == "user"}
<a class="btn btn-primary btn-sm ajax" n:href="doOne! '1', $item->id">DoOne</a>
{else}
<a class="btn btn-success btn-sm disabled">DoneOneDone</a>
{/if}
{/snippet}
</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
{/snippet}
Tolik k latte, ted se pokusím srozumitelně sepsat homepage presenter, který to obsluhuje.
public function handleDo($do, $id)
{
$this->itemModel->updateItemDo($do, $id, $this->user->getId());
if ($this->isAjax()) {
$this->redrawControl('tableTable');
} else {
$this->redirect('this');
}
}
public function handleDoOne($doOne, $id)
{
$this->itemModel->updateItemDoOne($doOne, $id, $this->user->getId());
if ($this->isAjax()) {
$this->redrawControl('tableTable');
} else {
$this->redirect('this');
}
}
Asi to rozdělím do více dotazů…
Nyní tedy ta první část,
Pokud si přes vyhledávání v tabulce najdu určitý row třeba dle ID,
nebo i když jen kliknu na tlačítko „Do“,
Změní se mi některá tlačítka Do a DoOne na DoDone a DoOneDone, nevím
v jaké logice, ale změní se všechny, takže mám bud DoOne nebo
DoDone všude.
V handlu se mi provede pouze tlačítko s poslaným $id, to je v pořádku a v DB mám také upraven jen daný řádek.
Zkoušel jsem toho už mnoho, upřímně ani nevím, co dělám špatně, nebo kde se chytit…popostrčil by mě někdo prosím? Už se s tím peru týden. Případně, pokud mi doporučíte úplně jiné řešení, jak mít Sort, vyhledávání a AJAX tlačítka v jedné tabulce, nejsem proti tomu i celé to přepsat…
Mám problém, že s JS moc neumím, o to je to pro mě složitější.
Děkuji za rady.
Editoval ragulin (30. 6. 2019 15:16)
- Phalanx
- Člen | 310
Jako první v tvém kódu vidím chybu, že máš stejné id snippetu – to nemůžeš.
Máš víckrát v kódu:
{snippet $item->id}
Změň si to třeba na {snippet something-$item->id}
,
{snippet something-else-$item->id}
Pak se ti časem taky vymstí používat id="table"
– id
musí být unikátní v rámci HTML stránky.
Jinak php obsluha vypadá ok. Takže – máš nalikovaný nette.ajax.js do stránky a je inicializovaný?
- KristianSubweb
- Člen | 146
Ahoj zbytočne sa trápiš super riešenie je https://ublaboo.org/datagrid/ u nás vo firme to používame naprieč CRM, IS je to riešene celé cez snippety takže všetko vieš prekraslovať aj bez redirectu. A ak by tam nebolo niečo čo potrebuješ je to písane celkom jednoducho budeš si vedieť dopracovať sám.
- ragulin
- Člen | 58
Phalanx napsal(a):
Jako první v tvém kódu vidím chybu, že máš stejné id snippetu – to nemůžeš.
Máš víckrát v kódu:
{snippet $item->id}
Změň si to třeba na
{snippet something-$item->id}
,{snippet something-else-$item->id}
Pak se ti časem taky vymstí používat
id="table"
– id musí být unikátní v rámci HTML stránky.Jinak php obsluha vypadá ok. Takže – máš nalikovaný nette.ajax.js do stránky a je inicializovaný?
Děkuji, pomohlo pouze přejmenovat jednotlivé snippety na unikátní názvy.
Teď druhá část dotazu, k handlu „Change order By“ který je u <th> elementu, mám tento kód v presenteru, ty globální proměnné mi pak nějak ovlivňují posílání dat do stránky v renderu při překlesní snippetu. Předtím, než jsem do toho začal patlat dynamické snippety mi to fungovalo:
public function handleChangeOrderBy($attr, $direcion)
{
$this->orderByAttr = $attr;
$this->orderByDirection = $direcion;
$this->redrawControl('tableTable');
}
Ale nyní mi to nechce reagovat, pokud tam mám tu class=„ajax“, pokud toto smažu, tak se stránka refreshne a je to v pořádku.
Měl bych tedy vytvářet pro každý ten <th> další dynamický snippet?
Ještě dodám, snippet se jmenuje tableXXX, nechtěl jsem tam psát originální názvy z aplikace.
Děkuji za radu
Editoval ragulin (3. 7. 2019 10:04)
- ragulin
- Člen | 58
@Phalanx No z toho co jsem se tam dočetl tak:
- nette.forms.js mi přijde jako nesmysl linkovat, když tam žádné formuláře nemám…
- nette.init v javascriptu mám, ale list.js mám inicializovaný v nette.ext
- ten snippet tableTable mám v renderu a handlu, nikde jinde ho nevolám, takže se mi nemuže pokazit ta hierarchie aplikace
- handle jako takový mi proběhne, ale neproběhne redrawControl
- Snippet area okolo include mi taky nefunguje
Zkoušel sem přehodit inicializaci toho list.js do document.ready, kde je
i ten init, ale také nepomohlo
Pak jsem zkoušel přesunout snippet table Table, aby byl okolo celé stránky,
ale to taky nepomuže, začínám být z toho jelen, přemýšlím že si
založím nový projekt kde si ozkouším ten datagrid, ale to je zase na
přepsání celé aplikace
Editoval ragulin (3. 7. 2019 11:59)