teamon.eu

blah blah blah

Symfony admin i filtry i18n

31 lipca 2007

Kategorie:

Tagi:

  • PHP
  • Symfony

Wykań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']);
      }
       
  1. 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

  • Nemo 31 lipca 2007 08:14:38

    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.

  • teamon 31 lipca 2007 08:40:59

    Wtedy będzie error, że pole name nie należy do klasy Product :) (próbowałem tak)

  • Nemo 03 sierpnia 2007 21:56:58

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

Zostaw komentarz

code