---
# System prepended metadata

title: Kurs WWW. Lista nr 8
tags: [pwit, www20]

---

# 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!).