PHPPamokos.lt


11. Mūsų pilnas projektas

Taigi, atėjo laikas apibendrinti viską, ką jau išmokome, ir pritaikyti, užbaigiant savo pirmąjį projektą - mūsų kuriamą krepšinio aikštelių duomenų bazę.

Iki šiol mes, iš esmės, padarėme karkasą ir sudėliojome reikalingus MVC failus į vietas. Taip pat sukūrėme administravimo įrankį, kad galima būtų valdyti informaciją. Bet praktiškai nieko nedarėme su išoriniu vaizdu - juk mūsų puslapyje dar neveikia pati aikštelių paieška, tai kokia iš jo prasmė?

Iki projekto užbaigimo liko šios dalys:

  • Titulinis puslapis - 10 naujausių aikštelių
  • Aikštelių paieška ir rezultatų puslapio veikimas
  • Konkrečios aikštelės atvaizdavimas
  • Tekstinių puslapių užpildymas
  • Išorinis front-end apipavidalinimas
 

Pagrindinis puslapis

Pradėkime nuo pagrindinio puslapio: 10 naujausių aikštelių. Kad išvestume aikšteles, turime padaryti tris dalykus:

app/Http/Controllers/HomeController.php - paimame 10 naujausių:
use App\Court;
$newest_courts = Court::orderBy('id', 'desc')->take(10)->get();
return view('home', compact('newest_courts'));

Beje, matote kaip su Laravel Eloquent paprasta parašyti "limit 10" - tiesiog funkcija take(). O jei norite eilutes ne nuo pradžių - tada funkcija skip().

resources/views/home.blade.php - išvedame aikšteles:
<h1>Naujausios aikštelės</h1>
@foreach ($newest_courts as $court)
<a href="{{ url('aikstele/' . $court->id) }}"><h4>{{ $court->title }}</h4></a>
{{ $court->address }}, {{ $court->city->title }}
@endforeach

Dabar - ar pastebėjote, kaip išvedamas miesto pavadinimas? Per relationship ($court->city->title). Kad tai veiktų, Court modelyje turime nurodyti sąryšį:

app/models/Court.php:
public function city() {
  return $this->belongsTo('App\City');
}
 

Aikštelių paieška

Toliau - aikštelių paieška. Paieškos formą padarysime pasiekiamą iš bet kokio puslapio - iškelsime ją į header dalį. O pagrindiniame puslapyje išvesime dešimt naujausių aikštelių.

Kaip atrodys mūsų atnaujintas resources/views/base.blade.php? Keičiasi tik content dalis - į jos pradžią įkeliame paieškos formą ir padarome, kad ji nebūtų matoma prisijungusiam administratoriui:

@if (!Auth::check())
{!! Form::open(array('url' => 'aiksteles')) !!}
Miestas: {!! Form::select('city_id', \App\City::lists('title', 'id')) !!}
Aikštelės tipas: {!! Form::select('type_id', \App\Type::lists('title', 'id')) !!}
Pavadinimas: {!! Form::text('search') !!}
{!! Form::submit('Ieškoti') !!}
{!! Form::close() !!}
@endif
@yield('content')

Taigi, turime paieškos formą, pereiname prie paieškos mechanizmo ir rezultatų. Kaip matėte iš base.blade.php failo, forma ves į /aiksteles adresą su POST metodu, taip ir nurodome faile routes/web.php - priskiriame paieškos funkciją:

Route::post('aiksteles', 'SearchController@postSearch');

Na, ir tada einame ieškoti - parašome pačią funkciją:

app/controllers/SearchController.php:
public function postSearch()
{
  $query = Court::where('city_id', '=', $request->input('city_id'))
  ->where('type_id', '=', $request->input('type_id'));
  if ($request->has('search')) $query->where('title', 'like', '%'.$request->input('search').'%');
  $courts = $query->get();
  return view('search_results', compact('courts'));
}

Kaip matote, Query Builder pagalba galima konstruoti paieškos sąlygas vieną po kitos - ir tik pabaigoje kviesti funkciją get(). Šiuo atveju laikau, kad miestas ir aikštelės tipas paieškos formoje visada bus pasirinktas, o pavadinimas - nebūtinai.

