Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Tworzenie formularza
Forum PHP.pl > Forum > PHP > Frameworki
peter13135
Framework symfony2 ma fajną opcję automagicznego budowania formularzy.

Mogę np. jednym poleceniem utworzyć sobie grupę checkoxów, czy radiobuttonów z polami z bazy.
Tutaj mały example znaleziony w sieci obrazujący co mam na myśli
  1. $builder->add('users', 'entity', array(
  2. 'class' => 'AcmeHelloBundle:User',
  3. ));



W jaki sposób teraz mam skonsturować templatkę, tak aby pomiędzy radiobuttonami (czy tam checboxami - w zależności od parametrów które podam) mogę umieścić jakieś elementy html ? Na przykład diva ?

Czyli chcę osiągnąć taki efekt :

  1. <input />
  2. tutaj jakiś mój divek
  3. <input />
  4. <input />
usb2.0
no w widoku oczywiście jeśli używasz twiga to chyba tak to leci
Kod
{{ form_row('form.nazwa_pola') }}


no i wyświetlając tak input każdy osobno możesz wcisnąć miedzy nie co uważasz
peter13135
Nie bardzo.
peter13135
Dzięki za odpowiedzi, ale po ponownym przeczytaniu tego artykułu nie jestem w stanie rozwiązać swojego. Albo tam nie ma informacji o tym, jak mój problem rozwiązać, albo po prostu nie potrafię go tam wyszukać. Czy mogę po prosić o bezpośredni link do przykładu questionmark.gif

wiem, że form_row mogę sobie rozdzielić na form_widget, label, oraz errors. Ale jak rozdzielić form_widget któro wyświetla mi kilka radiobuttonów/checkboxów na pojedyncze radiobuttony/checkboxy ?
Crozin
Żeby wstawić coś pomiędzy renderowane checkboksy/radio-buttony musiałbyś dla tego elementu formularza nadpisać widget form_field. Jednakże takie coś podejrzanie pachnie błędnym modelem danych - potrzeba wstawienia czegoś pomiędzy serię checkboksów jest bardzo nietypowa. Mógłbyś przybliżyć nam strukturę/przeznaczenie tego formularza?
peter13135
To ma być "formularz wyceny" dla firmy robiącej strony www. W tym formularzu są różne pola tekstowe, checkboxy, radiobuttony. Po kliknięciu w niektóre radiobuttony pojawiają się inne inputy. Dość to rozbudowane.

Jest sobie dla przykładu "projekt graficzny" i 3 opcje (radio) do wyboru. Po zaznaczeniu jednej z opcjii pojawiają się kolejne pola. Są one różne w zależności od zaznaczenia.

w chwili obecnej jest tak, że te "kolejne pola" pojawiają się pod tymi trzema opcjami... no i to działa. Ale prezes sobie zarzyczył, że jak zaznaczę pierwszy radiobutton, to te dodatkowe pola mają się ukazać między pierwszym a drugim radiobuttonem.


mam nadzieję, że za mocno nie pokręciłem.
Crozin
Z punktu widzenia wygody obsługi takiego formularza jest to idiotyczny pomysł, ale mniejsza z tym. Zapewne i tak korzystasz tam z JS do pokazywania kolejnych elementów formularza, tak? To przy pomocy JS przenieś resztę pól w odpowiednie miejsce - tak będzie szybciej i wygodniej.
peter13135
Dokładnie tak. Przeniesienie pól jsem to oczywiste rozwiązanie, ale liczyłem na coś bardziej po stronie symfony.
No ale... skoro mówisz, że nie da rady, to zostanę przy JS. Dzięki za odpowiedź.
toffiak
Jako przykład mogę podać dodawanie br-ki i tekstu przed każdym nowym polem radio.

Klasa formularza tu a szablon tu

Za pomocą
Kod
{% form_theme form _self %}
wymuszam wyszukiwanie nadpisanych bloków w tym samym szablonie w którym znajduje się mój wyświetlany formularz, wszystko jest objaśnione w linku który podałem wcześniej ( metoda pierwsza ). Sam formularz wyświetla 5 przycisków radio, jako że nadpisałem domyślny szablon zamiast wyświetlać blok z pliku używany jest mój.

Cała trudność polega na wybraniu odpowiedniego bloku do nadpisania.

Trochę się spóźniłem i rozwiązanie z javascriptem będzie lepsze/szybsze choć nadpisywanie bloków widgetów wewnątrz innych nadpisywanych bloków pewnie by się udało to jest to rozwiązanie zbyt skomplikowane.
Crozin
@toffiak: Tutaj większym problemem było to, że wewnątrz bloku radio_widget nie wystarczyło podać statycznego kodu HTML, a należało wygenerować inne pola z formularza - o ile dobrze kojarzę, takie coś mogłoby już być nieco problematyczne i napakowane różnymi hackami.
peter13135
Dziękuje wam za odpowiedzi smile.gif
Zostanę chyba przy javascripcie, bo wydaje mi się, że po prostu łatwiej będzie mi w nim to zrobić. Symfony2 uczę się dopiero od 2 tygodni.

