Uniknięcie tracenia zaznaczeń checkboxów przy stronicowaniu

0

Cześć

Mam bardzo prostą stronkę wyświetlającą jakieś tam produkty w tabeli. Są one pobierane z bazy danych MongoDB. Stronicuję wyniki i wyświetlam po 20 na podstronę (to stronicowanie też bardzo proste).

$page  = isset($_GET['page']) ? (int) $_GET['page'] : 1;
$limit = 20;
$skip  = ($page - 1) * $limit;
        

$next  = ($page + 1);
$prev  = ($page - 1);


$db = get_db();
$products = $db->products->find([], [[ 'skip' => $skip, 'limit' => $limit ]]);

?>

Dalej jest kod HTML wyświetlący tabelę i ew. <?= ?> z wartościami z bazy danych.

Do każdego produktu dorabiam pole typu checkbox, o value równym id produktu bazy danych i name: selected[].
Chciałbym aby po zaznaczeniu i kliknięciu jakiegoś tam przycisku pod tabelą zapisywało, które produkty zostały zaznaczone. Potem wykorzystuję to w takim prowizorycznym koszyku na innej podstronie (identyfikuję produkty przez te id).

Mój problem polega na tym, że obsługa zaznaczania tych pól działa tylko dla danej podstrony, jeśli na pierwszej zaznaczę ze 3 produkty i przejdę do kolejnej podstrony, a potem tam kliknę 'zapisz', to te z pierwszej nie są pamiętane.

Kod zapisujący dane po kliknięciu przycisku zapisz:

<?php
if (! isset($_SESSION['saved']))
    $_SESSION['saved']=array();

if(isset($_POST['save']))
{
    if(!empty($_POST['selected']))
    {
        unset($_SESSION['saved']);
        $_SESSION['saved']=array();

        foreach($_POST['selected'] as $selected)
        {
            array_push($_SESSION['saved'], $selected);
        }
    }
}
?>

Szukałem trochę w Internecie jak to ulepszyć, żeby zapisywało też z innych podstron. W jednym z tematów gość sugerował zmianę wysyłki formularza na GET, próbowałem i nic nie dało, z resztą nie wiem co to miałoby zmienić.

Chciałbym jakoś zapisywać w sesji (nie konkretnie od razu to tablicy 'saved' ale do jakieś tymczasowej, który potem dołączałbym po kliknięciu zapisz i ew. usuwałbym duplikaty) ale nie wiem jak zrobić, żeby wartości z pól typu checkbox były zapisane po samym ich kliknięciu, bez klikania zapisz (i wysyłania formularza) na każdej podstronie.

1

Masz 2 opcje, które prowadzą do tego samego:

  1. Sesje
    1a) Podepnij sobie zdarzenie change w JS na inputboxy i wykonuj zapytanie ajaxem, które będzie Ci dodawało lub usuwało z sesji kliknięte value checkboxa.
    1b) Podepnij sobie zdarzenie click pod przyciski paginacji, żeby przed zmianą strony, pobrało Ci wszystkie zaznaczenia i wtedy zrobiło request ajaxem do aktualizacji zaznaczeń.
  2. Ciasteczka - jeśli z jakiegoś powodu koniecznie chcesz pominąć ajaxa
    Analogicznie w JS zrób sobie zapis zaznaczeń do ciasteczek, a później będziesz mógł je odczytać w sposób natywny z PHP.

Po submicie formularza, wszystko będziesz miał zapisane w sesji albo ciasteczkach. POST czy GET ignoruj, bo oczywiste jest, że Ci prześle tylko dane z widocznych pól na danej stronie.

1

Dopowiem, bo robiłem takie rozwiązanie. Trzeba tutaj dużą uwagę zwracać na filtrowanie danych. Zaznaczony checkbox najpewniej będzie zwracał do ciasteczka numer ID zaznaczonego rekordu. Przed wykonywaniem na takim zbiorze danych jakichkolwiek operacji należy sprawdzać, czy user ma prawo na tych konkretnych ID wykonać daną operację.

Tutaj też pojawia się kilka zagwostek w kontekście ergonomii.

Jeśli dla danej tabeli mamy dostępną wyszukiwarkę i wdrożyliśmy funkcjonalność zapamiętywania zaznaczenia checkboxów, należy pamiętać, by po każdorazowym skorzystaniu z wyszukiwania czyścić ciasteczko z checkboxami. W przeciwnym wypadku może dojść to bardzo nieporządanych sytuacji. User zmienił kryteria wyszukiwania, więc nie może zobaczyć zaznaczonego wcześniej rekordu, zaznacza inny klika usuń zaznaczone i :) zonk.

Druga kwestia to znikanie rekordów. Jeśli user korzysta z funkcji USUŃ ZAZNACZONE powinna ona czyścić zaznaczenie itd.

Spędziłem nad tym tematem nie mało czasu włącznie z opracowaniem funkcjonalności POKAŻ ZAZNACZONE itp.

1
webkam napisał(a):

Jeśli dla danej tabeli mamy dostępną wyszukiwarkę i wdrożyliśmy funkcjonalność zapamiętywania zaznaczenia checkboxów, należy pamiętać, by po każdorazowym skorzystaniu z wyszukiwania czyścić ciasteczko z checkboxami. W przeciwnym wypadku może dojść to bardzo nieporządanych sytuacji. User zmienił kryteria wyszukiwania, więc nie może zobaczyć zaznaczonego wcześniej rekordu, zaznacza inny klika usuń zaznaczone i :) zonk.

To też zależy od oczekiwań. Na pewno warto to wziąć pod uwagę i zrobić to celowo, a nie przez przypadek jak wyjdzie.
Akurat u siebie mam to zrobione inaczej. Pozwalam użytkownikom filtrować bez kasowania poprzednich zaznaczeń, gdyż założenie jest takie, że ich celem jest znalezienie wszystkich, pasujących elementów i następnie wykonanie na nich jakiejś akcji. Brak kasowania elementów, których już nie widać, jest celowe. Można odznaczyć aktualne zaznaczenie na stronie oraz "odznaczyć" wszystkie, wcześniej zaznaczone pozycje.

0

Zdecydowanie tak :) pod warunkiem, że wyraźnie sygnalizujesz, że coś jest zaznaczone :)

0

Dziękuję sabat24, użyłem Twojego rozwiązania 1a, dziękuję również użytkownikowi webkam za wartościowy komentarz

1 użytkowników online, w tym zalogowanych: 0, gości: 1