Taip pat atkreipkite dėmesį, kaip kviečiama funkcija like - man asmeniškai tokia sintaksė nepatinka, vienas iš retų Laravel mini-trūkumų.

resources/views/search_results.blade.php - išvedame rezultatus:
@if (count($courts) > 0)
  @foreach ($courts as $court)
    <a href="{{ url('aikstele/' . $court->id) }}"><h4>{{ $court->title }}</h4></a>
    {{ $court->address }}, {{ $court->city->title }}
  @endforeach
@else
  Nerasta aikštelių.
@endif

Dar viena smulkmena - reikia, kad paieškos filtruose atsispindėtų, kokius parametrus pasirinkome. Tad redaguojame base.blade.php:

Miestas: {!! Form::select('city_id', \App\City::lists('title', 'id'), \Input::get('city_id')) !!}
Aikštelės tipas: {!! Form::select('type_id', \App\Type::lists('title', 'id'), \Input::get('type_id')) !!}
Pavadinimas: {!! Form::text('search', \Input::get('search')) !!}
 

Konkrečios aikštelės atvaizdavimas

Greičiausiai, šią vietą galėsite pasidaryti ir patys, bet vis tiek parodysiu principą.

routes/web.php:
Route::get('aikstele/{court_id}', 'CourtController@getCourt');
app/Http/Controllers/CourtController.php:
public function getCourt($court_id)
{
  $court = Court::find($court_id);
  return view('court', compact('court'));
}
resources/views/court.blade.php:
<h1>{{ $court->title }}</h1>
{{ $court->address }}, {{ $court->city->title }}
<br /><br />
<p>{{ $court->description }}</p>

Štai ir viskas! Išvedėme informaciją apie aikštelę. Negi Laravel nėra paprastas?

Beje, dabar, kai paieška ir informacijos atvaizdavimas veikia - tampa kaip ir nebereikalingas viršuje meniu "Aikštelių paieška", tad jį pašalinkime.

 

Tekstinių puslapių užpildymas

Kiekviename projekte turėtų būti kažkiek tekstinių puslapių - Apie mus, Kontaktai ir t.t. Mūsų atveju tokių yra du - Apie projektą ir Kontaktai. Jiems, primenu, esame skyrę tokias dvi routes/web.php eilutes:

Route::get('apie', 'AboutController@showIndex');
Route::get('kontaktai', 'ContactController@showIndex');
O Controller failuose tiesiog kviečiame Views (primenu - perduodami $this->data iš BaseController): app/Http/Controllers/AboutController.php:
public function showIndex()
{
  return view('about');
}

Taigi, užtenka tik užpildyti failą resources/views/about.blade.php tekstine informacija - ten jau jokio programavimo nėra, tiesiog įrašykite HTML kodą.

 

Namų darbai - patobulinkite projektą

Viskas, projektas paruoštas naudojimui! Na, bent jau jo pagrindinės funkcijos - dabar jau galite jį keisti pagal save: keisti pavadinimus nuo krepšinio aikštelių iki ko jūs norite ir kurti papildomų funkcijų. Būtent tai ir yra namų darbai.

Kad jums būtų lengviau, galite parsisiųsti galutinį projekto variantą iš čia. O toliau - galite padaryti tokius patobulinimus:

  • Pritaikyti norimą rimtesnį dizainą
  • Padaryti galimybę prie aikštelių pridėti nuotraukas
  • Susieti projektą su Google Maps ir atvaizduoti aikštelių žemėlapį
  • Pridėti mikrorajonus ir rodyti arti esančias aikšteles pagal mikrorajoną
  • Įdiegti galimybę komentuoti ir vertinti aikšteles
  • Sukurti atskirus miestų puslapius - pvz Aiktelės Vilniuje ar Kaune
  • ...
Žodžiu, dabar jau jūsų fantazijos reikalas. Jei reikės pagalbos - drąsiai kreipkitės asmenine žinute, į forumą ar el.paštu, pasistengsiu padėti. O toliau - judėsie prie "papildomų" pamokų, kurios padės jums ateityje naudojant Laravel.


(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com