http://www.yewchube.com/2011/08/symfony-2-...form-templates/
http://forum.symfony-project.org/viewtopic...=23&t=35769

Tutaj znalazłem kod za pomocą którego mogę zmienić "label" formularza (tak przynajmniej mi się wydaje tongue.gif ) Jednak nie potrafię tego dostosować

zrobiłem takie coś :

  1. {% form_theme form _self %}
  2.  
  3. {% block radio_label %}
  4.  
  5. {% spaceless %}
  6.  
  7. <span>hehe</span><img class="tooltipek" src=" {{asset('help.png')}}"/> <br>
  8.  
  9. {% endspaceless %}
  10.  
  11. {% endblock radio_label %}

To wyświetla dla każdego radiobuttona taki sam label, bo zmiennych żadnych nie ma.

Chciałem dodać {{label}} tak jak w examplu, ale mam błąd, że takiego czegoś twig nie zna.

Czy mogę prosić o podanie "oryginalnej" wersji radio_label, którą następnie będę mógł zmodyfikować ?
Generalnie chodzi mi tylko o dodanie obrazka na końcu każdego label'a


edit://

takie coś też nie hula :/

Kod
{% block radio_label %}

{% spaceless %}

     {{ block('base_field_label') }}
     <img class="tooltipek" src=" {{asset('help.png')}}"/> <br>

{% endspaceless %}

{% endblock radio_label %}


moja ikonka się pokazuje, ale poza tym nic. TO {{ block('base_field_label') }} niczego nie wyświetla.
Crozin
Domyślne szablony elementów formularzy: https://github.com/symfony/symfony/tree/mas...rces/views/Form. Korzystając z Twiga masz dostęp do dokładnie tych samych zmiennych.
peter13135
Dzięki za odpowiedź, jednak ja nadal nie potrafię tego wykorzystać. Znalazłem tam np. field_label
  1. <?php echo $view['form']->block('form_label') ?>

Ale radio label już nie ma.
Piszesz, że mam dostęp do dokładnie tych samych zmiennych. O jakich zmiennych piszesz ? wink.gif

Takie coś :

{{block(form_label)}}

Mi nie działa.

Kod
{{ block('field_label')}}

Takie coś mi działa, ale.. jak dam kod obrazka pod tym, to jest on pod label'em, a chciałbym, żeby był on obok niego :/
Crozin
To już kwestia odpowiedniego ostylowania tego w CSS-ie.
peter13135
OK poradziłem sobie.
A czy da się jakoś "wyciągnąć" atrybut for z label'a
Chciałbym go wrzucić jako id w img w nieco zmienionej formie.

czyli chcę taki efekt uzyskać :
  1. <input type="radio" id="valuationform_graphicProject_0" name="valuationform[graphicProject]" required="required" value="0" />
  2. <label for="valuationform_graphicProject_0" class=" required">Stworzenie projektu graficznego</label>
  3. <img id="tooltip_valuationform_graphicProject_0" class="tooltipek" src=" /help.png"/>
Crozin
https://github.com/symfony/symfony/blob/mas...widget.html.php

Jak widzisz atrybuty dla elementu <input /> są renderowane przez kolejny blok - attributes - a tam widać, że jest dostęp do zmiennej $id, która przechowuje w tym przypadku poszukiwane przez Ciebie tooltip_valuationform_graphicProject_0.
peter13135
Doszedłem do takiego czegoś :
Kod
    {{ block('widget_attributes') }}

Co wyświetla
Kod
id="valuationform_graphicProject_0" name="valuationform[graphicProject]" required="required"

Ale... jak wyciągnąć wartość samego id ?
Crozin
No to rzuć jeszcze okiem na to co wyświetla "widget_attributes" i z jakich zmiennych korzysta - pisałem już przecież o tym post wcześniej.
usb2.0
tak może żeby nie spamić, pozwolę zadań sobie pytanie w Twoim temacie;)
odnośnie walidacji takiego formularza, załóżmy że w akcji index tworzę cały formularz, pojawia się tam metoda bindRequest ()i isValid(), reguły walidacji mam napisane w yaml'u. No i oczywiście, jeśli dane z formularza są poprawne chce przekazać je do innej akcji przez action w formularzu. No i tu sie rodzii problem, jeśli mam action do akcji innej niż index, to walidacja nie działa, natomiast jeśli action w ogole nie ma, lub jest to index/# to jest dobrze. Co to może byc?smile.gif

wygłupiłem sie sory;P
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.