Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Paginacja, sortowanie, wzorzec
Forum PHP.pl > Forum > PHP
tabbi
Witam,

prosiłbym o wypowiedź osób, które mają dość duże doświadczenie w programowanie aplikacji webowych. Otóż mam paginację wraz z sortowaniem, wartości dotyczące sortowania wypełnia się poprzez formularz na stronie (GET). Wszystkie te flagi muszę później załadować do metody, która pobiera listę elementów i mam to tak zakodowane:

  1. // Sorting rules
  2. if(isset($this->get['sort_date']) && $this->get['sort_date'] == "asc") $options['order_by_date_asc'] = TRUE;
  3. else if(isset($this->get['sort_date']) && $this->get['sort_date'] == "desc") $options['order_by_date_desc'] = TRUE;
  4. else if(isset($this->get['sort_title']) && $this->get['sort_title'] == "desc") $options['order_by_title_desc'] = TRUE;
  5. else if(isset($this->get['sort_title']) && $this->get['sort_title'] == "asc") $options['order_by_title_asc'] = TRUE;


Dodatkowo mam jeszcze kilka innych elementów srotujących więc trochę if-ów się tworzy pytanie czy to jedyny bezpieczne optymalne rozwiązanie questionmark.gif
thek
Przekombinowałeś moim zdaniem. 10 pól w bazie i 2 możliwe kierunki to "tylko" 20 możliwych kombinacji jako pola tablicy, a na dodatek wzajemnie się wykluczających wink.gif Znaczne prościej byłoby:
  1. $this->sort = array('pole' => 'kierunek', 'pole2' => 'kierunek2');

Czemu tak? Posłużę się najprostszym możliwym klejeniem zapytania (query builder byłby lepszy, ale nie znam implementacji):
  1. $order = 'ORDER BY';
  2. if(count($this->sort) > 0) {
  3. foreach($this->sort AS $column => $direction) {
  4. $order .= ' '.$column.' '.$direction.',';
  5. }
  6. $order = substr($order, 0, -1);
  7. }

Oczywiście to tylko idea. Osobiście zabezpieczałbym to przed głupotami z kierunkiem czy sprawdzeniem istnienia kolumn i takie tam "drobiazgi" wink.gif

Zauważ... Jedna tablica z kluczem jako nazwa pola i wartością jako kierunek, a dodatkowo kolejność w tablicy odgrywa rolę gdy mamy order by z użyciem wielu pól. Przy odrobinie pomyślunku można nawet to przerobić tak by generował także:
  1. ORDER BY count(FIELD) DESC, id ASC

I nie jest to trudne smile.gif Odrobinka chęci i przemyślenia sprawy smile.gif

A jak zabezpieczać? Przykładowo zastosowałbym mapowanie. Skoro ze skryptu otrzymuję konkretne wartości to mam też zapewne tablicę, gdzie mogę tę wartość zamienić na odpowiednią nazwę kolumny. Sprawdzam to co otrzymuję od usera pod kątem zgodności z tablicą mapującą. Jeśli mam coś niezgodnego z nią - wywalam. To samo gdy otrzymam ze skryptu coś, co nie mapuje się na ASC lub DESC jako kierunek sortowania. Takie coś też wylatuje. Ostatecznie coś mi tam zostaje (lub nie) i to wykonuję.
tabbi
Budowanie zapytań odpada bo używam Active Record w Codeigniterze.

  1. if(isset($this->get['sort_date']) && in_array($this->get['sort_date'], $this->sorting_template['sort_date'])) $options['sort_date'] = $this->get['sort_date'];
  2. if(isset($this->get['sort_title']) && in_array($this->get['sort_title'], $this->sorting_template['sort_date'])) $options['sort_title'] = $this->get['sort_title'];
  3. $options['positions'] = array_filter(elements(array_keys($this->get), $this->sorting_template['positions'] ));
  4. $options['options'] = array_filter(elements(array_keys($this->get), $this->sorting_template['options'] ));
  5. $options['employments'] = array_filter(elements(array_keys($this->get), $this->sorting_template['employments'] ));
  6. $options['works'] = array_filter(elements(array_keys($this->get), $this->sorting_template['works'] ));


Zamknąłem się w takim zapytaniu.
thek
Myślisz, że Active Record to naprawdę problem?
  1. foreach($this->sort AS $column => $direction) {
  2. $this->db->order_by($column, $direction);
  3. }

Nie bez powodu napisałem, że query buildery byłby lepszy smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.