Etykiety

linux (14) php (14) Laravel (9) mysql (9) Hardware (8) Windows (6) sieci (5) PowerShell (4) software (4) MariaDB (3) apache (3) html (3) Microsoft (2) bezpieczeństwo LAN (2) cygwin (2) Akcesoria (1) CMS (1) Laptop (1) Open Office (1) drupal 7 (1) gpg (1) hosting (1) jquery (1) sieci LAN (1) xml (1) zabezpieczenie sieci LAN (1)

wtorek, 5 grudnia 2017

Wysyłanie wiadomości Email z PowerShell

Bywają sytuację, w których zależy nam na szybkim skorzystaniu z wiersza poleceń, na przykład aby niezawodnie wysłać wiadomość Email z komputera na którym ciężko jest uruchomić cokolwiek innego. Z doświadczenia wiem dobrze, że takie sytuacje zdarzają się nierzadko.

Czy wiedziałeś, że istnieje możliwość wysyłania wiadomości Email z wiersza poleceń PowerShell systemu Windows? Tak. Istnieje taka możliwość, a na dodatek jest to banalnie proste, pod warunkiem oczywiście, że mamy połączenie z internetem. Już wyjaśniam jak to zrobić.

W Windows PowerShell < v 2.0 wysyłanie wiadomości Email było nieco trudniejsze, lecz dziś można się w tym zakresie cieszyć sporym ułatwieniem. Od wersji 2.0 PowerShell'a, do wysyłania wiadomości Email w tym środowisku służy nam cmdlet
Send-MailMessage

Ten cmdlet może być stosowany na kilka różnych sposobów, a oto jego najbardziej popularne parametry:
– Attachments (łańcuch)
Pełna ścieżka i nazwy plików, które mają zostać dołączone do wiadomości e-mail.

–Bcc (łańcuch)
Pole BCC, zawierające adresatów.

–Body
Ciało (treść) wiadomości.

–BodyAsHtml
Tej opcji należy użyć jeśli ciało wiadomości ma zostać wysłane jako HTML.

–Cc (łańcuch)
Pole CC, zawierające adresatów.

–Credential (PSCredential)
Konto, które ma uprawnienia do wysyłania wiadomości e-mail. Domyślnym kontem jest bieżący użytkownik.

–DeliveryNotificationOption Opcja
Powiadomienia o dostarczeniu zostaną wysłane na adres e-mail podany w parametrze -From.

Możliwe opcje DeliveryNotificationOption:

None – Brak Powiadomienia (domyśłnie)
OnSuccess - Powiadom, jeśli dostawa zakończyła się powodzeniem.
OnFailure - Powiadom, jeśli dostawa nie zakończyła się powodzeniem.
Opóźnienie - Powiadom, jeśli dostawa jest opóźniona.
Nigdy - Nigdy nie powiadamiaj.

–Encoding Kodowanie
Kodowanie używane dla ciała i tematu

–From (łańcuch)
Adres Email, z którego wysyłana jest poczta.

–Priority Priorytet
Low, Normal, Hogh

–SmtpServer (łańcuch)
Serwer smtp, stosoway do wysyłania wiadomości

–Subject (łańcuch)
Temat wiadomości

–To (łańcuch)
Adresat - adres email adresata wiadomości

–UseSsl
Zastosuj protokół Secure Sockets Layer (SSL) aby nawiązać połączenie z serwerem SMTP i wysłać wiadomość e-mail. SSL nie jest domyślnie używany.

Nie trzeba tych parametrów dogłębnie studiować. Jak już wspomniałem wcześniej, wysyłanie wiadomości Email z PowerShell jest banalnie proste. Zobaczmy jak to działa na prostym przykładzie. Zauważymy, że w poniższym przykładzie będzie konieczne wprowadzenie poświadczeń dla serwera SMTP w okienku pojawiającym się natychmiast po zatwierdzeniu polecenia:

