# Kurs WWW. Lista nr 8
###### tags: `www20` `pwit`
:::info
grupa PWit, wtorki 12-14
:::
## Deklaracje
:::info
Studenci wypełniają poniższą tabelkę przed rozpoczęciem zajęć.
:::
Gotowość rozwiązania zadania należy wyrazić poprzez postawienie X w odpowiedniej kolumnie!
Można również wyrazić chęć prezentacji któregoś zadeklarowanych zadań za pomocą znaku ==X== (X na żółtym tle).
| | 7.8 | 8.1 | 8.2 | 8.3 | 8.4 | 8.5 |
|--------------------------- | ----- | ----- | ----- | ----- | ----- | ----- |
| Kacper Bajkiewicz | | X | X | X | X | X |
| Jakub Bok | | | | | | |
| Kamila Brzozowska | | | | | | |
| Monika Jędrzejkowska | | | | | | |
| Karol Kęciński | | | | | | |
| Szymon Kiczak | | | | | | |
| Szymon Kosakowski | | | | | | |
| Denys Lukeniuk | | x | x | x | x | |
| Piotr Mańkowski | | | | | | |
| Mateusz Materek | | | | | | |
| Sonia Pawluk | | | | | | |
| Patryk Pęczak | | | | | | |
| Bartosz Polaszek | | | | | | |
| Marcin Rogala | | x | x | | x | |
| Aleksander Szymański | | | | | | |
| Jakub Świgło | | | | | | |
| Nikola Wrona | | | | | | |
## Zadanie 7.8
:::danger
Autor:
:::
## Zadanie 8.1
:::danger
Autor: Kacper Bajkiewicz
:::
Po instalacji najpiew Composera a następnie Symfony, żeby utworzyć nowy projekt, wpisujemy w konsolę polecenie z wykładu:
```composer create-project symfony/website-skeleton my_project_name```
Polecenie ```about``` mówi o nam o aktualnej wersji php, symfony i jądra, a także np o tym, gdzie trzymane są pliki cache, ilu bitowa architektura jest wykorzystywana + jaka jest używana strefa czasowa.
Polecenie ```router:match``` służy do sprawdzenia, jakie ścieżki pasują do URL w argumencie jego wywołania. Przydaje się to w debugowaniu ścieżek i w naprawianiu problemów z routingiem.
## Zadanie 8.2
:::danger
Autor: Marcin Rogala
:::
Controller przez funkcję render zwraca tablicę zawierającą wpisy do rankingu. Dane przekazywane są do szablonu.
Kod controllera: https://pastebin.com/C7SjEJkr
Szablon uzupełnia tabelę z html odwołując się do danych z controllera przez zmienną ranking. Rozpatrujemy trzy przypadki, żeby ustawić odpowiednią klasę z pliku style.css.
Wykorzystujemy następujące możliwości szablonu twig:
1. Iterowanie po wpisach do rankinu
```
{% for entry in ranking %}
{% endfor %}
```
2. Rozpatrywanie przypadków
```
{% if warunek %}
{% elseif warunek %}
{% endif %}
```
Style css załączemy używając:
```
<link rel="stylesheet" href="{{asset('/css/style.css')}}">
```
Funkcja asset() zwraca poprawną ścieżkę do pliku style.css.
Kod szablonu: https://pastebin.com/b9Z2uYtw
## Zadanie 8.3
:::danger
Autor: Denys Lukeniuk
:::
## Zadanie 8.4
:::danger
Autor: Marcin Rogala
:::
Encję tworzymy poleceniem:
```
php bin/console make:entity
```
Do konsoli podajemy następujące informacje o polach encji:
1. Nazwa
2. Typ danych
3. Dlugość
4. Czy pole może być nullem
Walidację encji wykonujemy używając
```
@Assert\Regex("")
```
Kod encji: https://pastebin.com/6RiGwe6D
## Zadanie 8.5
:::danger
Autor: Kacper Bajkiewicz
:::
W tym zadaniu trzeba utworzyć formularz do wykonywania przelewów i zrobić jakąś niezbyt zaawansowaną walidację (ja zrobiłem formularz do płacenia kartą). Encji nie będę tu wrzucał, bo jest bardzo podobna do tej z zadania 4tego.
Szablony do renderowania stron wyglądają następująco:
Tutaj ten do wpisywania danych:
```
{% extends 'base.html.twig' %}
{% block title %}Płatność!{% endblock %}
{% block body %}
<div id="form">
{{ form(form) }}
</div>
{% endblock %}
```
A tutaj ten do wyświetlenia poprawnie wpisanych danych (już po walidacji):
```
{% extends 'base.html.twig' %}
{% block title %}Podsumowanie płatności{% endblock %}
{% block body %}
<div id="container">
{{name}}<br>
{{surname}}<br>
{{cardNumber}}<br>
{{cvc}}<br>
{{amount}}<br>
</div>
{% endblock %}
```
Omawianie kontrolera podzielę na dwie części. Kiedy chcemy wysłać wpisane dane na serwer.
```
public function TransferPost(Request $request): Response
{
$transfer = new TransferModel();
$form = $this->createFormBuilder($transfer)
->add('name', TextType::class, ['label' => 'Imię'])
->add('surname', TextType::class, ['label' => 'Nazwisko'])
->add('cardNumber', TextType::class, ['label' => 'Numer karty'])
->add('cvc', TextType::class, ['label' => 'Numer CVC'])
->add('amount', TextType::class, ['label' => 'Kwota'])
->add('save', SubmitType::class, ['label' => 'Wyślij'])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = [
'name' => $form->getData()->getName(),
'surname' => $form->getData()->getSurname(),
'cardNumber' => $form->getData()->getCardNumber(),
'cvc' => $form->getData()->getCVC(),
'amount' => $form->getData()->getAmount(),
];
$response = $this->forward('App\Controller\TransferController::TransferSuccess', $data);
return $response;
}
return $this->render('transfer/index.html.twig', [
'form' => $form->createView(),
]);
}
```
Najpierw tworzymy w niej formularz z odpowiednimi polami i jeśli nie został on wysłany lub jest wypełniony niepoprawnymi danymi, to rednerujemy go od nowa. Jeśli zaś przejdziemy ifa w tej funkcji, to renderujemy stronę z wyświetlaniem poprawnych danych, przekazując jej argumenty z tego formularza. Odpowiada za to funkcja:
```
/**
* @Route("/success", name="success")
*/
public function TransferSuccess($name, $surname, $cardNumber, $cvc, $amount): Response
{
return $this->render('transfer/success.html.twig', [
'name' => $name,
'surname' => $surname,
'cardNumber' => $cardNumber,
'cvc' => $cvc,
'amount' => $amount,
]);
}
```
Odpowiadając na pytanie z ćwiczeń, żeby dołączyć do tego formularza jakiś arkusz styli CSS, musimy w pliku twig dodać taką linijkę:
```
{% block stylesheets %}<link href="{{ asset('XXX') }}" rel="stylesheet"/>{% endblock %}
```
Gdzie XXX to ścieżka do arkuszu include'owanego stylu (ale względem folderu public!).