Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Walidacja w TinyMCE
Forum PHP.pl > Forum > PHP > Frameworki
blackroger
Problem wydaje się być banalny ale siedzę już 3h próbując na różne sposoby i nie mogę sobie z tym poradzić. Mam zwalidować za pomocą walidatora Choice, wartość która znajduje się w TinyMCE. Chodzi o to żeby uzytkownik nie mógł zmienić wartości. Od razu piszę, że wiem, że takie coś można również zrobić za pomocą Callbacka, ale Choice też może być. Czyli mamy jakiś tekst w TinyMCE i teraz problem tkwi w tym że wartości te nie chcą się zgadzać.

  1. $field_value = $this->getObject()->$column_name;
  2.  
  3. $this->widgetSchema[$column_name] = new sfWidgetFormTextareaTinyMCE();
  4. $this->validatorSchema[$column_name] = new sfValidatorChoice(
  5. 'choices' => array(0 => $field_value)),
  6. 'invalid' => 'Zła wartość. Nie masz wystarczających praw.'
  7. ));
  8.  


Domyślam się, że problem leży prawdopodobnie w kodowaniu tylko ja już nie wiem co jak zakodować, żeby tekst przesyłany z POST był równy temu, który jest w bazie.

Poniżej wypisuje co już zrobiłem:
- dodałem do formularza 'accept-charset="utf-8"
- dodałem do konfiguracji Tiny encoding: "utf-8"
- porównałem za pomocą print_r() obydwa teksty i zobaczyłem ze en pobierany z bazy w miejsce spacji wstawia &nbsp więc, więc pozamieniałem je wszystkie na ' '.
Przykład:
- tekst pobrany przez getObject():

  1. <p> </p>
  2. <p>re</p>
  3. <p>t</p>
  4. <p>tr</p>
  5. <p>r</p>
  6. <p>tpr</p>
  7. <p> </p>


-tekst pobrany przez getParameter()

  1. <p> </p>
  2. <p>re</p>
  3. <p>t</p>
  4. <p>tr</p>
  5. <p>r</p>
  6. <p>tpr</p>
  7. <p> </p>


Jak ktoś zna sposób krótszy i szybszy niż mój aby zablokować możliwość zmiany wartości w konkretnych polach formularza to proszę o pomoc. Samo readonly nie wystarcza (wiadomo dlaczego), a pole musi być przesyłane.
Proszę o pomoc.
destroyerr
Czemu akurat Choice? Dlaczego pole musi zostać przesłane, skoro nie jest zmieniane?
Rozwiązaniem jest nie zapisywanie nowej wartości, nie wyświetlanie jej (w przypadku błędów w formularzu). Można to zrobić na różne sposoby, np. już w metodzie bind zmieniać wartość przesłaną na wartość z obiektu.
blackroger
Rozumiem Cię. Tylko najgorsze jest to, że cały formularz jest generowany automatycznie w zależności od pozwoleń dla danego pola i innego typu rzeczy. Wszystko jest ustalane w klasie formularza postępując zgodnie z dobrymi zasadami. To tam nadawane są inputy z różnymi atrybutami. Generowany formularz leci do akcji tam jest sprawdzany i zapisywany. Teraz, gdybym chciał zrobić tak jak piszesz musiałby większość mechanizmów przenieść do akcji lub powtórzyć je w niej.
Rozumiem że najłatwiej byłoby po prostu nie zapisywać tej przesyłanej wartości, ale wtedy muszę analizować po stronie akcji które pole jest z jakim pozwoleniem, a to dodatkowe objętości kodu. W momencie jak to wszystko leci to z góry wiadomo że tylko jedna wartość przejdzie a wszystkie pozostałe elementy są już sprawdzone. Problemem nie jest sprawdzanie kilkudziesięciu bajtów, ale może pojawić się problem gdy sprawdzane będą całe artykuły poprzez tinyMCE.


btw. okazało się że jakimś cudem znalazły się w bazie znaki w innym kodowaniu i to psuło sprawę.
destroyerr
Skoro do formularza dochodzi informacja jakie pole nie może zostać zapisane (bo na tej podstawie stosujesz walidację wyboru dla tego pola), to już wiemy jakie pole wyciąć, albo jakiego nie zapisać. Przykład:
  1. <?php
  2.  
  3. class SomeForm extends BaseForm
  4. {
  5. protected $fieldsToCut = array();
  6.  
  7. public function configure()
  8. {
  9. $field_value = $this->getObject()->$column_name;
  10. $this->widgetSchema[$column_name] = new sfWidgetFormTextareaTinyMCE();
  11.  
  12. $this->fieldsToCut[] = $column_name;
  13. }
  14.  
  15. public function bind(array $values = array(), array $files = array())
  16. {
  17. $values = array_diff_key($values, array_flip($this->fieldsToCut));
  18.  
  19. parent::bind($values, $files);
  20. }
  21. }
blackroger
ok dzięki wielkie 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.