Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [laravel] Filtrowanie rekordow
Koldy
post
Post #1





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 28.06.2009
Skąd: Great Britan

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


Witajcie rodacy,

Chcialbym sie poradzic was apropo pewnych kilku rzeczy dotyczacych mojej klasy ktorej napisalem.
Chodzi o filtrowanie rekordow na stronie.

Zaczne od struktury:
Stworzylem 3 klasy:
  1. Factory, BaseHandler, Button


Factory jest wstrzykiwana do metody controllera przez LOC, takze jest ona zainicjowana juz na starcie, pozniej kod wyglada tak:
  1. $filters->listen('cat', 'Categories', [$businessTypes, $businesses])
  2. ->listen('name', 'Search', [$businesses])
  3. ->handle();


listen, chodzi o sluchanie parametru, takze pierwszy argument to parametr get do sluchania, drugi to nazwa klasy handlera, bez namespace, automatycznie dodawany przez Factory, natomiast tablica to argumenty przekazane do stworzonego handlera.

Oczywiscie handler musi byc rozszerzeniem klasy BaseHandler, gdzie cala logika jest tworzona.
Dziecko Handlera musi miec 3 metody: boot, filter i lang, gdzie boot to tam gdzie wstrzykuja sie argumenty z tablicy i zwracana jest tablica z mozliwymi filtrami. Filter to operacje na argumentach podczas spelnienia warunku, kod wyglada np tak:
  1. switch($this->value()) {
  2. case 'name': $this->builder->orderBy($this->column); break;
  3. case 'name-inv': $this->builder->orderBy($this->column, 'DESC'); break;
  4. default: $this->builder->orderBy('created_at', 'DESC');
  5. }


metoda lang zwraca string z sciezka do tablicy z ew. kluczami do tlumaczenia.

Button to tak na prawde glupia struktura z metodami, ktora dostaje wiekszosc informacji w konstruktorze, a tworzony jest w kazdym handlerze po wykonaniu handle() na fabryce.

pozniej ladujemy z takim kodem w blade:
  1. foreach($filters->sort->buttons as $button) { $button->href, $button->isActive()}


Teraz moje pytanie, jak moge zabezpieczyc zeby handler zawsze mial te metody, problem w tym ze sa do niego wstrzykiwane argumenty i kiedy uzywam interfejsu dostaje blad ze metoda jest niezgodna z pierwowzorem.
Dwa, czy to ogolnie dobrze jest to przemyslane, nie jestem expertem i chcialbym sensowne odpowiedzi co wymagałoby zmiany lub jak powinienem do tego podejsc.
kod mi sie podoba bo w handlerze jest logika filtrowania, a w kontrolerze mam tylko te komendy listen, oraz moge podpiac jeden ten sam filtr np do Kategorii pod rozne parametry z roznymi argumentami (np rozne modele bo wymagana tam jest akurat instancja buildera)

Edit: O i zapomnialem o najwazniejszym, base handler posiada prywatna statyczna property, do trzymania wszystkich sluchanych parametrow, stwierdzilem ze to lepszy pomysl niz wstrzykiwanie wartosci przy tworzeniu handlera, chcialbym wiedziec czy to jest wlasnie odpowiednie wykorzystanie statica, bo juz sam nie wiem, oczywiscie akcesory mam niestatycznie w handlerze.

Z gory dzieki za pomoc
Pozdrawiam

Ten post edytował Koldy 10.10.2015, 02:17:44
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Czytam, czytam i nadal nie rozumiem (IMG:style_emoticons/default/wink.gif)

Pokaż kod tych klas, i jak tego używasz.
Go to the top of the page
+Quote Post
Koldy
post
Post #3





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 28.06.2009
Skąd: Great Britan

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


troche zmeczony bylem (IMG:style_emoticons/default/wink.gif)
np klasa do sortowania buildera (order)
  1. namespace MyApp\Libraries\Filter\Handlers;
  2.  
  3. use Illuminate\Database\Eloquent\Builder;
  4. use Illuminate\Database\Eloquent\Collection;
  5. use MyApp\Libraries\Filter\BaseHandler;
  6.  
  7. class Order extends BaseHandler {
  8.  
  9.  
  10. /**
  11.   *
  12.   * ===============================================================
  13.   *
  14.   * Boot
  15.   *
  16.   * ===============================================================
  17.   *
  18.   *
  19.   *
  20.   *
  21.   *
  22.   *
  23.   *
  24.   */
  25. protected function boot(Builder $builder) {
  26. $this->builder = $builder;
  27. switch(get_class($builder->getModel())) {
  28. case 'MyApp\Models\Sale': $name = 'title'; break;
  29. default: $name = 'name';
  30. }
  31. $this->column = $name;
  32. return ['name', 'name-inv'];
  33. }
  34.  
  35.  
  36. /**
  37.   *
  38.   * ===============================================================
  39.   *
  40.   * Filter
  41.   *
  42.   * ===============================================================
  43.   *
  44.   *
  45.   *
  46.   *
  47.   *
  48.   *
  49.   *
  50.   */
  51. protected function filter() {
  52. switch($this->value()) {
  53. case 'name': $this->builder->orderBy($this->column); break;
  54. case 'name-inv': $this->builder->orderBy($this->column, 'DESC'); break;
  55. default: $this->builder->orderBy('created_at', 'DESC');
  56. }
  57. }
  58.  
  59.  
  60. /**
  61.   *
  62.   * ===============================================================
  63.   *
  64.   * Langauage array
  65.   *
  66.   * ===============================================================
  67.   *
  68.   *
  69.   *
  70.   *
  71.   *
  72.   *
  73.   *
  74.   */
  75. protected function lang() {
  76. return trans('categories.sort');
  77. }
  78.  
  79.  
  80.  
  81. }


a w kontrolerze wyglada to tak
  1. public function homeSupplierListings(Filters $filters) {
  2. $businessTypes = Category::supplierCategories()->parents()->get();
  3. $businesses = Business::suppliers()->with(['categories','images']);
  4.  
  5. $filters->listen('cat', 'Categories', [$businessTypes, $businesses])
  6. ->listen('name', 'Search', [$businesses])
  7. ->listen('sort', 'Order', [$businesses])
  8. ->handle();
  9.  
  10. return view('home/listings')
  11. ->with('filters', $filters->render('cat'))
  12. ->with('businesses', $businesses->get());
  13. }


a w widoku jak chcemy uzyc przyciskow z wyrenderowanymi linkami to tak:
  1. foreach($filters->sort->buttons as $button) { "<a href etc" $button->href, $button->isActive()}


Reszte informacji jest w pierwszym poscie, troche chaotycznie, ale teraz powinienes zrozumiec.
Dzieki
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 15:10