Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SF][SF2][Symfony2]Wiele danych z jednej tabeli w entity type
Crash89
post
Post #1





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


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.

Ten post edytował Crash89 13.01.2017, 17:20:43
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
lukaskolista
post
Post #2





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


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).
Go to the top of the page
+Quote Post
Pilsener
post
Post #3





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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.
Go to the top of the page
+Quote Post
Crash89
post
Post #4





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


Tak, ale ja chcę je osobno ostylować a tutaj nie mam takiej możliwośći.
Go to the top of the page
+Quote Post
ohm
post
Post #5





Grupa: Zarejestrowani
Postów: 623
Pomógł: 144
Dołączył: 22.12.2010

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


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.

Ten post edytował ohm 16.01.2017, 11:54:54
Go to the top of the page
+Quote Post
Crash89
post
Post #6





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


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.
Go to the top of the page
+Quote Post
daniel1302
post
Post #7





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


https://symfony.com/doc/current/form/form_customization.html
Go to the top of the page
+Quote Post
Crash89
post
Post #8





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


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.

Go to the top of the page
+Quote Post
daniel1302
post
Post #9





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


Musisz powiedzieć systemowi szablonów, że dla Twojego formularza używasz innego theme formularzy.
Go to the top of the page
+Quote Post
Crash89
post
Post #10





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


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
Go to the top of the page
+Quote Post
daniel1302
post
Post #11





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


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
Go to the top of the page
+Quote Post
Crash89
post
Post #12





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


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>
Go to the top of the page
+Quote Post
kpt_lucek
post
Post #13





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

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


Tutaj dla przykładu, masz templatkę pod Bootstrap 3, możesz spokojnie się nią wzorować.
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: 23.08.2025 - 19:18