Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] Walidacja w TinyMCE
blackroger
post 22.09.2010, 23:34:44
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

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


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.
Go to the top of the page
+Quote Post
destroyerr
post 22.09.2010, 23:50:41
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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.

Ten post edytował destroyerr 22.09.2010, 23:51:54
Go to the top of the page
+Quote Post
blackroger
post 23.09.2010, 00:38:17
Post #3





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

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


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

Ten post edytował blackroger 23.09.2010, 00:41:01
Go to the top of the page
+Quote Post
destroyerr
post 23.09.2010, 07:57:39
Post #4





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


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. }
Go to the top of the page
+Quote Post
blackroger
post 23.09.2010, 13:58:32
Post #5





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

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


ok dzięki wielkie smile.gif
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: 14.08.2025 - 10:37