Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Paginacja, sortowanie, wzorzec
tabbi
post 13.12.2012, 21:17:38
Post #1





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 30.10.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
thek
post 13.12.2012, 23:41:22
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ę.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
tabbi
post 14.12.2012, 02:05:36
Post #3





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 30.10.2010

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
thek
post 14.12.2012, 08:50:34
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 20:48