Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2]Stylizacja formularzy
Forum PHP.pl > Forum > PHP > Frameworki
mimol
Witam, Mam kod
  1. {% for carrier in carriers %}
  2. <tr class="{% if loop.first %}first_item{% endif %} item">
  3. <td class="carrier_action radio"><input name="my_moviesbundle_orderscarriertype[carrier]" value="{{ carrier.id }}" id="my_moviesbundle_orderscarriertype_carrier_{{ carrier.id }}"{% if loop.first %} checked="checked" {% endif %}type="radio"></td>
  4. <td class="carrier_name"><label for="id_carrier2">{{ carrier }}</label></td>
  5. <td class="carrier_infos">{{ carrier.description }}</td>
  6. <td class="carrier_price"><span class="price">{{ carrier.price|price }}</span></td>
  7. </tr>
  8. {% endfor %}


Jak coś takiego mogę osiągnąć używając formularzy z symfony? Potrzebuję jakoś renderować te radio inputy pojedynczo...
pedro84
Przeczytaj to dokładnie => Rendering each Field by Hand.
mimol
{% block _my_moviesbundle_orderscarriertype_carrier_2_widget %}
<td class="carrier_action radio">
{{ block('radio_widget') }}
</td>
<td class="carrier_name"><label for="id_carrier2">{{ carriers[1] }}</label></td>
<td class="carrier_infos">{{ carriers[1].description }}</td>
<td class="carrier_price"><span class="price">{{ carriers[1].price|price }}</span></td>
{% endblock %}

Dostaje błąd Variable "carriers" does not exist... Czy idę w dobrym kierunku?
Jeśli udało by mi się uzyskać dostęp do tych zmiennych to było by już gotowe
thek
Carriers to zmienna przekazana do widoku. Wszystko więc zależy od tego co i jak chcesz tam wepchnąć. Przykładowo ja sobie w pewnych wypadkach rejestruję pewne dodatkowe zmienne podczas tworzenia formularza i wymagam ich poprzez zmienną $options. Jest to dość popularna technika. Zmienną taką potem w twigu mogę dość swobodnie operować. To co Ty robisz to niejako pójście o jeszcze jeden krok dalej... Tyle że moim zdaniem o jeden za daleko wink.gif Owszem możesz iść w stylizację konkretnych pól na zasadzie widocznej tutaj choćby: http://symfony.com/doc/master/cookbook/for...tomization.html , ale może to już być nieco zbyt skomplikowane jeśli nie ogarniasz jeszcze zbytnio symfony2, ponieważ wiele rzeczy w dokumentacji i cookbooku na ten temat nie ma. O tym, że części rzeczy nie dowiesz się bez grzebania w bebechach, nie wspomnę smile.gif Podpowiem tylko jedno... Wspomniany na cookbooku plik https://github.com/symfony/symfony/blob/2.1...ayout.html.twig to naprawdę świetny punkt wyjścia do rozgryzania stylizacji od środka. Ale to już podejście dla osób, które coś w Symfony2 liznęły i jakoś kumają Twiga. Inaczej po prostu to zderzenie z niezrozumałym klocem kodu.
mimol
@thek
Dzięki, już sobie poradziłem, jednak pojawił się DUŻOOOO większy problem
  1. {% for carrier in carriers %}
  2. <tr class="{% if loop.first %}first_item{% endif %} item">
  3. <td class="carrier_action radio"><input name="{{ OrderForm.carrier.vars.full_name }}"
  4. value="{{ carrier.id }}"
  5. id="{{ OrderForm.carrier.vars.id }}_{{ carrier.id }}"{% if loop.first %}
  6. checked="checked" {% endif %}type="radio"></td>
  7. <td class="carrier_name"><label for="id_carrier2">{{ carrier }}</label></td>
  8. <td class="carrier_infos">{{ carrier.description }}</td>
  9. <td class="carrier_price"><span class="price">{{ carrier.price|price }}</span></td>
  10. </tr>
  11. {% endfor %}

Odnośnie problemu...
  1. public function buildForm(FormBuilderInterface $builder, array $options)
  2. {
  3. $builder
  4. ->add(
  5. 'carrier',
  6. 'entity',
  7. 'class' => 'MyDefaultBundle:Carrier',
  8. 'property' => 'name',
  9. 'multiple' => false,
  10. 'label' => ' '
  11. )
  12. );
  13. }

Jeśli dopiszę extended => true (wtedy jest renderowana jako radio input) to formularz przechodzi walidacje dla NIE POPRAWNEGO carrier_id (takiego, którego nie ma w bazie). Nie wiem, czy tylko ja zaobserwowałem taki przypadek, czy to jest jakaś luka w bezpieczeństwie.
thek
Nie... Problemem jest to, że w encjach połączonych relacjami trzeba dodatkowo wymusić walidację także w encjach zależnych, inaczej domyślnie nie jest ona przeprowadzana. Kiedyś było to przeprowadzane zawsze, ale jak słusznie zauważono, jest to w wielu przypadkach bezsensowne. Przykład? Walidując jakąś operację zakupu, walidujesz także produkt jakiego on dotyczy? Nie smile.gif Potrzebny Ci tylko jego identyfikator. Dlatego zostało to zarzucone i obecnie jeśli chcesz coś zależnego zwalidować, oznaczasz to ustawiając na true opcję cascade_validation podczas definiowania form type LUB w definicji encji przy relacji oznaczamy, iż powinno się używać walidacji. Jak? @Assert/Valid ale nie wiem jak Ty masz całość zbudowaną więc zobacz w sieci oba warianty i wybierz ten dla siebie.
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.