A oto przykładowy kod cmdleta Send-EmailMesage wraz z przykładowymi wartościami parametrów, które możesz dostosować do własnych potrzeb, aby szybko i efektownie wysyłać wiadomości Email bezpośrednio ze środowiska PowerShell:
$From = "adminexample.com"
$To = "user1@example.com"
$Cc = "user2@example.com"
$Attachment = "C:\temp\file.txt"
$Subject = "Wiadomość testowa"
$Body = "Treść przykładowej wiaodmości"
$SMTPServer = "smtp.example.com"
$SMTPPort = "587"
Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `
-Credential (Get-Credential) -Attachments $Attachment

Aby przetestować wysyłanie wiadomości Email z poziomu Windows PowerShell skopiuj i wklej powyższy kod do notatnika, dostosuj parametry do własnych potrzeb, skopiuj i wklej całość do okienka PowerShell, a następnie wprowadź poświadczenia konta SMTP. W przypadku wątpliwości lub jakichkolwiek pytań proszę o komentarze!

niedziela, 3 grudnia 2017

Ubezpieczenie sprzętu elektronicznego - Oto jak firmy robią nas w konia!

Przy zakupie nowego laptopa bądź innego przenośnego sprzętu elektronicznego spora ilość konsumentów decyduje się na wykupienie specjalnego ubezpieczenia, które zdaniem sprzedawcy miało by pokryć koszty naprawy w "każdym przypadku uszkodzenia".

Sprzedawcy chętnie nakłaniają klientów do "zainwestowania" w ubezpieczenie sprzętu elektronicznego, zapewniając, że daje ono całkowitą ochronę w przypadku zalania, pęknięcia, całkowitego zniszczenia itp. Wydając niemałą sumę pieniędzy na sprzęt elektroniczny, bardzo łatwo jest ulec takim sugestiom i wydać dodatkową kwotę na ubezpieczenie, szczególnie w przypadku gdy sprzedający zapewnia, że zabezpieczy ono konsumenta w przypadku wystąpienia uszkodzeń mechanicznych, które jak wiadomo, są najczęstszą przyczyną odmów naprawy sprzętu w ramach gwarancji. Swoją drogą jakiś czas temu opublikowałem artykuł dotyczący popularnych nieuczciwych praktyk serwisów gwarancyjnych.




Najczęściej ubezpieczenie sprzętu elektronicznego jest nam oferowane w sklepach dużych sieci handlowych, takich jak Saturn czy Media Markt. Prowizja, jaką otrzymują sklepy od towarzystw ubezpieczeniowych za pośrednictwo w takiej sprzedaży polis jest niemała. Sklepy i sprzedawcy bardzo dobrze zarabiają na takich produktach i dlatego zawsze proponują je klientom kupującym drogą elektronikę. Cena takiego ubezpieczenia zależy od jego wariantu, ale jest zawsze wysoka i często może sięgać ponad 25% wartości zakupionego sprzętu.




To jedno wielkie oszustwo


Bardzo niewiele ochrony za bardzo wysoką składkę - tak o ubezpieczeniach sprzętu elektronicznego mówi mec. Aleksander Daszewski z Biura Rzecznika Finansowego.

Z oficjalnego raportu wynika, iż obecnie do Rzecznika Finansowego wpływa średnio ponad 60 skarg miesięcznie w związku z ubezpieczeniami elektroniki zakupionymi w sklepach dużych sieci handlowych. Ale to tylko znikoma ilość przypadków, w świetle ogromnej ilości wprowadzonych w błąd konsumentów, którzy z różnych powodów nie decydują się złożyć skargi, pomimo odmowy odszkodowania ze strony zakładu ubezpieczeń. W rzeczywistości, niemalże w każdym przypadku roszczenia odszkodowania ze strony konsumenta, towarzystwo ubezpieczeniowe znajduje powód by stanowczo odmówić. Wyjątkiem są drobne szkody, w których wystarczy wymiana tanich elementów, takich jak obudowa, głośnik, złącze itp. itp

Ubezpieczenie sprzętu elektronicznego: skargi złożone przez konsumentów
Ubezpieczenie sprzętu elektronicznego: skargi złożone przez konsumentów. Źródło: Rzecznik Finansowy


W świetle oficjalnie złożonych przez konsumentów skarg najgorzej wypadają towarzystwa ubezpieczeniowe Ergo Hestia, Warta, Europa, PZU i Allianz.

Zapoznaj się z treścią OWU


Przed podjęciem decyzji o zakupie ubezpieczenia elektroniki naprawdę warto jest zapoznać się z treścią OWU - Ogólne Warunki Ubezpieczenia. Decydująca dla określenia zakresu odpowiedzialności ubezpieczyciela jest definicja "przypadkowego uszkodzenia", widniejąca w OWU. Odszkodowanie jest przyznawane tylko i wyłącznie w takich przypadkach, a definicja tego typu zdarzenia brzmi następująco:

"Za przypadkowe uszkodzenie uważa się uszkodzenie ubezpieczonego sprzętu wskutek nieszczęśliwego wypadku lub przepięcia prądu"

Według OWU "nieszczęśliwym wypadkiem" jest natomiast:

"Nagłe zdarzenie wywołane przyczyną zewnętrzną, wskutek którego uszkodzeniu uległ ubezpieczony sprzęt, który w chwili tegoż wypadku był użytkowany w sposób zgodny z instrukcją obsługi"

Zastanów się! Komu by się to opłacało?


Nie łudź się, że wykupując polisę ubezpieczeniową sprzętu elektronicznego, zostanie ci przyznane odszkodowanie w każdym przypadku uszkodzenia sprzętu. Zastanów się! Gdyby tak było, towarzystwa ubezpieczeniowe już dawno by zbankrutowały! Nikomu nie opłacało by się takie rozwiązanie i nikt by na tym nie zarobił. Większa część składek opłacanych przez posiadaczy tego typu polis przeznaczona jest na zapłatę prowizji pośredników, czyli sklepów oferujących konsumentom polisę!

Towarzystwa ubezpieczeniowe znajdują różne przyczyny odmowy odszkodowania, a niestety niemal zawsze są one zgodne z prawem. Rzecz w tym, że większość konsumentów - przeważnie ogarnięta zakupowym szałem - w ogóle nie analizuje treści OWU przed podjęciem decyzji o zawarciu umowy.

Bywają dziwne przypadki odmów odszkodowania jak przykładowo uznanie, że 16-miesięczne dziecko „celowo i umyślnie" wrzuciło laptopa do wanny - źródło: Rzecznik Finansowy. Gdy taką argumentację eksperci Rzecznika obalili, ubezpieczyciel próbował odmówić wypłaty, powołując się na to, że zgodnie z instrukcją obsługi laptopa, baterie powinny być przechowywane poza zasięgiem dzieci! Najczęstszą przyczyną odmowy odszkodowania ze strony towarzystw ubezpieczeniowych jest brak opisanego wyżej, tak zwanego czynnika zewnętrznego.

Oto lista przykładowych sytuacji, w których o odszkodowaniu możesz sobie tylko pomarzyć:
  • Popijałeś wodę i niechcący zalałeś laptopa lub telefon
  • Laptop, tablet bądź telefon wypadł ci z rąk i się rozwalił
  • Nadepnąłeś niechcący na laptopa
  • Biegłeś z laptopem, potknąłeś się i rozwaliłeś go całkowicie
  • Twój pies lub kot obsikał ci laptopa, a ten przestał działać
  • Telefon (np. Xperia) trzymałeś w tylnej kieszeni spodni i zgniotłeś go gdy usiadłeś

Czemu w powyższych sytuacjach możesz zapomnieć o odszkodowaniu, nawet jeśli posiadasz drogi wariant polisy? Otóż, zgodnie z definicją nieszczęśliwego wypadku i czynnika zewnętrznego, wylanie wody na laptopa lub inny sprzęt wynika wyłącznie z nieostrożności użytkownika i nie ma tu mowy o jakimkolwiek czynniku zewnętrznym. Upadek laptopa wskutek niepodjęcia właściwych środków ostrożności nie kwalifikuje się jako nieszczęśliwy wypadek, lecz wynika z winy użytkownika. Obsikanie laptopa przez psa też jest wynikiem niezachowania należytych środków ostrożności. Podobne wnioski można wyciągnąć dla pozostałych okoliczności, które widnieją na liście.

Największym problemem jest wprowadzanie konsumentów w błąd, jakoby ubezpieczenie pokrywało koszty zniszczenia sprzętu w każdym przypadku. To jest zupełnie niezgodne z rzeczywistością. Taka sytuacja wynika głównie z nieznajomości OWU ze strony sprzedawców kierujących się głównie motywem prowizyjnym lub ich chęci szybkiego zysku. Prowizje dla sklepów sięgają nawet 70% płaconych przez klienta składek. Bardzo często sprzedawcy są dodatkowo wynagradzani za uzyskany w ten sposób dochód.

Jak uzyskać odszkodowanie


W przypadku odmowy odszkodowania w ramach ubezpieczenia elektroniki należy złożyć pisemną reklamację do towarzystwa ubezpieczeniowego. W przypadku negatywnego rozpatrzenia reklamacji ze strony towarzystwa ubezpieczeniowego warto skontaktować się z Rzecznikiem Finansowym, który w większości przypadków jest w stanie skutecznie pomóc konsumentom.

sobota, 2 grudnia 2017

Laravel od Podstaw: kompozytor widoku

W poprzedniej części szkolenia p.t. Szablony widoków i style CSS nauczyliśmy się pracować ze złożonymi szablonami widoków. Zobaczyliśmy jak uprościć sobie pracę w przypadku widoków złożonych z wielu sekcji, takich jak menu nawigacyjne, boczna kolumna, stopka, zawartość główna. W tej części szkolenia zaprezentuję kolejną ważną ciekawostkę ułatwiającą pracę z widokami, a mowa będzie o Laravel View Composer, czyli o kompozytorze widoków.

Czym jest Laravel View Compser? Otóż wyobraźmy sobie że zawartość naszej szkoleniowej prawej kolumny widoku powinna być dynamiczna. Niech to będzie przykładowo lista najnowszych postów. Załóżmy, że taka lista powinna się wyświetlać w prawej kolumnie w każdym widoku witryny. Pamiętając część szkolenia dotyczącą sposobu przekazywania wartości zmiennych do widoków, teoretycznie moglibyśmy do każdego z widoków, który zawiera prawą boczną kolumnę, przekazać tego typu listę postów, uzyskaną za pomocą przygotowanej w tym celu metody naszej klasy Post. To by zadziałało, ale nie było by to najlepsze rozwiązanie zadania, ponieważ powielanie kodu nie należy do dobrych praktyk programistycznych. W rzeczywistości wyglądało by to paskudnie, gdyby w każdej z funkcji zwracającej widok mielibyśmy się powtarzać:
 public function index() {

   $posts = Post::all();

   $newest = Post::newest(5);

   return view('posts.index', compact('posts', 'newest'));

 }

public function create() {

    $newest = Post::newest(5);

    return view('posts.create', compact('newest'));

}

Na szczęście jest na to lepsze rozwiązanie, a kod powyższych metod można uprościć:
 public function index() {

   $posts = Post::all();

   return view('posts.index', compact('posts'));

 }

public function create() {

    return view('posts.create');

}

Zanim jednak przejdę do najważniejszej części tego tematu, przedstawię metodę Post::newest(), czyli funkcję zwracającą żądaną ilość najnowszych postów. Metoda znajdująca się wewnątrz ciała klasy Post, czyli w pliku app/Post.php wygląda następująco:
 public static function newest($n) {

    return static::latest('created_at')->take($n)->get();

 }

Powyższa funkcja typu static zwraca listę postów uporządkowanych malejąco według ich czasu utworzenia, czyli na samej górze listy znajdują się najnowsze posty. Lista zawiera ostatnie $n postów. W parametrze $n możemy zapodać limit listy postów.

Zakładając, że w miejscu :n wstawimy wartość $n, efekt zastosowanych w naszej funkcji metod Eloquent'a jest taki sam jak w przypadku zapytania SQL:
SELECT * from posts order by created_at desc limit :n

Gdy projektujemy tego typu metodę warto ją sobie przetestować interaktywnie w php artisan tinker. Zobaczmy jak działa metoda Post::newest():



Modyfikujemy szablon widoku prawej kolumny


Aby lista najnowszych postów mogła się prawidłowo wyświetlać w prawej kolumnie widoku, należy odpowiednio dopasować nasz szkoleniowy szablon widoku. Dostosujmy więc omówiony w poprzednim szkoleniu szablon kolumny bocznej do następującego stanu:
<aside class="col-sm-3 ml-sm-auto blog-sidebar">

  <div class="sidebar-module">

        <h4>Najnowsze posty</h4>

        <ol class="list-unstyled">

                @foreach ($newest as $post)

                <li><a href="{{asset('/posty/'.$post->id)}}">{{$post->title}}</a></li>

                @endforeach

        </ol>

  </div>

</aside><!-- /.blog-sidebar -->

Kompozytor widoku


Funkcje kompozytora widoku to wywołania zwrotne lub metody klasy wywoływane podczas renderowania widoku. Jeśli masz dane, które chcesz powiązać z widokiem za każdym razem, gdy widok jest renderowany, kompozytor widoku może pomóc uporządkować tę logikę w jednym miejscu. Aby w naszym szkoleniowym przykładzie wywoływanie metody Post::newest() nie było konieczne z osobna dla każdego widoku w skład którego wchodzi nasza szkoleniowa lista postów, z pomocą przychodzi nam Laravel View Composer. Zobaczmy jak to działa w praktyce! Wewnątrz metody boot() w pliku
app/Providers/AppServiceProvider.php
należy umieścić następującą funkcję, która ma za zadanie przekazać do widoku bocznej kolumny listę najnowszych pięciu postów, uzyskaną poprzez metodę Post::newest():
view()->composer('layouts.aside', function($view) {

    $view->with('newest', Post::newest(5));

 });

Nie zapomnijmy na samej górze pliku, przed deklaracją klasy, umieścić
use App\Post;

Zobaczmy teraz jakie efekty przyniosła nasza praca:

Nasz szkoleniowy widok listy postów
Nasz szkoleniowy widok listy postów


Nasz szkoleniowy widok zawartości posta
Nasz szkoleniowy widok zawartości posta


Nasz szkoleniowy widok tworzenia nowego posta

Nasz szkoleniowy widok tworzenia nowego posta


Podsumowanie


W tej części szkolenia poznaliśmy kompozytor widoku, którego stosowanie ułatwia nam pisanie czystego i niepowielającego się kodu. W kolejnej części szkolenia mam zamiar opisać podstawowe mechanizmy uwierzytelniania w Laravel.

piątek, 1 grudnia 2017

Laravel od podstaw: szablony widoków i style CSS

W poprzednich częściach szkolenia nauczyliśmy się, między innymi, jak tworzyć trasy, widoki i kontrolery zasobów. Dowiedzieliśmy się jak odczytywać dane z tabeli bazy danych i przekazywać je do widoków oraz jak zapisywać w tabeli bazy danych informacje wprowadzane przez użytkowników do formularza HTML. Omówiłem również walidację formularzy oraz zabezpieczenia przed atakami CSRF – Cross-SIte Request Forgery.

Moje przykłady były bardzo uproszczone, szczególnie jeśli chodzi o elementy HTML oraz stylizację CSS widoków. Sądzę, że nadszedł już czas aby zająć się i tym aspektem frameworka Laravel.

W niniejszej części szkolenia wprowadzę temat widoków z szablonami oraz arkuszy CSS w Laravel. Zademonstruję te podstawowe front-endowe aspekty Laravel korzystając z szablonu HTML udostępnionego w witrynie https://getbootstrap.com/, który postaramy się razem odtworzyć w Laravel, zachowując podobne zasady strukturalne, czyli menu nawigacyjne, prawą kolumnę, zawartość główną oraz stopkę.

Dla celów niniejszej części szkolenia wykorzystam szablon Bootstrap'a, który wygląda tak:

Przykładowy szablon Bootstrap
Przykładowy szablon Bootstrap

Zachęcam do zapoznania się ze strukturą tego szablonu. W tym celu warto podejrzeć i przeanalizować jego kod HTML.

Złożone widoki i szablony w Laravel


Załóżmy, że projektujemy witrynę internetową, wizualnie złożoną z menu, zawartości głównej, prawej kolumny bocznej oraz stopki. Załóżmy w celach szkoleniowych, że menu, prawa kolumna oraz stopka mają mieć zawsze taką samą zawartość, niezależnie od podstrony, natomiast zawartość główna ma się zmieniać w zależności od otwieranej podstrony. Oczywiście, że nie ma sensu powielać kodu HTML menu, prawej kolumny, bądź stopki na każdej z podstron. Jak do tej kwestii podejść w środowisku Laravel? Przejdźmy teraz do praktyki.

Do dzieła


Aby rozpocząć stwórzmy sobie w przestrzeni naszej aplikacji szkoleniowej katalog zawierający tak zwane szablony widoków aplikacji. Osobiście chętnie umieszczam szablony pod resources/views/layouts względem głównego katalogu aplikacji. Tworzymy katalog szablonów:
resources/views/layouts

Następnie stwórzmy nasz główny szablon, na którym będą się opierały wszystkie widoki naszej aplikacji. Można tego typu szablon nazwać przykładowo master.blade.php, a następnie zapiszmy nasz szablon w katalogu szablonów, czyli:
resources/views/layouts/master.blade.php

Zakładam, że czytelnicy śledzili poprzednie części szkolenia i wiedzą co oznacza w Laravel i jaką pełni funkcję rozszerzenie .blade. Jeśli nie, zachęcam do zapoznania się z tym tematem.

Ponieważ nasza szkoleniowa struktura witryny ma się opierać na szablonie Bootstrap'a, warto załączyć główne style CSS Bootstrap'a korzystając z udostępnianego w tym celu przez Bootstrapa CDN'a, a następnie style CSS konkretnego szablonu zapisać lokalnie na serwerze aplikacji.

W celach związanych z niniejszym tematem szkolenia, kod html naszego przykładowego szablonu Bootstrap'a dzielę na kilka części i zapisuję je w katalogu resources/views/layouts:
  • master.blade.php - szablon główny
  • nav.blade.php - menu nawigacyjne
  • aside.blade.php - prawa kolumna boczna
  • footer.blade.php - stopka

Style CSS Bootstrap'a załączam jako odnośnik CDN w master.blade.php i dodaję odnośnik do lokalnego arkusza CSS ze stylami wybranego szablonu, który zachowuję w pliku public/css/blog.css

Kod naszego szablonu głównego master.blade.php, czyli podstawowego szablonu naszej aplikacji web, wygląda następująco:
<!doctype html>

<html lang="en">

  <head>

    <meta charset="utf-8">

    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <meta name="description" content="">

    <meta name="author" content="">

    <title>Szablon Bootstrap w Laravel</title>

    <!-- Główne style CSS Bootstrap - CDN -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-           beta.2/css/bootstrap.min.css"
          integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb"
          crossorigin="anonymous">

     <!-- Style CSS tego szablonu Bootstrap -->
     <link rel="stylesheet" href="{{ asset('css/blog.css') }}">

  </head>

  <body>

  {{-- W tym miejscu szablon menu --}}

   @include('layouts.nav')

    <main role="main" class="container">

      <div class="row">

        <div class="col-sm-8 blog-main">

        {{-- To jest miejsce na dynamiczną zawartość główną --}}

        {{-- Tu pojawia się zawartość bloku o nazwie 'content' --}}

        @yield('content')

        </div><!-- /.blog-main -->

        @include('layouts.aside')
 
      </div><!-- /.row -->

    </main><!-- /.container -->

     {{-- Tutaj szablon stopki --}}

     @include('layouts.footer')

 </body>

</html> 

Zawartość nav.blade.php:
<header>
   <div class="blog-masthead">
     <div class="container">
       <nav class="nav">
         <a class="nav-link active" href="#">Home</a>
         <a class="nav-link" href="#">About</a>
       </nav>
     </div>
   </div>

   <div class="blog-header">
     <div class="container">
       <h1 class="blog-title">The Bootstrap Blog</h1>
       <p class="lead blog-description">An example blog template</p>
     </div>
   </div>
</header>

Zawartość aside.blade.php:
<aside class="col-sm-3 ml-sm-auto blog-sidebar">
  <div class="sidebar-module sidebar-module-inset">
        <h4>About</h4>
        <p>Etiam porta <em>sem malesuada magna</em> mollis euismod.</p>
  </div>
  <div class="sidebar-module">
        <h4>Archives</h4>
        <ol class="list-unstyled">
          <li><a href="#">March 2014</a></li>
          <li><a href="#">February 2014</a></li>
          <li><a href="#">January 2014</a></li>
        </ol>
  </div>
  <div class="sidebar-module">
        <h4>Elsewhere</h4>
        <ol class="list-unstyled">
          <li><a href="#">GitHub</a></li>
          <li><a href="#">Twitter</a></li>
          <li><a href="#">Facebook</a></li>
        </ol>
  </div>
</aside><!-- /.blog-sidebar -->

Zawartość footer.blade.php:
<footer class="blog-footer">
      <p>Blog template built for <a href="https://getbootstrap.com/">Bootstrap</a> by <a href="https://twitter.com/mdo">@mdo</a>.</p>
      <p>
        <a href="#">Back to top</a>
      </p>
 </footer>

Następnie, aby wykorzystać stworzony system szablonów w naszej szkoleniowej aplikacji, zmieniam zawartość wszystkich widoków - nad którymi pracowaliśmy w poprzednich częściach szkolenia - w przedstawiony poniżej sposób.

Widok listy postów index.blade.php:
@extends('layouts.master')

 @section('content')

  <h1>Lista postów</h1>

  <ul>

   @foreach ($posts as $post)

    <li><a href="posty/{{ $post->id }}">{{ $post->title  }}</a></li>

   @endforeach

 </ul>

 @endsection


Nasz nowy szkoleniowy widok listy postów
Nasz nowy szkoleniowy widok listy postów

Widok zawartości posta show.blade.php:
@extends('layouts.master')

@section('content')


 <h1>{{$post->title}}</h1>

  <hr>

  <p>{{ $post->body }}</p>

@endsection


Nasz nowy widok zawartości posta
Nasz nowy widok zawartości posta

Widok formularza nowego posta:
@extends('layouts.master')

@section('content')

 <form method="POST" action=" {{asset('/posty')}} ">

   {{ csrf_field() }}

  <div class="form-group">
    <label for="title">Tytuł:</label>
    <input type="text" class="form-control" id="title" name="title">
  </div>

  <br />

  <div class="form-group">
    <label for="body">Treść:</label>
    <textarea id="body" class="form-control" name="body"></textarea>
  </div>

  <br />

  <div class="form-group">
    <button type="submit" class="btn btn-primary">Zapisz</button>
  </div>

 </form>

        <ul>

                @foreach ($errors->all() as $error)

                        <li>{{$error}}</li>

                @endforeach


        </ul>

@endsection



Nasz nowy widok tworzenia posta
Nasz nowy widok tworzenia posta


Jak to działa?


W widoku głównym umieściłem kilka funkcji PHP. Funkcja include() ma standardowy efekt PHP include(), czyli załącza określoną zawartość w miejscu jej wywołania. Ciekawym rozwiązaniem Laravel'a jest natomiast funkcja yield(), która określa miejsce wstawienia do szablonu zawartości obecnej w określonym bloku kodu, oznaczonym funkcjami section() i endsection() w pliku widoku, który rozszerza zawartość szablonu funkcją extends().

Podsumowanie


W tej części szkolenia pokazałem jak korzystać z szablonów w przypadku nieco złożonej struktury witryn internetowych. Na przykładzie szablonu HTML Bootstrap'a zbudowałem szkoleniowy przykładowy szablon, opatrzony w arkusze CSS Bootstrap'a oraz zastosowałem w jego widokach odpowiednie klasy CSS. Efektem jest przykład widoków, ze strukturą złożoną z sekcji stałych oraz dynamicznej zawartości głównej, która się zmienia w zależności od otwieranej podstrony. Jest to oczywiście przykład szkoleniowy, lecz można go swobodnie dostosować do własych potrzeb.

W kolejnych częściach szkolenia powrócę do spraw back-endowych i bardziej złożonych zagadnień Laravel'a.

Serdecznie zapraszam do kolejnej części szkolenia Laravel od podstaw, p.t. Kompozytor widoku