Zachování parametrů z GET formuláře při AJAX požadavku

Laxren
Backer | 23
+
0
-

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
+
+2
-

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
+
0
-

@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
+
+1
-

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);
             }

         }
     });
});
Laxren
Backer | 23
+
0
-

@DavidMatějka Díky za vysvětlení té extension a za super řešení! :)