Symfony admin i filtry i18n
31 lipca 2007Wykańczam właśnie panel administracyjny swojego sklepiku napisanego w Symfony. Przyszedł czas na filtry, dobra, jedziemy - Klasa Product, pola code, name, price itp. Niby wszystko pięknie wygenerowane ale jednak nie do końca... Pole name jest disabled.
W myślach standardowe [WTF??]
Po kilku próbach, zmianach i dochodzeniu "na czuja" odkryłem, że mój kochany framework jest bystrzejszy ode mnie i on wie że w klasie Product pole name nie istnieje. Fakt, nie istnieje, bo jest w ProductI18n...
Zacząłem od Google. I nic. Może jest już za późno na inteligentne zapytania do wyszukiwarki, może już nie rozumiem o tej porze po angielsku, a może po prostu nikt tego nie opublikował (niemożliwe). Trzeba zatem samemu wymyślić rozwiązanie.
Cztery kroki do filtrowania przez i18n
-
- Zostawiamy pole name w generator.yml i odpalamy w przeglądarce
- Otwieramy folder cache/backend/dev/modules/autoProduct/templates/ i kopiujemy plik _filters.php do apps/backend/modules/product/templates/
- Otwieramy nasz skopiowany pliki, odnajdujemy kawałek odpowiedzialny za wyświetlenie inputa dla name i usuwamy z jego opcji 'disabled=true'
-
- Z akcji w cache (cache/backend/dev/modules/autoProduct/actions/actions.class.php) kopiujemy metodę addFiltersCriteria() do pliku apps/backend/modules/product/actions/actions.class.php
- Otwieramy plik i na samym początku dodajemy 2 linijki:
$c->addJoin(ProductPeer::ID, ProductI18nPeer::ID); // 'łącznik' z tabela i18n $c->add(ProductI18nPeer::CULTURE, $this->getUser()->getCulture()); // ustawienie culture (można też 'na sztywno', np. 'pl')
-
- Teraz zamieniamy pole name klasy Product na pole name klasy ProductI18n
Kod:if (isset($this->filters['name_is_empty'])) { $criterion = $c->getNewCriterion(ProductPeer::NAME, ''); $criterion->addOr($c->getNewCriterion(ProductPeer::NAME, null, Criteria::ISNULL)); $c->add($criterion); } else if (isset($this->filters['name']) && $this->filters['name'] !== '') { $c->add(ProductPeer::NAME, $this->filters['name']); }
zamieniamy na:if (isset($this->filters['name_is_empty'])) { $criterion = $c->getNewCriterion(ProductI18nPeer::NAME, ''); $criterion->addOr($c->getNewCriterion(ProductI18nPeer::NAME, null, Criteria::ISNULL)); $c->add($criterion); } else if (isset($this->filters['name']) && $this->filters['name'] !== '') { $c->add(ProductI18nPeer::NAME, $this->filters['name']); }
- Teraz zamieniamy pole name klasy Product na pole name klasy ProductI18n
-
Na koniec można zamienić jeszcze
$c->add(ProductI18nPeer::NAME, $this->filters['name']);
na:$c->add(ProductI18nPeer::NAME, $this->filters['name'], Criteria::LIKE);
dla wygody
I to by było na tyle, prawda że proste?
Aaaa... Wszelakie inne pomysły mile widziane :)
3 komentarze
A czy przypadkiem w pierwszym punkcie nie wystarczyło by w generator.yml dodać:
fields:
name: { params: disabled=false }
Dla pól w formularzu edycji działa, dla filtrów też, o ile pamiętam.
Wtedy będzie error, że pole name nie należy do klasy Product :) (próbowałem tak)
Sorry, że dopiero teraz, ale sprawdziłem i działa. Tutaj chodzi tylko i wyłącznie o to, żeby odblokować pole, nic nie mieszamy z klasami przecież.