Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2][Symfony2]Wiele danych z jednej tabeli w entity type
Forum PHP.pl > Forum > PHP > Frameworki
Crash89
Witam,

Chcę wyświetlić w formularzu dla pola entity wszystkie pola kolumny tego entity z bazy danych w formularzu przy radio button.
(kolumny takie jak opis, cena)
W tej chwili mogę pobrać tylko jedno pole (choice_label w form type), jak coś takiego zrobić przez entityType::class?

Domyślam się że pewnie będę musiał stworzyć nowe pole typu formularza, a może się jednak da przez entity type?

Pracuję na symfony 3.


edit:
Czy może najlepszym wyjściem jest pominięcie formularzy symfonowych i zrobienie tego w zwykłym htmlowym formularzu, a dane po prostu pobrać z bazy danych i ustawić w widoku ?

Może wyjaśnię to bardziej:

Chcę wyświetlić przy polu formularza 3 dane pochodzących z pola entity: nazwe, opis i cene.
Polem tym jest radio button. Normalnie mogę z tych danych pobrać tylko jedną daną, poprzez atrybut choice_label w formType.
W tym formularzu chcę wybrać metodę przesyłki gdzie opisem mają być te trzy dane umieszczone w różnych miejscach, wiem że trzeba będzie przygotować form_widget dla tego pola.
lukaskolista
Czemu po prostu nie ustawisz atrybutu choice_label na wartość stworzoną z tych 3 pól? Umieszczenie tego w widoku będzie o tyle problematyczne, że musisz rozbić wtedy cały formularz i nie wyrenderujesz go prostą funkcją twiga (nie pamiętam jak to w symfony było).
Pilsener
No to jaki problem w entity zrobić:

  1. public function getFullName(){
  2.  
  3. return $this->firstname.' '.$this->surname;
  4. }


A w formularzu:
  1. $builder->add('user', EntityType::class, ['class'=>'AppBundle:User', 'choice_label'=>'fullName']);


Drugie rozwiązanie, to dodanie callbacka w samym formularzu (gdy nie chcesz zaśmiecać encji nawet takimi metodami)
  1. 'choice_label' => function ($user) {
  2. return $user->getFirstname().' '.$user->getSurname();
  3. }
- jest to przecież wyraźnie opisane w dokumentacji.
Crash89
Tak, ale ja chcę je osobno ostylować a tutaj nie mam takiej możliwośći.
ohm
Co chcesz konkretnie ostylować?
Robisz pole jako EntityType (z expanded => true, multiple => false - czyli generujesz radiochoice) , tak jak koledzy niżej pisali, dorzucasz callbacka żeby pobrać wybrane dane.
W twigu w którym renderujesz formularz zmieniasz mu na własny form_theme na jakiś Twój utworzony w którym możesz sobie dowoli stylować wybrane bloki
https://symfony.com/doc/current/form/form_c...theming-in-twig


Cytat
Czy może najlepszym wyjściem jest pominięcie formularzy symfonowych i zrobienie tego w zwykłym htmlowym formularzu, a dane po prostu pobrać z bazy danych i ustawić w widoku ?


Raczej polecam używać formularzy z symfony, jeśli je ogarniesz to będzie Ci w przyszłości dużo łatwiej i szybciej tworzyć kolejne formularze. Nie mówiąc już o dużo wygodniejszej walidacji takich formularzy oraz zapisie danych przez nie.
Crash89
Jeden wiersz formularza (wyboru przesyłek może być kilka) zawiera opis, cene online i cene przy odbiorze.
Chcę oddzielnie ostylować opis i ceny, tak żeby to jakoś wyglądało. A nie wszystko w jednej linii, jak się dzieje w tym wypadku przy dodaniu metody w entity.
Crash89
Poczytałem i chyba wiem co należy zrobić ale nie mogę znaleźć linijki kodu która odpowiada za wyświetlenie choice_label w formularzu, robię to tak:

W entity tworzę nową metodę:
  1. public function getDescriptionShipment()
  2. {
  3. return $this->name . ' <span class="class">' . $this->description . ' </span> <span>Płatność online: ' . $this->priceOnline . ' </span> <span>przy odbiorze: ' . $this->priceTackle . '</span>';
  4. }


W formularzu dodaję je jako choice label.

I tutaj przed formularzem nadpisuję ten widget:

  1. {%- block choice_widget_expanded -%}
  2. <div {{ block('widget_container_attributes') }}>
  3. {%- for child in form %}
  4. {{- form_widget(child)|raw -}}
  5. {{- form_label(child, null, {translation_domain: choice_translation_domain})|raw - }} // W tej linijce dodałem raw, dzięki niemu nie wyswietlane sa tagi html
  6. {% endfor -%}


Niestety to nie przynosi efektu, w widoku zostają wyświetlone tagi html (span) a chcę żeby tego nie wyświetlało.
Nie wiem czy to odpowiada za wyświetlenie choice_label dla expanded w symfony. Wydaje mi się że wystarczy znaleźć to miejsce i dodać raw do tego i będzie po problemie.

daniel1302
Musisz powiedzieć systemowi szablonów, że dla Twojego formularza używasz innego theme formularzy.
Crash89
Cytat(daniel1302 @ 17.01.2017, 18:40:53 ) *
Musisz powiedzieć systemowi szablonów, że dla Twojego formularza używasz innego theme formularzy.


Jeśli chodzi o to:
  1. {% form_theme form _self %}


To coś takiego dodaje
daniel1302
Ciężko mi jest powiedzieć cos więcej bo dawno nie stylizowałem szablonów, ale zobacz na githuba do domyślnego stylu i podmień to co potrzebujesz:
https://github.com/symfony/symfony/blob/mas...ayout.html.twig


A pozostałe masz tutaj:
https://github.com/symfony/symfony/tree/mas...rces/views/Form
Crash89
Cytat(daniel1302 @ 18.01.2017, 08:25:14 ) *
Ciężko mi jest powiedzieć cos więcej bo dawno nie stylizowałem szablonów, ale zobacz na githuba do domyślnego stylu i podmień to co potrzebujesz:
https://github.com/symfony/symfony/blob/mas...ayout.html.twig


A pozostałe masz tutaj:
https://github.com/symfony/symfony/tree/mas...rces/views/Form


Teraz jestem pewny że, ta linijka odpowiada za wyświetlenie opisu do radio:

  1. {{- form_label(child, null, {translation_domain: choice_translation_domain}) |raw -}}


Chcę teraz żeby mi nie wyświetlało tagów html, niestety dodanie raw nie działa.
Czy jest jakiś inny sposób żeby to zrobić?


Udało mi się do tego dojść, trzeba wyswietlić etykietę do radio ręcznie, coś takiego:
  1. <ul class="radio">
  2. {% for radio in form.shipment %}
  3. <li>
  4. <label for="form_shipment_{{ loop.index }}" class="required">{{ radio.vars.label|raw }}</label>
  5. {{ form_widget(radio) }}
  6. <div class="check"></div>
  7. </li>
  8. {% endfor %}
  9. </ul>
kpt_lucek
Tutaj dla przykładu, masz templatkę pod Bootstrap 3, możesz spokojnie się nią wzorować.
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.