Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony]Problem z formularzami wbudowanymi [embedded]
SnakeEater
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 12.03.2010

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


Mam niestety kolejny problem z którym nie mogę sobie poradzić.
W formularzu QuestionForm mam wbudowany formularz AnswerOptionCollForm, a w nim natomiast formularze AnswerOption. Chciałeś stworzyć validator, który sprawdzi czy przynajmniej 3 różne odpowiedzi zostały podane. AnswerOption posiada na razie tylko pole answer (później zamierzam to rozbudować). Aby dany formularz podrzędny był uznany za wypełniony musi być wpisane pole answer. Zrobiłem to tak:
  1. class AnswerOptionValidatorSchema extends sfValidatorSchema
  2. {
  3. protected function doClean($values)
  4. {
  5. foreach($values as $key => $value)
  6. {
  7. if (!$value['answer'])
  8. {
  9. unset($values[$key]);
  10. }
  11. }
  12. if (count($values) < 3)
  13. throw new sfValidatorError($this, 'You must give minimum three answer options.');
  14. return $values;
  15. }
  16. }


Validator został dodanyw taki sposób metodzie configure klasy AnswerOptionCollForm:
  1. if($question->isNew())
  2. {
  3. for ($i = 0; $i < $this->getOption('size', 3); $i++)
  4. {
  5. $answerOption = new AnswerOption();
  6. $answerOption->Question = $question;
  7. $answerOptionForm = new AnswerOptionForm($answerOption, array('required' => false));
  8. $this->embedForm($i, $answerOptionForm);
  9. }
  10. $this->mergePostValidator(new AnswerOptionValidatorSchema());
  11.  
  12. }

Error wyskakuje ale w takim miejscu, jakby dotyczył pierwszego AnswerOption a nie całości(czyli AnswerOptionCollForm). W ogóle to czy moja klasa validatora potrzebuje dziedziczyć właśnie po sfValidatorSchema? Czemu błąd pojawia się w złym miejscu? Czy ktoś może mi to wytłumaczyć

Po 10 godzinach rozwiązałem problem (IMG:style_emoticons/default/smile.gif) Spowodowane to wszystko było chyba błędem Symfony. W AnswerOptionCollForm dodawałem formualarze AnswerOptionForm identycznie jak to jest w tym tutorialu Symfony. Zamiast name używałem integer czyli $i.
  1. if($question->isNew())
  2. {
  3. for ($i = 0; $i < $this->getOption('size', 3); $i++)
  4. {
  5. $answerOption = new AnswerOption();
  6. $answerOption->Question = $question;
  7. $answerOptionForm = new AnswerOptionForm($answerOption, array('required' => false));
  8. $this->embedForm($i, $answerOptionForm); // ******
  9. }
  10. $this->mergePostValidator(new AnswerOptionValidatorSchema());
  11.  
  12. }

wystarczyło zmienić ****** linię na
  1. $this->embedForm('a'.$i, $answerOptionForm);
i wszystko już śmiga. Trochę mnie zawiódł ten Framework przyznam. Nie spodziewałem się takiego prostego błędu. Można powiedzieć, że niezły primaaprilis mi sprawił. Czy często się spotykacie z błędami w tym frameworku?

Ten post edytował SnakeEater 1.04.2010, 17:39:24
Go to the top of the page
+Quote Post
destroyerr
post
Post #2





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

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


Szczerze mówiąc to wątpię, że to jest błąd, ale jeśli uważasz, że jest inaczej to proponuję zgłosić ten błąd. Metoda jako pierwszy parametr przyjmuje string, a nie integer. Problem czy też błąd wynika z zamieszania w PHP z rzutowaniem zmiennych.
Go to the top of the page
+Quote Post
SnakeEater
post
Post #3





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 12.03.2010

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


Myślę, że to błąd jednak. Powody:
1. Tak jest w oficjalnym booku (link podałem w pierwszym poście).
2. Ten bug chyba tutaj został zgłoszony rok temu.
3. Error nie dotyczył żadnego z formularzy wbudowanych, gdyż to miał być global error, a Symfony wcisnęło go do pierwszego forma. Czemu miałby wciskać jakikolwiek error globalny do jakiegokolwiek zagnieżdżonego formularza? Odwrotną sytuację jeszcze mógłbym zrozumieć.
Zgłaszać nie ma sensu skoro już to ktoś zgłaszał.

Chyba będę musiał się przesiąść na zend. Wydaje mi się, że wszystko polega na takim błędzie, gdzieś w symfony:
Kod
forech (embeddedForms as es)
{
    if(es->name == null); // czyli if(0 == null)
        wciśnij do niego błąd.
}

Dziwne jest tylko to że zrobienie (string)$i nic nie pomaga.

Ten post edytował SnakeEater 1.04.2010, 19:34:56
Go to the top of the page
+Quote Post
destroyerr
post
Post #4





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

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


Co prawda nie za błąd ale winna za taką sytuację jest ta linijka. Możesz sobie nadpisać tą metodę lub zmienić framework, albo nawet i język programowania.
Go to the top of the page
+Quote Post
SnakeEater
post
Post #5





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 12.03.2010

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


Wielkie dzięki (IMG:style_emoticons/default/smile.gif)
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: 27.09.2025 - 00:00