Zachování parametrů z GET formuláře při AJAX požadavku
- Laxren
- Backer | 23
Zdravím,
potřebuji poradit jak s ajaxem načíst další produkty bez ztracení vyfiltrovaných produktů.. (normální stránkování mám zprovozněné)
bez filtrů by vše fungovalo, ale pokud vyfiltruji produkty a vytvoří se
adresa třeba:
http://domena.com/produkty?start_price=&end_price=&do=filterForm-submit&page=2
, tak při ajaxovém požadavku se tyto parametry smažou a počítá to
s adresa třeba:
http://domena.com/produkty?page=2&do=loadProducts
a pak se to
chová tak, jako by nebylo nic vyfiltrované
Presenter
public function renderDefault($url){
//Předání aktuální stránky
$this->template->page = $paginator->getPage();
}
public function handleLoadProducts($page){
$this->redrawControl('pagination');
$this->redrawControl('filterListing');
}
default.latte
<div n:snippet="filterListing" data-ajax-append="true">
výpis produktů....
</div>
{snippet pagination}
<span id="loadMoreProducts" class="ajax" data-page="{$page+1}">LOAD</span>
{/snippet}
<script>
$(function () {
$(document).on('click', '#loadMoreProducts', function (e) {
e.preventDefault();
$.nette.ajax({
url: {link loadProducts!},
data: {
type: 'POST',
page: $(this).data('page')
},
/*
success: function (data) {
// tady bych pak podstrčil url adresu s jiným page parametrem
window.history.pushState(null, null, "null");
}
*/
}, this, e);
})
});
</script>
Můj cíl byl měnit jen page
parametr a na základě toho
přidávat produkty pomocí data-ajax-append="true"
Jak tedy prosím zachovám/předám parametry z GET formuláře do ajax požadavku, aby se neztratila filtrace produktů?
- Kamil Valenta
- Člen | 815
Buď si ty parametry udělej perzistentní, nebo si je všechny ručně předávej i do toho ajax handlu.
- Laxren
- Backer | 23
@kamil_v díky za radu, sesmolil jsem to takto, ale vidím 2 problémy..
1.
nette.ajax.js:96 mi po více, než jednom zavolání hlásí..
Uncaught Cannot override already registered nette-ajax extension 'changeurl'.
2.
Jak by se to dalo lépe zapsat, protože tohle mi nepřijde jako šťastné
řešení.. Asi nějak ty parametry (queries) řešit jen v handlu a ne
v renderu, což se mi takto nepovedlo funkčně zprovoznit.
Mohl by mě prosím někdo zas nakopnout?
presenter
public function renderDefault($url){
$nextPage = $paginator->getPage()+1;
if($nextPage <= $paginator->getPageCount()){
$this->url->setQueryParameter('page', $nextPage);
}
$queryArray = $this->url->getQueryParameters();
unset($queryArray['do']);
$this->template->queries = json_encode($queryArray);
}
public function handleLoadProducts($page){
if($this->isAjax()){
$this->payload->changeurl = $this->url->setQueryParameter('page', $page)->getAbsoluteUrl();
$this->redrawControl('pagination');
$this->redrawControl('filterListing');
}
}
default.latte
<div n:snippet="filterListing" data-ajax-append="true">
výpis produktů....
</div>
{snippet pagination}
<span id="loadMoreProducts" class="ajax" data-abs-url="{$queries}">Další produkty</span>
{/snippet}
<script>
$(function () {
$(document).on('click', '#loadMoreProducts', function (e) {
e.preventDefault();
$.nette.ajax({
url: {link loadProducts!},
data: $(this).data('abs-url')
}, this, e);
$.nette.ext('changeurl',{
success: function (payload) {
window.history.pushState(null, null, payload.changeurl);
}
});
})
});
</script>
- David Matějka
- Moderator | 6445
delas to hrozne slozite. metody jako getQueryParameters jsem snad nikdy nepouzil. mas pracovat s parametry app requestu.
a extension pro nette.ajax registruj pouze jednou, globalne. ne po kazdem kliknuti
mohlo by fungovat neco jako:
public function renderDefault($url){
$this->template->maxPage = $paginator->getPageCount();
$this->template->page = $paginator->getPage();
}
public function handleLoadProducts($page){
if($this->isAjax()){
$this->redrawControl('pagination');
$this->redrawControl('filterListing');
}
}
<div n:snippet="filterListing" data-ajax-append="true">
výpis produktů....
</div>
{snippet pagination}
{if $page < $maxPage}
<span class="ajax" n:href="loadProducts! (expand) $presenter->getParameters(), page => $page + 1">Další produkty</span>
{/if}
{/snippet}
$(function () {
$.nette.ext('changeurl',{
success: function (payload) {
if (payload.changeurl) {
window.history.pushState(null, null, payload.changeurl);
}
}
});
});