Oleh
Tim Komunitas Laravel UMM
Untuk memanggil view ini, kita dapat menggunakan dot notation untuk mengakses struktur
foldernya. Sehingga, pemanggilan view ini akan menjadi:
Route::get('/motivasi', function() {
return view('quote.motivasi');
});
c. Passing Variable
Kita dapat melakukan passing variable ke view dengan menambahkan variable yang hendak
kita kirimkan menggunakan array asosiatif sebagai parameter kedua pada saat memanggil view.
Misalnya, kita buat nama penulis quote menjadi dynamic:
app/Http/routes.php
Route::get('/motivasi', function() {
return view('quote.motivasi', ["penulis" => "Joni"]);
});
Menggunakan syntax ini, kita dapat mengakses variable $penulis dari view:
resources/views/motivasi.php
<p>
Hari ini, kurangilah hal-hal yang palsu dalam kehidupan mu. Agar rezeki \
& cinta yang datang lebih asli. <strong>- <?php echo $penulis; ?> </strong>
</p>
Sehingga, kini nama penulis kalimat motivasi akan berubah:
Tentunya, kita dapat mengirimkan lebih dari satu variable. Misalnya, kita passing juga kalimat
motivasinya:
app/Http/routes.php
Route::get('/motivasi', function() {
return view('quote.motivasi', [
'penulis' => 'Joni',
'kalimat' => 'Jatuh adalah cara maju yang rasanya tidak enak. Bangkit, m\
ove on! Jangan menyerah!'
]);
});
Di baris ini, kita melakukan passing variable $app_name ke view quote.motivasi. Mari kita
panggilvariable ini dari view:
resources/views/quote/motivasi.php
<p>
Made by <?php echo $app_name; ?>
</p>
Mari kita coba passing variable ini ke view lain, buatlah view quote.inspirasi seperti berikut:
resources/views/quote/inspirasi.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Inspirasi</title>
</head>
<body>
<h1>Inspirasi</h1>
<p>
Saya tidak mau pengalaman dan pengetahuan yang saya miliki,
terkubur bersama tubuh saya kelak. - Bob Sadino
</p>
<p>
Made by <?php echo $app_name; ?>
</p>
</body>
</html>
Kita buat juga route untuk view ini:
app/Http/routes.php
Route::get('/inspirasi', function() {
return view('quote.inspirasi');
});
Untuk passing variable $app_name ke view ini, kita ubah View::share() menjadi:
app/Providers/AppServiceProvider.php
public function boot()
{
Schema::defaultStringLength(191);
\View::share(['app_name'=>'Quote App v2.0'], ['quote.motivasi',
'quote.inspirasi']);
}
Terkadang, kita ingin menampilkan nilai default pada view jika sebuah variable belum diset,
untuk itu kita dapat menggunakan syntax berikut:
{{ $app_name}}
Syntax {{ }} akan meng-escape data markup html, misalnya contoh berikut:
<p>
Saya tidak mau pengalaman dan pengetahuan yang saya miliki, terkubur bersama\
tubuh saya kelak. - {{ '<strong>Bob Sadino</strong>' }}
</p>
Ini sebenarnya bagus, agar user tidak dapat memasukan script javascript ke text box. Tapi,
terkadang kita ingin menghilangkan behaviour ini. Untuk itu, kita dapat menggunakan {{! !}}:
<p>
Saya tidak mau pengalaman dan pengetahuan yang saya miliki, terkubur bersama
tubuh saya kelak. - {!! '<strong>Bob Sadino</strong>' !!}
</p>
Komentar
Dalam html kita dapat menggunakan <!-- --!> untuk memberikan komentar pada baris.
Menggunakan blade, kita dapat menggunakan syntax {{-- --}} untuk membuat komentar.
Misalnya seperti berikut:
resources/views/master.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{{-- Title untuk halaman --}}
<title>@yield('title','Quote App')</title>
</head>
<body>
{{-- Konten untuk halaman --}}
@yield('body')
</body>
</html>
Blade Layout
Kelebihan utama penggunaan blade adalah kita dapat menggunakan templating untuk
merapikan struktur folder aplikasi. Untuk menggunakannya, kita harus membuat file layout yang
akan digunakan oleh berbagai view. Misalnya kita buat di resorces/views/master.blade.php:
resorces/views/master.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Quote App</title>
</head>
<body>
@yield('body')
</body>
</html>
Pada file ini, kita menggunakan syntax @yield() yang menandakan lokasi untuk child view
mengisi konten yang diinginkan. View yang kita gunakan sebagai layout biasanya disebut parent
view. Mari kita gunakan layout ini untuk view quotes.inspirasi
resources/views/quote/inspirasi.blade.php
@extends('master')
@section('body')
<h1>Inspirasi</h1>
<p>
Saya tidak mau pengalaman dan pengetahuan yang saya miliki, terkubur bersama tubuh saya
kelak. - {!! '<strong>Bob Sadino</strong>' !!}
</p>
<p>
Made by {{ $app_name }}
</p>
@stop
View yang menggunakan layout, kita namakan child view. Pada view ini, kita
menggunakan syntax @extends('master') untuk menandakan bahwa view ini akan menggunakan
layout master.blade.php. Selanjutnya, terdapat syntax @section('body') dan diakhiri dengan
@stop. Syntax ini menandakan bahwa child view ini akan mengisi tempat @yield('body') pada
parent view (master.blade.php). Silahkan cek kembali view ini, pastikan bahwa view ini tetap
berjalan. Sebagai latihan ubah juga view quote.motivasi agar menggunakan blade dan
menggunakan layout master.blade.php. Fitur lain dari layouting ini adalah kita dapat menentukan
nilai default yang dapat di overide oleh child view. Misalnya, mari kita buat title dari halaman
quote ini menjadi dinamis dengan default berisi tulisan Qoute App.
resources/views/master.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>@yield('title','Quote App')</title>
</head>
<body>
@yield('body')
</body>
</html>
resources/views/quote/motivasi.blade.php
@extends('master')
@section('title', 'Kalimat Motivasi')
@section('body')
<p>
<h1>Asli</h1>
<?php echo $kalimat; ?> - <?php echo $penulis; ?>
</p>
<p>
Made by <?php echo $app_name; ?>
</p>
@stop
Sub View
Syntax @extends() digunakan untuk memberitahu parent view yang akan dia gunakan oleh
sebuah view. Namun, adakalanya kita ingin memasukan view lain ke dalam view yang sedang
aktif. Contoh penggunaannya untuk form, sidebar, footer, dll. Teknik ini dinamakan “sub view”,
sementara view yang akan kita masukan ke dalam view aktif biasanya dinamakan “partial view”.
Untuk menggunakannya kita dapat menggunakan syntax @include(). Umumnya, nama file untuk
partial view diawali dengan underscore “_”. Misalnya, kita buat footer menjadi partial view
dengan file resources/views/partials/_footer.blade.php:
resources/views/partials/_footer.blade.php
<p>
Made by {{ $app_name }}
</p>
resources/views/quote/motivasi.blade.php
@extends('master')
@section('title', 'Kalimat Motivasi')
@section('body')
<p>
<h1>Asli</h1>
<?php echo $kalimat; ?> - <?php echo $penulis; ?>
</p>
<p>
@include('partials._footer')
</p>
@stop
resources/views/quote/inspirasi.blade.php
@extends('master')
@section('body')
<h1>Inspirasi</h1>
<p>
Saya tidak mau pengalaman dan pengetahuan yang saya miliki, terkubur bersama tubuh saya
kelak. - {!! '<strong>Bob Sadino</strong>' !!}
</p>
<p>
@stop
Silahkan cek kembali kedua view tersebut dan pastikan footer pada kedua view masih berjalan.
f. Form
Semenjak Laravel versi 5, helper untuk form dari Laravel telah dihilangkan. Tentunya, kita
bias menggunakan cara manual dengan menulis setiap element html dari sebuah form. Tapi, saya
sendiri lebih suka menggunakan cara otomatis dengan menambah package laravelcollective/html
dengan menambah baris berikut pada file composer.json:
composer.json
"require": {
…………
"laravelcollective/html": "~5.0",
……………………………………..
},
Jalankan composer update untuk menginstallnya. Tunggu hingga selesai. Setelah selesai,
masukan isian berikut pada bagian providers di config/app.php:
config/app.php
'providers' => [
Collective\Html\HtmlServiceProvider::class,
],
'aliases' => [
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
],
g. Membuat Form
Untuk membuat form, kita dapat menggunakan syntax Form::open() dan diakhiri dengan
Form::close(). Method open() menerima berbagai parameter berupa array opsi form yang akan
kita buat. Ubah pula isian master.blade.php menjadi:
resources/views/master.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{{-- Title untuk halaman --}}
<title>@yield('title')</title>
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
</head>
<body>
{{-- Konten untuk halaman --}}
<div class="container">
<div class="row">
@yield('body')
</div>
</div>
</body>
</html>
Syntax asset('css/app.css') menandakan kita akan menggenerate url ke file css/app.css di folder
public. Untuk form pembuatan news, buat file di dalam folder views yang baru seperti berikut :
resources/views/news/create.blade.php
@extends('master')
@section('title', 'Create Berita')
@section('body')
{!! Form::open(['url'=>'/store']) !!}
<legend>Create Berita</legend>
<div class="form-group">
{!! Form::label('title', 'Title') !!}
{!! Form::text('title', null, ['class'=>'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('content', 'Konten') !!}
{!! Form::textarea('content', null, ['class'=>'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('published', 'Published') !!}
{!! Form::select('published', ['yes' => 'Yes', 'no' => 'No'],
null, ['class'=>'form-control']) !!}
</div>
Untuk melihat hasil akhir dari form ini, buatlah route berikut:
Route::get('/create', function() {
return view('news.create');
});
Menggunakan named route. Pada contoh ini, misalnya kita telah membuat route dengan
nama quote.store {!! Form::open(array('route' => 'quote.store')) !!}
Mengizinkan file upload. {!! Form::open(array('url' => '/quote', 'files' =>
true)) !!}
Selanjutnya kita menambah field untuk form. Banyak sekali field yang didukung oleh
package ini, berikut beberapa jenis field yang kita gunakan pada form ini.
Label. Kita gunakan untuk menamai setiap field pada form{!! Form::label('title,
'Title') !!} Dari syntax diatas akan didapatkan: <label
for="title">Title</label>
Text field. Kita gunakan pada field title {!! Form::text('title', null,
Untuk mengecek apakah form ini berhasil di submit, mari kita buat route POST dengan url
/quote dengan isi:
app/Http/routes.php
Route::post('/store', function() {
dd(Input::all());
});
Syntax dd(Input::all()); akan menampilkan semua inputan yang telah kita isi. Silahkan coba
isi form, kemudian submit. Kalau errror
@extends('master')
@section('title', 'Kalimat Motivasi')
@section('body')
{!! Form::open(['url'=>'/store']) !!}
<legend>Create Berita</legend>
<div class="form-group">
{!! Form::label('title', 'Title') !!}
{!! Form::text('title', null, ['class'=>'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('content', 'Konten') !!}
{!! Form::textarea('content', null, ['class'=>'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('published', 'Published') !!}
{!! Form::select('published', ['yes' => 'Yes', 'no' => 'No'],
null, ['class'=>'form-control']) !!}
</div>
resources/views/news/create.blade.php
@extends('master')
@section('body')
{!! Form::open(['url'=>'/store']) !!}
<legend>New Quote</legend>
@include('news._news-form')
{!! Form::submit('Save', ['class'=>'btn btn-primary']) !!}
{!! Form::close() !!}
@stop
Untuk mengedit quote, kita akan menggunakan url /edit-news/{id}. Dimana {id}
merupakan id dari quote yang hendak kita edit. Mari kita buat route nya:
routes/web.php
Route::get('/edit-news/{id}', function($id) {
$news = App\Post::findOrFail($id);
return view('news.edit-news', compact('news'));
});
Pada route ini, kita menggunakan method findOrFail() pada model App\Post untuk mencari
quote dengan id yang kita kirim. Kemudian menampilkan view edit-news.blade.php sambil
mengirim variable $news. Isian dari edit-news.blade.php akan seperti berikut:
resources/views/news/edit-news.blade.php
@extends('master')
@section('body')
{!! Form::model($news, ['url'=>'/news/' . $news->id, 'method'=>'put']) !!}
<legend>Update News</legend>
@include('news._news-form')
{!! Form::submit('Update', ['class'=>'btn btn-primary']) !!}
{!! Form::close() !!}
@stop
Terlihat disini, kita menggunakan Form::model() dengan parameter variable $news yang telah
kita kirim. Jika kita mengakses url /edit-news/{id} dengan id yang benar, maka form akan
otomatis terisi dengan data yang tersimpan di database: