2012-05-13 9 views
57

Zacząłem używać Symfony2, ale mam pewne problemy. Chciałem renderować pola ręcznie, ale to nie działa, ponieważ moje pole, które jeszcze wyrenderowałem, jest wyświetlane również z funkcją form_rest(), więc mam dwa te same pola.Jak sprawić, by form_rest() nie wyświetlało pola w Symfony2?

Oto mój kod:

<div> 
    {{ form_errors(form.contenu) }} 
    <textarea id="{{ form.contenu.vars.id }}" name="{{ form.contenu.vars.full_name }}">{{ form.contenu.vars.value }}</textarea> 
</div> 

A na końcu formularza, muszę umieścić to:

{{ form_rest(form) }} 

Ale to wyświetla "contenu" pole :(

Do masz pomysł, to w czym problem?

+0

Czy jest przypadkiem twoja forma zwana "formą"? W której wersji Symfony to rozwiązanie działa? Próbuję zrobić to samo, ale to nie działa. – userfuser

Odpowiedz

174

Inną opcją jest, aby wyraźnie zaznaczyć pole jako renderowane:

{% do form.contenu.setRendered %} 
+6

Dokładnie to, czego szukałem i odpowiada dokładnie na zadane pytanie. –

+1

Znakomity! doskonale wykonuje to zadanie. – richsage

+0

w PHP byłoby setRendered (true)?> –

32

{{ form_rest(form) }} idzie na samym końcu, po renderin g każde pole "ręcznie". Jeśli używasz go do CSRF żeton zawsze można uczynić go z:

{# Token CSRF #} 
{{ form_widget(form._token) }} 
+33

Bardzo przydatne w połączeniu z '{{form_widget (form.token)}}' '{{form_end (formularz, {'render_rest': false})}}' – Barno

8

Sytuacja, w której nie chcesz, aby pokazać niektóre pola sugeruje formę źle zaprojektowane. Możesz podać kilka argumentów w swoim numerze: __construct, aby uczynić go warunkowym (powiedzmy, włącz/wyłącz niektóre pola) lub możesz po prostu utworzyć oddzielne klasy Form (co, moim zdaniem, jest nieco przesadzone).

Miałem wspólny przypadek kilka miesięcy temu, gdy forma różniła się, gdy użytkownik wstawił/zaktualizował zapisy. To było coś takiego:

... 
public function __construct($isUpdateForm){ 
    $this->isUpdateForm= $isUpdateForm; 
} 

public function buildForm(FormBuilder $builder, array $options){ 
    .... 
    $builder->add('some_filed', 'text', .....); 

    if ($this->isUpdateForm){ 
     $builder->add(.....); 
    } 
    .... 
} 
.... 

Jeśli z jakichś powodów nie jesteś w stanie byłaby klasy formularza można nadal wyświetlać niechciane pola ale owinąć je w <div> który posiada atrybut CSS display:none. W ten sposób "nadal tam są" (i za wszelką cenę są przetwarzane normalnie), ale nie są widoczne dla użytkownika.

Nadzieja to pomaga ...

+0

jperovic ma rację. To jest ładne i czyste rozwiązanie! –

+0

Dziękuję, ale nie tego chciałem (znalazłem rozwiązanie, zobacz moje EDYCJĘ). Chciałem powiedzieć Symfony, że już wyświetlam pole;) – Minipipo1

25

Another moim zdaniem mniej hacky sposób to zrobić to:

{{ form_end(form, {'render_rest': false}) }} 

To od official documentation (v3.0), więc jest to najlepsza praktyka najlepsza praktyka i odgadnąć.

+4

Nie zapomnij o ręcznym renderowaniu tokenu CSRF. – Kolyunya

Powiązane problemy