Anda di halaman 1dari 208

Chapter One: Introduction

Introduction
Selamat Datang di Yii 2 Untuk Pemula. Buku ini akan membawa Anda langkah demi langkah melalui
setup dan instalasi, dan kemudian ke coding dalam rangka PHP yang paling menarik yang tersedia saat
ini, Yii 2.

Yii 2 hadir dalam dua rasa, dasar dan lanjutan, dan itu mungkin tampak berlawanan untuk
menggunakan template advanced dalam sebuah buku pemula, namun ironisnya, template advanced
lebih mudah digunakan jika aplikasi Anda membutuhkan model pengguna bekerja yang menyimpan
pengguna dalam database . Sebagian besar aplikasi web modern akan membutuhkan fungsi ini dan
template advaced memiliki solusi siap pakai untuk itu.

Manfaat besar lainnya untuk template advanced adalah bahwa hal itu membagi aplikasi antara
frontend dan backend, yang menjawab pertanyaan yang tak terelakkan dari "di mana saya
menempatkan daerah admin saya?"

Tidak hanya saya ingin memperkenalkan Anda ke kerangka php menakjubkan ini, tapi saya juga ingin
Anda memiliki titik awal untuk proyek-proyek Anda yang meliputi segala yang dibutuhkan untuk
membangun aplikasi web yang kuat database-driven. Sementara template advanced out-of-the-box
sangat membantu, itu hilang beberapa potongan kunci, yang akan kita isi dengan buku ini.

Tujuannya adalah untuk menyediakan Anda dengan boilerplate template yang dapat Anda gunakan
untuk semua proyek masa depan Anda.

Features
Beberapa fitur yang Anda dapatkan dengan menginstal template advanced termasuk:

Telah ditetapkan skema untuk tabel user


Login user dan bentuk pendaftaran
Fungsi lupa sandi
Domain frontend dan backend terpisah
Pembuatan kode otomatis untuk models,controllers, dan views
built-in integrasi dengan Twitter Bootstrap dan desain mobile pertama
widget kuat dan pembantu untuk penyajian data

Jika Anda tidak memahami sesuatu dalam daftar itu, jangan khawatir, kita akan mencakup secara
rinci. Hanya tahu bahwa itu benar-benar menakjubkan apa Yii 2 lakukan untuk Anda. Tapi tidak
peduli seberapa besar kerangka adalah, Anda masih perlu berbuat lebih banyak untuk membuatnya
mendukung aplikasi nyata.

Jadi untuk semua fitur out-of-the-box, akan menambahkan:

Bagus perbaikan frontend ui seperti jquery datepicker


Metode model hubungan yang membuat menampilkan data terkait mudah
Metode controller untuk membatasi apa yang dilihat
Struktur data diperpanjang yang akan umum untuk semua situs masa depan Anda
Berbasis peran kontrol akses (RBAC)
Membatasi konten kepada pengguna berdasarkan jenis pengguna, seperti gratis atau
berbayar
Modul sosial yang memungkinkan untuk berbagi

Ini semua adalah hal yang aplikasi web Anda mungkin membutuhkan, terlepas dari jenis situs itu.
Jadi, saat Anda belajar Yii 2 dengan buku ini, Anda akan membangun sebuah template yang dapat
Anda memperluas untuk semua aplikasi masa depan Anda.

Buku ini sangat cocok untuk programmer awal PHP yang siap untuk beralih ke pengembangan
kerangka. The Yii 2 framework PHP sangat scalable dan extensible, dan sarat dengan fitur. Kami
memperkenalkan Anda untuk kerangka ini indah dan menjelaskan secara rinci semua yang anda
perlu tahu untuk bangun dan berjalan. Anda akan menyukai Yii 2!

Pengrajin canggih Php akan dapat zip melalui buku ini dan bangun dan berjalan cepat pada Yii 2,
kerangka php fenomenal. Hal ini tidak hanya akan menghemat waktu mereka pada proyek-proyek,
tetapi juga sepenuhnya memanfaatkan keuntungan dari kerangka open source yang memiliki
seluruh komunitas di balik itu. Dan sementara saya berharap mereka mendapatkan banyak dari itu,
aku tidak benar-benar menulis buku ini untuk mereka.

Sebaliknya, saya menulis untuk pemula. Orang-orang yang memiliki pengalaman dengan PHP tetapi
belum benar-benar melompat untuk maju pemrograman berorientasi objek. Saya dapat
memberitahu Anda dari pengalaman pribadi itu tidak mudah untuk belajar OOP hanya dengan
tutorial online.

Biasanya Anda mendapatkan contoh kelas Beruang Hewan memperluas kelas, yang tidak selalu
buruk untuk mengajarkan konsep dasar, tetapi di sisi lain, tidak benar-benar akan memberi Anda
merasakan untuk bekerja dengan benda-benda bersarang. Belajar Yii 2 Namun, tidak memberikan
pengalaman tangan dengan pemrograman berorientasi objek dengan hasil praktis. Anda berakhir
dengan sebuah website kerja.

Kita tidak hanya bisa memanfaatkan pemrograman berorientasi objek untuk membangun aplikasi
web berbasis data, tapi kami juga bisa menggunakan versi terbaru dari PHP, yang memungkinkan
kita untuk menggunakan notasi bersih untuk array, ruang nama, dan beberapa efisiensi lain yang
baru untuk Yii di Yii 2. Dan kabar benar-benar baik adalah bahwa Yii 2 sekarang begitu kuat sebagai
kerangka, itu lebih mudah diakses untuk pemula daripada yang pernah telah sebelumnya. Dan
dengan itu dukungan masyarakat yang kuat, itu adalah kerangka yang sempurna untuk belajar.

What Makes The Yii 2 Framework Special?


Programmer harus membuat keputusan, itu adalah fakta bahwa di jantung apa pemrograman. Jadi
salah satu keputusan terbesar Anda akan harus membuat sebagai programmer, dan lebih mungkin,
keputusan Anda akan membuat sebagai bagian dari tim programmer, adalah apakah atau tidak
untuk menggunakan kerangka dan jika demikian, yang satu.

Seperti pertanyaan menggunakan kerangka PHP, ada begitu banyak manfaat untuk melakukannya,
menjadi no-brainer.

Upsides
Berikut adalah beberapa manfaat yang jelas:

Menggunakan cara standar dalam melakukan sesuatu, sehingga mengurangi atau


menghilangkan kode spaghetti.
Mengurangi waktu yang dihabiskan untuk tugas-tugas pipa seperti validasi form dan
keamanan.
Membuat lebih mudah untuk bekerja sebagai sebuah tim dengan menegakkan standar.
Membuat lebih mudah untuk menjaga kode dengan memanfaatkan arsitektur yang umum
dan metode.
Anda mendapatkan manfaat dari komunitas yang aktif dari pengembang yang memelihara
kerangka dan mendukung tugas-tugas umum dan fitur baru.

Downsides
Ada beberapa kelemahan untuk menggunakan kerangka kerja yang harus ditunjukkan. Pertama,
semua kode yang terdiri kerangka menciptakan server yang overhead dan ini bisa menjadi masalah
nyata. Untungnya ada caching pilihan yang tersedia yang akan mengurangi efek ini, dan untuk
aplikasi perusahaan, Anda dapat menggunakan sql baku untuk meminimalkan waktu query. Jadi
jangan membiarkan server overhead menghentikan Anda dari menggunakan kerangka.

Hal lain adalah bahwa jelas ketika Anda bekerja dengan kerangka kerja, Anda bekerja dengan
sejumlah besar kode yang Anda tidak menulis dan dibutuhkan waktu untuk mencari tahu cara
kerjanya. Beberapa kode kerangka dapat cukup samar tergantung pada tingkat keterampilan dan
pengalaman, jadi jangan berharap untuk segera memahami segala sesuatu. Ini tidak akan terjadi.

Tentu saja Anda sudah tahu bahwa ada kurva belajar, itulah sebabnya mengapa Anda membaca
buku ini. Dan sementara itu butuh waktu untuk belajar kode orang lain, yang dapat menjadi sakit, itu
akan jauh lebih menyakitkan harus menulis kerangka kustom dari awal. Semua hal dipertimbangkan,
menggunakan kerangka kerja untuk pengembangan usaha adalah pilihan yang bijaksana.

Ok, jadi bagian yang mudah adalah untuk mengetahui bahwa memanfaatkan kerangka akan
membantu Anda mengembangkan sebuah proyek yang lebih terorganisir dan kuat, tapi sekarang
datang bagian yang sulit. Anda memiliki memutuskan kerangka untuk digunakan.

Why I chose Yii 2


Saya tidak dapat memberitahu Anda yang merupakan kerangka kerja yang terbaik untuk Anda, itu
adalah sesuatu untuk Anda dan Anda sendiri untuk memutuskan, tapi saya bisa berbagi sedikit dari
perjalanan yang membawa saya ke Yii 2. Keputusan ini tidak didorong oleh kebutuhan untuk
menemukan cara termudah untuk belajar PHP, itu sudah pasti.

Di perusahaan saya kembali pada tahun 2012, aku adalah bagian dari tim pengembang yang tampak
di berbagai kerangka kerja dan harus memutuskan mana yang akan digunakan. Aku tidak pernah
bermimpi pada saat itu aku akan berakhir menulis sebuah buku tentang salah satu dari mereka.

Lagi pula, kami secara kolektif meneliti segala sesuatu yang kita bisa menemukan di kerangka PHP
utama. Saya pribadi membaca semua dokumentasi dan kami berdiskusi panjang tentang teknik apa
yang kami pikir akan bekerja. Anda tidak dapat membayangkan frustrasi dengan kenyataan bahwa
saya membaca semua dokumentasi ini dan berjalan jauh dari itu merasa kurang berpengetahuan
dibandingkan sebelum saya mulai membacanya.

Tim kami programmer memiliki preferensi namun. Mereka merasa bahwa Yii 1.1.14 adalah pilihan
terbaik. Ini adalah versi Yii yang tersedia pada saat kami memutuskan ini. Jadi tim mengadopsi
kerangka itu dan tidak pernah melihat kembali. Mereka menyukainya.
Saya, di sisi lain, tetap frustrasi. Karena saya hanya seorang programmer pemula, saya benar-benar
berjuang untuk mempelajarinya. Saya tidak merasa sangat intuitif. Terutama setelah
membandingkannya dengan kerangka kerja lainnya, di mana mereka berusaha keras untuk
membuat segala sesuatu indah mengintegrasikan, arsitektur Yii hanya tampak jelek.

Aku begitu frustrasi pada satu titik, yang saya mulai mencari pilihan lain.

Other Options
Saya akan menemukan beberapa dokumentasi indah ditulis untuk kerangka kerja baru dan
menjalankannya melewati tim. Saya selalu mendapat respon yang sama. Tim ini senang dengan Yii.

Mereka mengatakan kepada saya mungkin akan sulit untuk belajar, tapi itu mudah digunakan,
setelah Anda tahu bagaimana ini bekerja. Karena itu, saya berkomitmen diri untuk belajar itu. Itu
sedang berjalan lambat dan naik kasar. Saya tidak mendapatkan itu. Saya bekerja melalui bab 10
dalam buku pada Yii 1.1.14, berpikir saya akan pernah benar-benar mampu membangun aplikasi
sendiri dalam waktu kurang dari seratus tahun. Terlalu banyak jalan tampaknya ke mana-mana.

Kemudian keajaiban terjadi.

Yii 2 Arrives
Saya mengetahui tentang Yii 2 alpha. Saya penasaran untuk melihat apa perbedaan berada di Yii 2,
yang telah 3 tahun dalam pembuatan pada saat itu. Jadi aku melompat di dan mengejutkan
mengucapkan dan lengkap saya, saya langsung terhubung dengan itu. Saya memahami struktur.
Saya bisa menulis kode yang benar-benar bekerja! Apa besar perasaan itu.

Saya secara pribadi telah menemukan Yii 2 menjadi yang paling intuitif dan elegan dari semua
kerangka PHP yang saya telah mempelajari. Saya memiliki begitu banyak antusiasme untuk itu yang
saya ingin berbagi dengan setiap programmer yang saya tahu, dan bahkan orang-orang yang saya
tidak tahu, sehingga telah memotivasi saya untuk menulis buku ini.

Dengan Yii 2, bahkan sebagai pemula, saya bisa berdiri sebuah website bekerja yang memiliki model
pengguna data-driven, dengan baik frontend dan backend. Tepat di luar kotak, saya mendapatkan
model pengguna kerja, dengan lupa fungsi password, yang juga terintegrasi dengan Bootstrap untuk
desain ponsel-responsif, tanpa harus melakukan pemrograman apapun. Betapa kerennya itu?

Meskipun saya adalah seorang programmer awal ketika saya mempelajari kerangka PHP, saya
memiliki pengalaman bekerja dengan database dan ini adalah salah satu daerah di mana pendapat
saya Yii 2 benar-benar bersinar.

Gii
Yii 2 memiliki alat generasi kode yang disebut Gii. Saya mengucapkan bahwa dengan lembut "g", tapi
saya tidak tahu kalau itu adalah cara yang tepat untuk mengatakan atau tidak.

Pokoknya, Gii analisis tabel database Anda dan secara otomatis membangun model PHP dari
mereka. Tidak hanya itu, tetapi menganalisis hubungan antara tabel dan secara otomatis
menghasilkan kode relasional ke dalam model. Sebagai contoh, jika Anda memiliki struktur data
dengan 30 meja, dan setengah dari mereka memiliki kolom user_id yang dimaksudkan untuk
referensi id dari tabel user, Gii akan membangun hubungan yang tepat untuk Anda, semua dalam
satu pergi. Tidak hanya ini menghemat waktu, tapi ini juga memberi Anda kode yang sangat
konsisten karena selalu dilakukan dengan cara yang sama dan membantu Anda mengadopsi disiplin
ini.

Ini perlu menyebutkan bahwa kerangka kerja lainnya bekerja persis sebaliknya. Dengan mereka,
Anda membangun model pertama, kemudian melakukan migrasi ke database untuk membuat kolom
tabel dan sesuai. Jadi perbedaan besar adalah bahwa Anda sedang membangun struktur data Anda
sedikit demi sedikit sambil jalan, sedangkan di Yii 2 Anda memiliki pilihan untuk memiliki struktur
data yang lebih lengkap untuk memulai.

Kedua pendekatan bekerja, namun mereka mewakili alur kerja yang berbeda secara drastis.
Menurut pendapat saya, migrasi/pendekatan sedikit demi sedikit ke struktur data hanya benar-
benar bekerja untuk satu pengembang atau tim yang sangat kecil bekerja pada sebuah proyek kecil.
Alasan mengapa saya mengatakan ini adalah bahwa meskipun demokrasi mungkin sistem yang
terbaik politik, membayangkan sebuah dunia di mana setiap pengembang membuat struktur data
mereka sendiri dan mengimplementasikannya. Bagaimana konsisten yang akan? Bagaimana jika
tangan kanan tidak tahu apa yang tangan kiri lakukan? Dalam tim yang lebih besar, ini adalah resep
untuk kekacauan. Inilah sebabnya mengapa tim pengembangan usaha biasanya memiliki database
administrator, juga dikenal sebagai DB, dan hanya mereka dapat membuat atau menghapus struktur
data.

DB-First Approach
Sejak Yii 2 memungkinkan Anda untuk dasarnya mengimpor model dari struktur data, Anda dapat
memulai proyek Anda dengan benar-benar memikirkan struktur data Anda. Secara keseluruhan saya
ingin menghindari berbicara tentang terlalu banyak teori karena waktu yang lebih baik dihabiskan
bekerja melalui tangan-on contoh, tapi saya pikir itu layak mengambil waktu untuk berpikir tentang
apa struktur data baik pikir-out benar-benar berarti.

Apakah Anda seorang pengembang tunggal atau bagian dari tim tingkat perusahaan, Anda pada
dasarnya diberi tugas yang sama, keseluruhan misi yang sama. Anda harus melayani data dari
database ke dalam format browserfriendly, biasanya menggunakan PHP, HTML, dan Javascript. Kami
menggunakan kerangka PHP untuk membuat tugas ini lebih mudah, dan dengan mengatakan bahwa,
kita mengakui dimuka bahwa itu bukan tugas yang mudah. Kenapa itu?

Database adalah bagian yang sangat handal dan konsisten dari perangkat lunak, yang
memungkinkan kita untuk membuat struktur data relasional.

MySql
Sepanjang buku ini kita menggunakan MySQL sebagai database, yang, selain menjadi bebas, mampu
powering data perusahaan untuk aplikasi web.

Karena struktur database, dengan indeks dan kunci primer, database dapat melayani data yang
sangat efisien. Dalam istilah sederhana, ini berarti sangat cepat. Ini juga sangat dalam. Hal ini dapat
terus jutaan catatan, yang dapat diambil, jika terstruktur dengan baik, dalam milidetik.

Aspek penting lainnya dari database adalah bahwa hal itu memungkinkan kita untuk struktur data
sedemikian rupa untuk menghubungkan hal-hal seperti alamat pengguna dan username mereka
seolah-olah mereka satu catatan, tetapi menahan mereka di tabel terpisah sebagai catatan yang
terpisah. Semakin Anda dapat memecah struktur data menjadi komponen-komponen diskrit seperti
itu, semakin kuat itu. Hal ini disebut normalisasi data.
Masalahnya adalah bahwa lebih halus database, semakin efektif dinormalisasi itu, semakin kompleks
itu adalah untuk menangani dalam PHP. Anda akhirnya harus menghubungkan banyak model PHP
bersama-sama untuk mewakili data dengan benar.

Sekarang ini mungkin terlalu berat pada teori untuk buku dimulai, jadi kami tidak akan mengambil ini
lebih jauh untuk saat ini, tapi intinya adalah untuk memahami sifat dari masalah yang kerangka
membantu untuk memecahkan. Semakin mudah bagi Anda untuk menghubungkan model melalui
kerangka, semakin besar kekuatan Anda berasal dari database Anda.

Impoved Workflow
Menurut pendapat saya, Yii 2 berdiri sendiri dalam bagaimana membantu Anda terhubung model ke
database, yang menyebabkan peningkatan alur kerja, efisiensi, dan kemampuan desain keseluruhan.
Hal ini membebaskan Anda untuk membangun struktur data rinci kaya yang pada akhirnya akan
menghasilkan pengguna akhir menjadi lebih terlibat. Saya percaya bahwa Yii 2 melakukan ini lebih
efisien dan dalam dari salah satu kerangka kerja PHP lainnya, itu sebabnya aku sangat berkomitmen
untuk itu dan begitu tertarik berbagi.

Minimum PHP Skills


Belajar kerangka Php sederhana asalkan Anda seorang programmer PHP terampil. Cukup sering PHP
adalah bahasa kedua atau ketiga untuk programmer yang sudah mahir dalam bahasa berorientasi
objek seperti C atau Java, sehingga belajar PHP adalah hanya masalah menyesuaikan sintaks dan
mereka mengambilnya dengan cepat. Itu bagus untuk ninja, tetapi apa yang terjadi jika Anda baru
belajar bahasa pemrograman pertama Anda?

Sebagai seseorang yang belajar PHP sebagai bahasa pemrograman pertama, saya dapat
memberitahu Anda dari pengalaman langsung bahwa itu sulit untuk bergerak dari pemula hingga
mahir karena tidak ada banyak dukungan untuk jalan tengah. Kenyataan itu merupakan salah satu
motivasi bagi saya untuk menulis buku ini.

Lagi pula, jika Anda mencari online, Anda juga menemukan sangat contoh kompleks yang melibatkan
beberapa interface dengan benda-benda bersarang atau contoh yang begitu sederhana bahwa,
sementara mereka mudah untuk memahami, mereka melakukan apa-apa untuk memajukan
kemampuan Anda.

Untuk bekerja dengan cara Anda melalui buku ini, Anda akan memerlukan pemahaman yang layak
PHP berorientasi objek. Anda bisa mendapatkan ini dari berbagai sumber online. Aku punya selera
saya pertama PHP dari thenewboston.org, yang memiliki 200 video di PHP. Besar untuk pengenalan,
tapi tidak lebih. Saya mengikuti bahwa sampai dengan membaca cepat buku Richard Reese di Jawa,
yang membantu saya memahami pemrograman berorientasi objek yang lebih baik, karena segala
sesuatu di Jawa melibatkan kelas. Juga, ketika aku melihat PHP lagi, tampaknya sederhana. Saya juga
pergi melalui dasar-dasar di:

W3 Schools
W3schools.com adalah sumber belajar yang besar. Anda dapat bermain dengan kode online di situs
tersebut.

Dan tentu saja ada Php.net sendiri yang mana kita menemukan semua dokumentasi untuk bahasa
dan contoh kadang-kadang sangat rumit. Saya belajar banyak di sana dan tersesat banyak juga,
itulah cara berjalan. Mencobanya, Anda akan melihat apa yang saya maksud.
Bagaimanapun, untuk dapat bekerja dengan Yii 2, Anda harus memahami dasar-dasar tentang
obyek, array, dan struktur kontrol seperti loop foreach. Anda harus tahu komponen kelas, properti
dan metode, dll Lihatlah:

OOP for Beginners


Anda harus mampu melewati tutorial yang sangat mudah. Jika tidak, kembali dan mempelajarinya
sebelum mencoba untuk mengatasi Yii 2. Juga, Yii 2 menggunakan PHP 5.4 dan di atas, yang
mendukung sintaks array baru dan ruang nama, yang keduanya akan digunakan secara luas.

Jika Anda cahaya pada pengalaman pemrograman, tapi penuh semangat, Anda harus melakukannya
dengan baik, asalkan Anda bersedia untuk melakukan pekerjaan dan sabar. Pada titik tertentu, jika
Anda tidak memahami sesuatu, Anda dapat berhenti dan mengambil waktu untuk penelitian pada
Google atau stackoverflow atau PHP.net. PHP adalah bahasa terdokumentasi dengan baik dan
didukung dengan baik, digunakan oleh programmer yang tak terhitung jumlahnya yang akan
mencoba untuk membantu Anda.

Juga, saya mengambil banyak perawatan untuk label sub-bagian dari buku ini, sehingga Anda dapat
dengan mudah menemukan apa yang Anda cari, jika Anda perlu untuk merujuk kembali ke sana.
Banyak kali Anda akan ingin kembali ke bagian untuk referensi sesuatu dan saya sudah melakukan
yang terbaik untuk membuat sebagai intuitif mungkin.

Tools You Will Need


Ada sejumlah alat yang saya sarankan Anda gunakan untuk pembangunan di Yii 2, semua yang,
seperti kerangka itu sendiri, bebas. Ini adalah rekomendasi saja, tidak perlu mengikuti persis, tapi
instruksi saya akan menganggap Anda menggunakan mereka. Jadi jika Anda cukup maju, Anda dapat
menggunakan apapun yang Anda inginkan, bukan masalah besar. Selama Anda telah bekerja
lingkungan pengembangan, Anda baik-baik. Jika tidak, cobalah untuk menggunakan alat ini dengan
tepat, maka akan lebih mudah bagi Anda dalam jangka panjang.

http://www.w3schools.com/PHP/
http://www.php.net
http://code.tutsplus.com/tutorials/object-oriented-php-for-beginners--net-12762
http://www.google.com
http://www.stackoverflow.com
http://www.php.net

Kadang-kadang bagian yang paling sulit dari proyek adalah menyiapkan lingkungan pengembangan.
Karena saya menggunakannya secara pribadi, kita akan menggunakan xampp pada mesin windows.
Xampp termasuk PHP, Mysql, Apache, dan phpMyAdmin, sehingga sangat cocok untuk menciptakan
lingkungan pengembangan untuk proyek. Ini juga gratis.

Download Xammp
Install Video for Xammp and PhpMyadmihn
Alternatif yang akan membiarkan Anda menjalankan program-program baik-baik saja, Anda tidak
perlu XAMMP mengikuti buku ini. Di sisi lain, itu sangat mudah untuk bangun dan berjalan dengan
XAMMP, salah satu alasan mengapa saya menggunakannya. Bagian yang sulit adalah menyiapkan
variabel lingkungan pada mesin Windows, tapi yang didokumentasikan dengan baik dan saya akan
memberikan Download dan setup link untuk kenyamanan Anda, sehingga Anda dapat memeriksa
mereka jika Anda perlu.
Meskipun semuanya untuk Mysql dapat dilakukan di phpMyAdmin, saya juga merekomendasikan
menyiapkan Mysql meja kerja. EER Workbench ini (Enhanced Entity Relationship) Diagram
membantu Anda melihat hubungan dan membuat membuat tabel dan kunci asing sekejap. Kami
akan menggunakan foto dari MySQL Workbench untuk menunjukkan struktur tabel nanti dalam
buku ini.

Download Mysql Workbench


Anda harus membiasakan diri dengan cara membuat database, bagaimana menyelaraskan model
diagram ke database, dan jelas bagaimana membuat tabel dan kolom. Untuk membangun aplikasi
database-driven, Anda memerlukan pemahaman dasar sql, tidak terlalu dalam, tetapi Anda harus
tahu pertanyaan dasar bekerja dan konsep bergabung tabel untuk query. Dan karena kami
menggunakan MySql, Anda harus terbiasa dengan hal itu. Jika semua itu adalah baru bagi Anda,
kabar baiknya adalah bahwa Anda dapat google beberapa tutorial dan menemukan semua yang
anda butuhkan secara gratis. W3 Sumber Daya MySql tutorial adalah referensi besar.

Untuk IDE saya, saya menggunakan PhpED. IDE singkatan Integrated Development Environment, dan
membantu Anda mengatur proyek dan kode. Kebanyakan pengembang menggunakan beberapa
bentuk IDE sebagai lawan hanya editor teks. Saya merekomendasikan Eclipse atau Netbeans untuk
proyek ini, namun, karena keduanya gratis sedangkan PhpEd adalah IDE dibayar. Dalam rangka
untuk menginstal Eclipse, Anda akan harus menginstal SDK Java pertama.

Download Eclipse
Download Netbeans
Anda juga perlu menginstal Komposer, yang akan kita lakukan setelah menginstal xampp, yang
berarti setelah PHP diinstal. Dalam rangka untuk menjalankan Komposer, Anda harus terlebih dahulu
mengaktifkan ikal di PHP membangun Anda. Anda juga akan perlu mengatur variabel lingkungan
untuk itu jika Anda menggunakan windows.

Download composer
https://www.apachefriends.org/index.html
https://www.youtube.com/watch?v=dV3JjLhi4Jk
http://dev.mysql.com/downloads/workbench/
http://www.w3resource.com/mysql/mysql-tutorials.php
https://www.eclipse.org/
https://netbeans.org/
https://getcomposer.org/download/

Enable Curl
Saya juga merekomendasikan menggunakan git, yang menyediakan kontrol versi. Kontrol versi
adalah cara mudah untuk menyimpan pekerjaan Anda sehingga Anda dapat melangkah mundur
dengan mudah jika Anda perlu. Ketika Anda berurusan dengan sejumlah besar file yang terus-
menerus diperbarui, ini sangat membantu. Git juga melindungi Anda dalam lingkungan tim dari
seseorang Timpa pekerjaan Anda karena Anda hanya dapat melangkah kembali ke versi sebelumnya.

Download Git
Terakhir, saya sarankan Console2 untuk pengguna Windows, yang merupakan alat baris perintah
yang sedikit lebih cantik dari jendela yang cepat standar. Hal ini membuat lebih mudah pada mata
dan hanya sedikit lebih mudah untuk bekerja dengan.
Download Console 2
Dalam rangka untuk mendapatkan lingkungan pengembangan Anda bekerja dengan Yii 2, Anda akan
perlu menambahkan kedua entri vhost ke Apache dan entri host lokal ke dalam file host Anda. Kami
akan pergi melalui setiap langkah untuk itu secara rinci.

Seperti saya katakan sebelumnya, jika Anda memilih untuk menggunakan alat yang berbeda atau,
misalnya, mesin linux untuk devel, itu adalah pilihan Anda.

Saya akan memberikan halaman referensi untuk instalasi, tapi untuk pemula, ini mungkin terbukti
sulit. Anda dapat menggunakan instalasi lingkungan pengembangan sebagai salah satu tes untuk
melihat apakah Anda siap untuk mengatasi Yii 2. Jangan mudah menyerah. Jika tidak berjalan
dengan baik, Anda selalu bisa mendapatkan bantuan dari seorang programmer yang lebih
berpengalaman.

Tip
Juga, dan ini adalah tip untuk pemula, hampir semua yang Anda akan pergi melalui
sebagai programmer telah ditempuh oleh programmer lain sebelum Anda dan ini
terutama berlaku untuk kesalahan konfigurasi. Jangan takut untuk menggunakan
Google untuk membantu dalam pengaturan pemecahan masalah. Anda akan
berakhir menggunakannya lebih sering daripada tidak.

Setelah Anda punya segalanya dan berjalan, menghabiskan sedikit waktu belajar jalan sekitar alat. Ini
akan membuat usaha Anda berkembang di Yii 2 pergi banyak halus.

Errata
Meskipun saya telah dituangkan di atas setiap baris kode dalam buku ini setidaknya seratus kali dan
dibangun contoh dari awal dua kali hanya untuk memastikan saya bisa mengikuti arah, kesalahan
yang pasti akan terjadi, itu adalah sifat penulisan teknis.

http://www.tomjepson.co.uk/enabling-curl-in-php-php-ini-wamp-xamp-ubuntu/
http://git-scm.com/downloads
http://sourceforge.net/projects/console/
http://www.google.com

Formatting Tip
Dalam kasus-kasus tertentu, saya harus memformat kode saya menggunakan dua jalur
di mana satu akan sesuai, untuk menghindari jeda baris dari wordwrapping di PDF dan
format lain. The wordwrapping di PDF menyebabkan karakter khusus untuk muncul,
yang memecahkan kode, jadi saya harus menghindari itu yang terbaik yang saya bisa.
Akibatnya, saya tidak merekomendasikan Anda mengikuti contoh kode sebagai contoh
gaya. Saya akan merekomendasikan mengikuti PSR-2 Panduan, tersedia di sini: PSR-2
Coding Style Guide

Anda dapat memformat kode Anda dengan formatter di Php Formatter, jika Anda ingin
membuatnya lebih mudah dibaca. Jelas berhati-hati untuk tidak melanggar kode.

Contact Bill Keck


Harap dicatat bahwa LeanPub tidak maju saya info kontak apapun, jadi meskipun Anda dapat
menulis kepada saya untuk memberikan umpan balik, saya tidak punya cara untuk menanggapi.
Mengingat itu, silakan melaporkan bug ke saya di saya Yii 2 blog:

Bill Kecks Yii 2 Blog


Blog saya juga merupakan sumber yang baik dari berita terbaru tentang Yii 2, tren PHP, tutorial, dan
pikiran acak beberapa aku memutuskan untuk blog tentang pada kesempatan. Jangan ragu untuk
memberikan komentar.

Harap dicatat harga pembelian buku ini tidak termasuk dukungan teknis.

Cara tercepat untuk mengatasi kesalahan adalah untuk Google itu, kemungkinan besar seseorang
telah datang di masalah yang sama. Juga, harap diingat bahwa Yii 2 terus dikembangkan dan versi
baru mungkin tidak mendukung kode yang ditawarkan dalam buku ini. Hal ini tidak biasa untuk buku
pemrograman.

Juga, pemula akan menghadapi volume tinggi pesan kesalahan karena kesalahan ketik dan
merindukan kode. Ini baik-baik saja dan bagian dari proses pembelajaran. Anda akan belajar lebih
banyak dari tips bug daripada Anda akan dari hanya menyalin dan menyisipkan kode.

Dalam kebanyakan kasus, Anda akan menemukan jawaban atas masalah Anda jika Anda pasien. Yii 2
forum adalah sumber yang sangat baik dari dukungan dan ada banyak programmer yang hebat yang
akan membantu Anda. Selalu melakukan yang terbaik untuk mencoba memecahkan masalah yang
pertama karena akan bodoh untuk mengikat programmer dengan permintaan dukungan lebih
kesalahan ketik. Namun demikian, yang pasti akan terjadi. Hanya ingat untuk bersikap sopan dan
perhatian dari orang lain dan Anda akan melakukan besar.

Summary
Aku tahu itu bisa menjadi sedikit menakutkan pada awalnya, terutama ketika Anda menyadari
bahwa Yii 2 bukan hanya beberapa set sepele file library yang dapat Anda menguasai dalam
beberapa hari, tetapi menggantung di sana dan bersabar. Kita

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
http://beta.phpformatter.com/
http://yii2framework.wordpress.com/

akan menangani satu langkah pada satu waktu.

Jadi biarkan aku menyimpulkan pengenalan dengan pemikiran berikut. Belajar Yii 2 akan datang
mudah bagi sebagian orang dan mereka sangat beruntung. Jika Anda berada di kamp lain, orang-
orang yang harus bekerja keras untuk mempelajarinya, saya dapat memberitahu Anda bahwa saya
tahu persis bagaimana perasaan Anda. Sulit bagi saya juga. Tapi saya juga dapat memberitahu Anda
bahwa Anda dapat optimis. Kamu bisa melakukan ini. Hanya dengan tongkat itu dan bergerak pada
kecepatan Anda sendiri. Dan segera Anda akan kagum pada bagaimana Anda menggunakan Yii 2
untuk daya aplikasi Anda dan Anda akan lebih kagum pada apa yang dapat Anda buat dengan itu.
Chapter Two: Yii Advanced Template Installation
Quick Setup of Yii2 Advanced Template
Ok, mari kita melompat! Kami akan menggunakan yii2build sebagai direktori root dan nama proyek.
Kami akan mengembangkan dan hosting pada mesin Windows dengan XAMMP diinstal dan kami
menggunakan PhpED sebagai IDE kami. Jika Anda ingin menggunakan IDE gratis, Netbeans populer
seperti Eclipse. Google atau lihat Bab 1 untuk link dan men-download secara gratis.

Pada titik ini, kami akan menganggap Anda memiliki setup lingkungan pengembangan Anda dan
diuji, dan bahwa Anda telah menghabiskan beberapa waktu mengakrabkan diri dengan bagaimana
alat bekerja. Anda perlu:

Eclipse atau Netbeans atau IDE lainnya


Komposer
xampp atau apache, php, mysql lingkungan lainnya
Mysql Workbench
PhpMyAdmin (termasuk dengan XAMMP)
konsol 2 (opsional)
GIT atau kontrol versi lain

Lihat bab 1 untuk link ke download gratis pada alat di atas, jika Anda belum terinstal mereka.

Jika Anda tidak pada tahap ini, Anda perlu kembali ke pendahuluan dan pastikan Anda memiliki
semua alat yang diperlukan diinstal.

Benci Windows atau XAMMP? Bukan masalah. Jelas, Anda tidak perlu mengikuti pada Windows
untuk membaca buku ini. Jika Anda bekerja langsung pada stack LAMP atau sesuatu yang lain, Anda
hanya perlu tahu perintah linux. Aku tidak memberikan mereka di sini, tapi Anda dapat dengan
mudah google mereka. Hanya untuk mengulangi, instruksi ini XAMMP pada Windows, tapi hanya
ada perbedaan kecil, sehingga Anda harus dapat mencari tahu jika Anda menggunakan sistem yang
berbeda.

Untuk kenyamanan Anda, saya juga daftar link ke Yii 2 panduan untuk instalasi Lanjutan App:

Yii 2 Advanced App Setup


Ok, mari kita mulai:

http://www.yiiframework.com/doc-2.0/guide-tutorial-advanced-app.html

Step 1 Create Folder


Pergi ke direktori yang menyimpan akar proyek, dalam kasus saya itu var\www dan membuat folder
baru bernama yii2build. Jadi Anda harus memiliki folder \var\www\yii2build.

Step 2 Apache Conf


Mengatur apache conf. Dari mesin windows yang akan kita edit ini dari notepad, berjalan dalam
mode administrator. Cari notepad dari tombol start pada task bar. Klik kanan dan pilih berjalan
dalam modus administrator.
Notepad akan terbuka. Pilih file yang terbuka dan jalan untuk vhosts, dalam kasus saya:
C://xampp/apache/conf/extra/

pilih semua Files untuk jenis file:

Kemudian pilih:
httpd-vhosts.conf

Tambahkan entri berikut ke file:

NameVirtualHost *
<VirtualHost yii2build.com>
DocumentRoot "C:\var\www\yii2build\frontend\web"
ServerName localhost
ServerAlias www.yii2build.com
</VirtualHost>
<VirtualHost yii2build.com>
DocumentRoot "C:\var\www\yii2build\backend\web"
ServerName backend.yii2build.com
ServerAlias www.yii2build.com
</VirtualHost>

Step 3 Localhost
Mengatur entri host lokal:

Pada jendela, buka notepad dalam mode administrator dan pergi ke:
c:// Windows/System32/drivers/etc

pilih semua Files untuk jenis file, lalu pilih:


hosts

tambahkan berikut dan simpan:

127.0.0.1 yii2build.com wwww.yii2build.com


127.0.0.1 backend.yii2build.com

Step 4 Restart Apache


Klik pada panel kontrol xampp dan me-restart apache:

Perhatikan bahwa kita menjalankan MySql sebagai sebuah layanan, tetapi tidak apache. Jika Anda
tidak mengatur XAMMP belum, jelas, Anda akan perlu untuk melakukannya sebelum melanjutkan.
Saya sarankan bahwa Anda telah mengatur semua alat Anda dan dikonfigurasi sebelum melanjutkan
dan bahwa Anda mengambil beberapa waktu untuk membiasakan diri dengan mereka. Saya
menyertakan link video yang XAMMP dalam bab 1 yang dapat Anda lihat juga.
Step 5 Create Project in IDE
Buat proyek yii2build di IDE Anda menggunakan yii2build sebagai folder root. Jika Anda tidak yakin
bagaimana melakukan ini, google tutorial untuk IDE yang Anda gunakan.

Jadi sekarang kita bisa melakukan tes kecil untuk melihat apakah kita memiliki setup tuan rumah
kami file dengan benar. Dalam folder yii2build Anda, membuat folder bernama frontend dan
backend disebut lain. Di dalam masing-masing folder, membuat folder bernama web. Jadi Anda
harus memiliki yii2build/frontend/web/ dan yii2build/backend/web/.

Sekarang membuat file php bernama index, dengan garis tunggal berikut:

<?PHP
phpinfo();
?>

Menyimpan salinan ke kedua folder. Jadi Anda harus memiliki:

yii2build/frontend/web/index.php
yii2build/backend/web/index.php

Jika Anda mengetik yii2build.com dan backend.yii2build ke dalam browser Anda, mereka berdua
harus kembali output phpinfo, yang juga mudah memberi Anda kesempatan untuk memeriksa untuk
melihat apakah Anda memiliki PHP 5.4 atau lebih besar, yang adalah apa yang Anda butuhkan untuk
menjalankan Yii 2 .
Jika halaman tidak menyelesaikan, kembali dan memeriksa berkas host Anda dan / atau httpd-
vhosts.conf Anda. Pastikan untuk me-restart Apache setelah melakukan perubahan. Pastikan Anda
memiliki entri host lokal untuk domain, yii2build. Lihat kembali ke langkah 2 dan 3 jika diperlukan.

Pada titik ini, Anda harus dapat melihat bahwa entri host Anda adalah benar dan bahwa Anda
sedang menjalankan versi yang benar dari Php. Ini adalah independen dari Yii 2 dan komposer,
sehingga berhasil menerapkan langkah 5 memberi Anda titik uji untuk bagian pertama dari setup
kita.

Jika ini semua pemeriksaan keluar, Anda telah berhasil menguji entri host Anda dan Anda harus
menghapus ini folder tes web dan isinya. Jelas meninggalkan folder root, yii2build, di tempat.

Step 6 Find Command Line Path


Dari baris perintah windows, pergi ke folder yii2build Anda. Pertama cd\, kemudian
cd\var\www\yii2build jika Anda telah memiliki yii2build di\var\www. Aku tahu ini bisa sedikit
membingungkan, jadi biarkan aku hanya mengulangi. \var adalah folder di c saya: drive, dalam yang
merupakan folder bernama www, dan di dalam www, saya membuat sebuah folder bernama
yii2build, di mana proyek akan berada.

Anda tidak harus mengikuti ini persis, Anda hanya perlu tahu di mana folder root Anda dan pastikan
Anda memiliki entri host yang sesuai.

Step 7 Composer Self-Update


Pastikan komposer terinstal dan up-to-date. Dari baris perintah, di direktori akar proyek Anda, Anda
harus menjalankan: komposer diri pembaruan.

Jika Anda mendapatkan pesan kesalahan, periksa instalasi dari komposer. Jika Anda tidak memiliki
komposer diinstal, Google untuk petunjuk tentang instalasi ke jendela dan xampp.

Anda juga perlu memastikan plugin berikut diinstal ke komposer. Mengeluarkan perintah berikut
dari direktori yang sama di mana Anda melakukan self-update:
composer global require "fxp/composer-asset-plugin:1.0.*@dev"

Jika plugin di atas tidak terpasang, komposer tidak akan bertindak dengan benar. Kabar baiknya
adalah bahwa selama Anda memiliki komposer kerja, plugin mudah untuk menginstal dengan satu
perintah sederhana dari atas.

Tip
Aku memeriksa Yii 2 Guide dan versi direkomendasikan terbaru dari plugin ini
"fxp/composer-aset-plugin: 1.0.0-Beta3" Jika untuk alasan apapun, bahwa versi plugin
adalah dari tanggal, menggunakan Google untuk menemukan versi yang benar. Anda
juga dapat mencobadev, yang harus bekerja, tapi Anda tidak pernah tahu. Saya akan
melakukan yang terbaik untuk menjaga buku up-to-date, tetapi ini adalah hal-hal yang
akan sulit untuk melacak. Saat melakukan setup pada buku pemrograman, ini adalah
masalah umum, jadi ini hanya kepala.

Step 8 Install Yii 2


Menginstal Yii 2 Template maju melalui komposer. Kami melakukan ini dari baris perintah dalam
folder di atas:
composer create-project --prefer-dist yiisoft/yii2-app-advanced

Tip
Petunjuk dalam panduan yang sedikit berbeda dalam bahwa Anda dapat mengatur
folder root dengan instalasi. Saya tidak suka melakukannya dengan cara ini yang
mengapa saya merekomendasikan bahwa Anda mengikuti arah ini, yang memiliki
langkah tambahan, tetapi memungkinkan Anda untuk memeriksa untuk melihat
apakah entri tuan rumah bekerja sebelum Anda menginstal Yii 2.

Step 9 Check For Yii 2 Folder


Anda sekarang akan memiliki folder bernama yii2-aplikasi maju dalam folder yii2build Anda.

Menggunakan windows explorer, buka folder ini, dan Anda akan melihat semua file framework. Pilih
semua file dan menyalinnya satu tingkat ke folder root yii2build, kemudian Delete folder yii2-app-
advanced. Jadi, hanya untuk membuatnya sangat jelas, sekarang Anda harus memiliki folder root,
dalam hal ini yii2build, dengan file framework di dalamnya pada tingkat pertama. Seharusnya tidak
ada folder yii2-aplikasi canggih pada saat ini. Seharusnya terlihat seperti ini setelah Anda hapus itu:
Step 10 Run Php Init
Kembali ke baris perintah. Dalam \path\to\yii2build, dalam kasus saya itu \var\www\yii2build,
jalankan: php init.

Ini akan menanyakan apakah Anda ingin menginisialisasi dalam pengembangan atau produksi. Pilih 0
untuk pembangunan. Kemudian mengkonfirmasi Yes.

Step 11 Create The Database


Membuat database. Pergi ke phpmyadmin. Buka tab database, membuat DB bernama yii2build,
dengan pemeriksaan latin1_general_ci.
Step 12 Set DB Connection
Sesuaikan array komponen di yii2build\common\config\main-local.php sesuai. Akan terlihat seperti
ini:

'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2build',
'username' => 'root',
'password' => 'yourpassword',
'charset' => 'utf8',
],

Jelas mengganti kata sandi Anda yang sebenarnya dalam konfigurasi. Jangan lupa untuk
menyimpannya.

Step 13 Run Migration


Kembali ke baris perintah. Anda mungkin memiliki jalan yang berbeda, jika demikian, itu harus jalan
ke \rootfolder\yii2build> yii migrate. Dalam setup saya, itu\var\www\yii2build,menjalankan yii
bermigrasi. Seperti:
\var\www\yii2build>yii migrate

Konfirmasi ya.

Ini akan membangun tabel yang diperlukan dalam database Anda. Anda dapat memeriksa
PHPMyAdmin dan Anda harus memiliki tabel berikut dalam yii2build yang:
migrations
user

Step 14 Create Git Repository


Langkah 14. Buat repositori GIT. Buka Git GUI. Pilih buat repositori baru. Pilih yii2build. Pilih
panggung berubah. Sebuah peringatan mungkin muncul tentang indeks. Pilih melanjutkan jika itu
terjadi. Ketik Lanjutan App Install ke daerah pesan, lalu pilih komit.

Anda harus tahap perubahan sebelum melakukan. Anda mungkin harus membuka indeks atau klik
lanjutkan dari pop up kotak dialog. Anda juga akan perlu untuk memasukkan komentar sebelum
melakukan.

Untuk melihat repositori dari menu repositori, pilih memvisualisasikan semua sejarah cabang. Ini
akan menunjukkan cabang master saat ini dan sejarah itu, bagus untuk melacak perubahan Anda
dan melangkah kembali jika Anda perlu. Kontrol versi sangat penting pada sebuah proyek sebesar
ini. Hal ini tidak mungkin bahwa Anda bisa mendapatkan melalui proyek tanpa itu, jadi jangan
melewatkan langkah ini. Ingatlah untuk menyimpan, minimal, komit pada akhir setiap bab dari buku
ini. Anda mungkin harus melakukannya lebih sering dari itu.

Step 15 Confirm App Is Working


Konfirmasi aplikasi bekerja maju dengan mengetikkan yii2build.com ke dalam browser Anda. Anda
harus mendapatkan template aplikasi canggih yang akan memungkinkan Anda untuk mendaftarkan
pengguna dan login dengan user yang.
Anda harus mendaftarkan pengguna dan login untuk menguji aplikasi tersebut bekerja. Setelah Anda
membuat user, Anda dapat menguji backend juga.

Karena tidak ada kontrol akses dibedakan pada saat ini dari frontend ke backend, Anda dapat login
ke backend dengan pergi ke backend.yii2build.com dan login. Dalam kedua kasus, login hanya akan
kembali halaman index dan di nav bar menampilkan user nama dan link logout.

Trouble-Shooting
Jika tidak menyelesaikan, kemudian memeriksa host file Anda dan httpd-vhosts.conf. Pastikan
Apache berjalan di xampp dan telah restart setelah melakukan perubahan pada host file. Pastikan
versi PHP adalah 5.4 atau lebih tinggi, yang diperlukan untuk Yii 2.

Jika Anda melihat pohon direktori, bukan homepage, Anda tidak berhasil menjalankan init, kembali
ke langkah 10. Jika Anda dapat melihat homepage, tetapi mendapatkan kesalahan DB ketika Anda
mencoba untuk mendaftar, pastikan di PhpMyAdmin yang database yii2build ada, bahwa Anda
memiliki password yang benar untuk itu, dan bahwa Anda telah memasukkan pengaturan tersebut
di yii2build\common\config\main-local.php. Juga pastikan Mysql berjalan di XAMMP, melihat foto
pada langkah 4 untuk referensi.

Jika Anda masih tidak bisa mendapatkannya bekerja, mulai dari awal atau setidaknya dari titik di
mana Anda dikonfirmasi entri tuan rumah bekerja dan bahwa Anda menjalankan PHP 5.4.

Summary
Selamat, bagian tersulit dari buku ini adalah lebih. Mudah-mudahan, ini berjalan lancar untuk Anda.
Jika Anda memiliki masalah dengan setup, ulangi langkah-langkah sampai Anda bisa melakukannya
dengan benar. Jika Anda yakin semuanya benar, tapi masih tidak bekerja, konsultasikan dengan docs
individu komponen untuk melihat apakah sesuatu berubah sejak buku ini ditulis. Google biasanya
sangat efektif untuk ini, saat dipanggil untuk melayani.

Dalam bab-bab selanjutnya, kita akan mulai bekerja dengan cara kami ke dalam pembangunan
dengan Yii 2. Kami mulai dengan tur singkat dari arsitektur MVC, tetapi kita tidak menghabiskan
banyak waktu pada teori, kecuali kita dapat menggunakannya untuk kode. Sebaliknya, kita
menyelam dengan cepat di bab-bab berikutnya.
Saya telah belajar melalui pengalaman pribadi bahwa penjelasan dari konsep yang lebih luas bekerja
lebih baik ketika mereka digabungkan dengan implementasi praktis, itulah sebabnya saya belajar
hampir tidak ada dari sebagian pelajaran OOP online saya, hanya tayangan samar interface dan
warisan kelas. Tidak perlu khawatir. Salah satu hal besar mengenai Yii 2 adalah bahwa hal itu
menarik bersama-sama begitu banyak dari prinsip-prinsip dan konsep OOP dengan cara yang intuitif
seperti itu, bahwa Anda akan memahami teori-teori saat Anda pergi. Setidaknya Anda akan melihat
mereka menunjukkan.
Chapter Three: Welcome to the MVC
Sekarang kita mempunyai template advanced yang terinstall, mari kita mengambil beberapa menit
untuk membiasakan diri dengan struktur app tersebut. Jadi seperti ini :

Anda dapat melihat aplikasi tersebut yang dibagi dalam backend, common, console, environments,
frontend, test, dan folder vendor.

MVC Pattern
Yii 2 mengikuti pola desain MVC, dimana M singkatan Model (model), V singakatan View
(pandangan), dan C singakatan Controller (kontroler). Kita akan membahas secara singkat, tapi
hanya untuk gambaran. Cara terbaik untuk memahami itu bekerja dengan kode dan struktur
direktori secara langsung, yang akan kita lakukan secepatnya. Disini tampilan lain dari struktur
dengan beberapa folder yang terbuka:
Anda dapat melihat pada backend dan folder frontend memiliki folder bernama models, controllers,
dan views. Pada folder umumnya memiliki models, tapi bukan controller atau views. Anda mungkin
ingin melihat isi semua folder yang ada.

Dalam Yii 2, model bertanggung jawab untuk masuk dan mengambil data dari database. Ini termasuk
beberapa hubungan yang membutuhkan sambungan dari models, untuk contoh, pengguna dan
profil pengguna.

Ketika sebuah web melakukan permintaan, controller biasanya rute ke model, dimana itu terhubung
dengan database, dan kemudian menampilkan hasil yang telah diolah. Hal ini memungkinkan untuk
pemisahan logika dan presentasi. Anda mendapatkan ksesluruhan model dari php, mengendalikan
yang kebanyakan hanya routing, dan menampilkan yang ringan pada PHP dan berurusan lagi dengan
HTML dan javascript untuk presentasi. Itu mungkin semua yang dibutuhkan untuk mengatakan
tentang hal itu sebagai teori abstrak. Itu semua bekerja baik dan kita akan melihat bagaimana Yii 2
menerapkan pola ini dan bagaimana mudahnya untuk memahami dalam praktek.

Index.php
Ada persamaan 2 poin yang harus dapat di akses dari aplikasi web ini. Backend dan frontend
memiliki sebuah folder bernama web dalam diri mereka dan dalam folder yang memiliki file
bernama index.php. jika anda ingat, kita menetapkan entri host untuk melihat dari file tersebut,
sehingga backend.yiibuild.com yang masuk ke folder backend versi folder dan yiibuild.com masuk
dalam frontend satu. Masing-masing file identik dan terlihat seperti ini:
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php');
require(__DIR__ . '/../config/bootstrap.php');
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
$application = new yii\web\Application($config);
$application->run();

Dua baris pertama untuk memeriksa apakah konstanta ada atau mendefinisikan untuk debug dan
dev.
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

kemudian datanf membutuhkan laporan untuk file yang diperlukan untuk menjalankan aplikasi,
termasuk autoloader:
require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php');
require(__DIR__ . '/../config/bootstrap.php');

$config diatur dengan metode penggabungan ArrayHelper dan membutuhkan file yang ditentukan
dalam array:
$config = yii\helpers\ArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);

Anda dapat melihat kenaikan 2 direktori untuk menemukan folder umum untuk config itu. Kemudian
naik 1 direktori untuk menemukan konfigurasi dari frontend atau backend, tergantung pada file
index.php untuk melakukan panggilan.

Lalu kemudian, kita membuat contoh baru dari model aplikasi, menggunakan konfigurasi untuk
ketergantungan injeksi, yang kini menjadi wadah untuk aplikasi. Kemudian kita menjalankan dengan
metode tersebut:
$application = new yii\web\Application($config);
$application->run();

The Application Instance


Aplikasi ini sekarang tersedia secara global sebagai Yii::$app. Ada banyak metode penting yang
tersedia dari Yii::$app dan kita akan membahas tentang itu nanti karena itu sangay nyaman untuk
menggunakan mereka.

Jangan terjebak dengan ini jika anda tidak mendapatkan itu segera. Anda akan belajar arsitektur dari
waktu ke waktu, bab ini hanya dimaksudkan untuk menjadi pengantar.

Juga, harus dicatat, saya hanya menyebutkan injeksi ketergantungan dalam melewati karena subjek
tampaknya minat meningkat akhir akhir ini. Secara umum, saya tertinggal jauh dari asitektur level
tinggi dan lebih fokus pada apa yang ada didepan kita dan bagaimana cara kerjanya, mur dan baut
bangun dan berjalan.

Routing
Jadi mari kita kembali ke index.php, file bertindak sebagai pintu aplikasi, menciptakan instance dari
itu. Ketika kita mengetik di url untuk aplikasi kita, kita akan selalu memanggil index.php. Yii 2
mengatur semua routing bagi kita, jadi ketika kita ingin mendapatkan ke situs halaman misalnya,
rute terlihat seperti ini

Yiibuild.com/index.php?r=site/index

Itu tidak terlihat sangat menarik. Anda dapat mengatur url menjadi menarik di konfig, yang
membatu mesin pencari merekaa keramaha dan anda juga dapat menghilangkan kebutuhan untuk
menunjukkan index.php di url, tapi kami tidak melakukan ini dengan proyek kami. Dengan
menunggu itu, kita harus menghilangkan debug url atau apache, jika masalah dengan halaman harus
muncul.

Setelah kami selesai, anda dapat dengan mudah berkonsultasi dengan Yii 2 panduan untuk mengatur
url yang menarik jika anda ingin:

Pretty Urls
Oke, mari kita kembali ke routing:

R=site/index memberitahukan Yii 2 apa yang kita inginkan site controller dan aksi pada index. Jika
permintaan masuktidak memenuhi spesifikasi rute, yang terjadi ketika seseorang hanya memiliki
tipe yiibuild.com untuk contoh, saat itu, rute yang ditentukan oleh
yii\webApplication::$defaultRoute akan digunakan. Default diatur ke site/index, yang, telah
disebutkan diatas, menentukan site controller dan aksi pada index.

Jika tidak ada tindakan yang ditentukan, controller mengasumsikan Anda ingin aksi index, contoh:

Yiibuild.com/index.php?r=site

Ini mengembalikan tindakan index dari site controller. Dalam kebanyakan kasus, aksi akan membuat
sebuah asosiasi view, tampilan dengan nama yang sama dengan aksi controller. Tindakan umum dan
dan tampilan awal, view, create, update, delete.

Kita sering mengacu pada create, read, update, dan delete tindakan sebagai CRUD.
Using Gii
Kami akan menggunakan Yii 2 ini modul bintang rock built-in, Gii, sepanjang masa alat generasi kode
terbesar yang pernah dibangun, untuk membantu kami melakukan banyak CRUD. Dan ketika kita
menggunakan Gii untuk membuat CRUD, kita sering menciptakan controller pada saat yang sama,
sehingga kita secara umum dapat mengharapkan CRUD untuk memasukkan controller. Jangan
khawatir jika ini adalah sedikit tidak jelas sekarang, itu akan membuat lebih banyak arti kemudian
ketika kita membuat file. Dan ya, aku menggunakan Gii, dan aku cukup yakin pada saat kami selesai,
Anda juga.

Jika Anda melihat dalam pandangan folder di bawah frontend, Anda dapat melihat folder bernama
site, yang memiliki index.php mengajukan di dalamnya. Ini adalah tampilan halaman diberikan oleh
aksi index site controller. Site controller itu sendiri terletak di
frontend\controllersSiteController.php.

Melihat sekitar folder. Dalam backend, Anda akan menemukan controller, model, view. Anda akan
menemukan sama dalam folder frontend. Dalam folder umum, Anda melihat config, mail, dan
models. secara keseluruhan, Anda dapat melihat konsistensi dalam konvensi penamaan dan mereka
membuat Yii 2 mudah untuk memahami dari titik MVC tampilan.

Jadi jelas, ini sangat berbeda dari aplikasi web sederhana di mana Anda akan memiliki url seperti
samplesite.com/about.php. Jika Anda tergoda untuk melewatkan belajar Yii 2 karena aplikasi Anda
saat ini persyaratan tidak perlu begitu kuat, perlu diingat bahwa dari waktu ke waktu, aplikasi
persyaratan cenderung meningkat.

Jika hari ini klien Anda tidak perlu bentuk dengan aturan validasi yang kuat, itu tidak berarti bahwa ia
tidak akan membutuhkannya besok.

Bootsrap
Juga, dengan Yii 2, Anda mendapatkan kerangka frontend Bootstrap terintegrasi out-of-the-box. Jika
Anda terbiasa dengan kerangka Twitter Bootstrap, saya sarankan Anda melihatnya, itu telah menjadi
cepat standar industri. Anda dapat melihatnya di sini:

Get Bootstrap
Anda tidak perlu men-download atau melakukan sesuatu meskipun, karena seperti yang saya
katakan sebelumnya, Yii 2 hadir dengan sudah terintegrasi sebagai default. Itu berarti Anda
mendapatkan css platform responsif yang skala untuk perangkat, memungkinkan Anda untuk
membuat desain ponsel pertama dari awal. Dan itu, teman-teman saya, hanyalah cherry di atas kue!

Suatu hari klien Anda ingin website apa-apa dan hari berikutnya dia ingin css mobile. Anda dapat
memberikan karena Anda sudah ada. Pokoknya, aku tidak berusaha untuk terdengar seperti
salesman. Aku benar-benar mencintai platform ini dan itu menunjukkan.

Dalam proyek-proyek kami sebelumnya, kita mungkin memiliki menciptakan header dan footer file
yang kita bisa membutuhkan di halaman pribadi kita, sederhana namun efisien. Bagaimana jika Anda
lupa untuk menyertakan file atau salah ketik ke versi sebelumnya? Bagaimana theming dan
pendekatan canggih lainnya?

Yii 2 memiliki solusi keren untuk ini dengan menggunakan layout. Tampilan yang diterapkan ke tata
letak dan ada metode yang tersedia di tingkat config site atau tingkat kontroler untuk menentukan
tata letak untuk menggunakan. Sebuah layout default sudah ada, sehingga Anda tidak perlu
melakukan apapun jika Anda tidak ingin mengubahnya. Anda juga dapat menggunakan layout
bersarang, jika Anda merasa bahwa perlu.

Untuk tujuan kita, kita akan tetap dengan tata letak default, yang terletak di
frontend\views\layout\main.php. Satu-satunya hal yang akan kita perhatikan saat ini adalah bahwa
tag ini di tengah-tengah halaman:

<?= $content ?>

Debugger
Satu hal lain yang kita harus menyebutkan adalah agak mencolok alat Yii Debugger yang terletak di
bagian bawah halaman, ketika Anda melihat template maju dalam browser. Ini memiliki banyak
utilitas yang berguna, seperti

Configuration
Logs
Profiling
Database
Asset Bundles
Mail

Kami tidak menghabiskan waktu di dalam buku ini, tetapi dalam alur kerja pemrograman Anda, ini
sangat berguna. Anda dapat memeriksa untuk melihat mana query sedang dijalankan, berapa lama
mereka mengambil dan banyak rincian lain yang membantu tentang bagaimana aplikasi Anda
bekerja. Luangkan waktu untuk membiasakan diri dengan itu. Anda akan mendapatkannya hanya
dengan bermain dengan itu. Jika Anda tidak menggunakannya, Anda dapat mengklik tanda panah di
bagian kanan bawah browser dan menyembunyikannya.

Summary
Seperti yang kami katakan dalam pendahuluan, Yii 2 tidak implementasi sepele pola MVC. Ini adalah
kerangka kerja yang luas yang kuat dan mudah digunakan, setelah Anda sudah familiar dengan itu.
Kurva pembelajaran bagi pemula dapat curam, tetapi tetap dengan itu, itu bekerja.

Aku akan melakukan semua yang saya bisa untuk membantu Anda di sepanjang, metode dengan
metode. Ini akan menjadi sedikit tidak jelas pada awalnya, tapi karena kami pergi bersama, dan kami
mendapatkan lebih dalam proyek, itu akan mulai masuk akal, dan potongan-potongan akan mulai
cocok.

Jadi, apa yang akan kita membangun sebagai contoh aplikasi kita? Apa yang akan menunjukkan fitur
berguna yang banyak proyek akan berbagi? Dan dapat kita benar-benar menggunakan apa pun yang
kita membangun di sini dalam proyek nyata?

Bertanya pada diri sendiri pertanyaan-pertanyaan membuat saya menyimpulkan bahwa buku ini
harus membangun sebuah aplikasi template bernama Yii 2 Build. Tunggu sebentar, tidak aplikasi
instalasi canggih sendiri template? Ya itu. Tapi kami akan mengambil hal-hal sedikit lebih jauh.

Kita akan menciptakan sistem RBAC dasar dengan UI yang memungkinkan kita untuk mengatur
peran, status, dan jenis pengguna untuk mengontrol akses ke frontend dan backend aplikasi. Kita
akan membangun sebuah kontroler ditingkatkan, sehingga jika kita ingin daerah dibayar dari aplikasi
kita, kita bisa menegakkan aturan itu.

Kami juga akan membuat user Model profil yang bisa diperpanjang atau diubah sesuai dengan
kebutuhan anda, tapi satu yang menunjukkan kepada kita bagaimana untuk mengontrol akses ke
tampilan yang harus pribadi ke pengguna yang memiliki mereka.

Tujuan kami adalah untuk membuat aplikasi kerja yang dapat Anda gunakan sebagai model untuk
proyek-proyek masa depan, salah satu yang jauh lebih jauh dalam pengembangan dari template
aplikasi canggih. Sekeren out-of-the-box template, kita dapat melakukan lebih banyak, dan belajar
seluk-beluk kerangka sepanjang jalan. Mari kita untuk itu dan mari kita bersenang-senang!

Juga perhatikan, pada akhir bab, Anda akan melihat:

Ini adalah pengingat untuk melakukan perubahan pada kontrol versi. Tidak perlu melakukannya
sekarang, karena kita tidak mengubah apa pun. Tapi tinggal di atas itu, itu akan menjadi bantuan
besar untuk Anda jika Anda perlu untuk melangkah mundur untuk alasan apapun.
Chapter Four: Modifying the user model
Sekarang kita akan melihat user model. Yii 2 advanced memberi kami sebuah user model, dimana
pengguna dapat login dan memulihkan password jika itu dibutuhkan, tapi kita akan mengubahnya.
Jadi hal pertama yang harus kita pahami adalah mengapa kita mengubahnya.

Sekarang aplikasi kita tidak memperlakukan logindari frontend beberapa perbedaan dari backend.
Tapi seluruh poin menciptakan wilayah yang terpisah untuk frontend dan backend adalah untuk
membedakan tingak akses.

Yii 2 hanya pergi sejauh out-of-the-box. Ia meninggalkan berbagai implementasi terserah anda
tentang bagaimana anda akan menangani akses untuk aplikasi anda. Bagian otentikasi, menentukan
kombinasi user/pass yang benar, sudah diserahkan pada kami out-of-the-box dalam template
aplikasi advanced. Kita tahu karena kita dapat login dan register pengguna baru.

Otorisasi, menentukan bagaimana pengguna diberikan akses ke halaman yang berberda yang
diserahkan pada kami. Yi 2 memiliki sebuah built-in RBAC (role based acces control) komponen itu
yang bias kita pilih, tapi secara pribadi saya menemukan sedikit kerumitan dan lebih memilih
pendekatan yang lebih sederhana.

Biasanya, saya mencoba untuk melakukan sesuatu dengan Yii 2 bermaksud, beberapa Programmer
PHP terbaik dunia bekerja menggunakan kerangka ini dan mereka benar benar telah memikirkan
segala sesuatu tentang itu. Di sisi lain, solusi untuk RBAC melibatkan banyak pilihan dan jadi kadang
kadang lebih baik memilih kerajinan itu, ia membawa anda lebih dekat dengan kode.

Pokoknya, saya ingin memberikan solusi kerja untuk RBAC, tanpa bogging kita turun di dalamnya.
Tapi aku masih ingin dapat mengontrol otorisasi dan akses melalui backend UI yang memungkinkan
saya untuk membuat peran dan mengelola pengguna dan status mereka. Saya akan menjelaskan
lebih lanjut tentang hal itu seperti yang kita lakukan.

Tujuan kami adalah untuk membangun sebuah template yang dapat kita gunakan untuk berbagai
macam proyek, jadi misalnya, bagaimana jika kita memiliki sebuah situs yang diperlukan izin gratis
melawan dibayar pengguna? Yang lebih dari tipe pengguna, tidak benar-benar berperan. Saya pikir
peran sebagai sesuatu yang lebih mendasar seperti admin, pengguna, layanan pelanggan rep, dll
Peran menggambarkan hubungan Anda dengan aplikasi.

Tipe user, di sisi lain, adalah sebuah konsep yang fleksibel yang bisa berlaku untuk gratis melawan
dibayar pengguna, atau berbagai jenis pengguna frontend. Sebagai contoh, jika Anda memiliki situs
musik dan beberapa pengguna adalah musisi dan orang lain yang hanya penggemar.

Ini juga penting untuk mempertimbangkan status, ketika merakit skema kami. Kita perlu cara untuk
menentukan apakah seorang pengguna aktif, tertunda, atau pensiun atau sebutan lain yang kami
gunakan.

Fleksibilitas adalah kunci, dan saya telah menemukan bahwa dengan menciptakan model terpisah
untuk konsep-konsep ini, lebih mudah untuk memanipulasi mereka. Jadi setelah trial dan error dan
beberapa iterasi, saya datang dengan sederhana, pendekatan namun kuat untuk otorisasi. Ini akan
membawa kita melalui beberapa setup Model dan langkah kita ke hubungan. Sebagian besar kode
ini benar-benar sederhana.
Anda juga akan melihat betapa mudahnya untuk membuat semua ini dengan Gii, Yii built-in
generator kode. Anda mungkin pernah mendengar tentang Gii dan itu adalah sebuah alat, tapi kami
tidak siap untuk menggunakan itu dulu, kita akan kembali ke sana pada bab berikutnya.

Sebaliknya, kita hanya perlu untuk memulai dengan beberapa modifikasi dengan apa yang sudah kita
miliki. Tabel user dan User Model diciptakan untuk kita secara otomatis oleh aplikasi canggih ketika
kita menginstal itu, dan sementara itu dekat dengan apa yang kita butuhkan, kita harus membuat
beberapa perubahan penting.

Role and Status


Anda akan melihat di database, bahwa Anda memiliki kolom untuk peran dan satu untuk status
dalam tabel user. Mereka berdua mengambil int sebagai tipe data mereka. Masalahnya adalah
bahwa kita ingin membuat tabel peran dan meja status dan kami ingin memberikan tabel ini baru
nama yang paling intuitif, yang, dan aku tidak mencoba untuk menjadi lucu di sini, peran dan status.
Ingat di Mysql, kita menggunakan huruf kecil sebagai konvensi.

Jadi tidak masuk akal, dan memang akan menimbulkan masalah ambigu jika kita meninggalkan
ladang yang ada di meja pengguna sebagai peran dan status. Ambigu adalah ketika query Mysql
tidak dapat menentukan bidang / meja yang benar untuk menarik data dari berdasarkan
kebingungan dalam nama. Hal ini dapat terjadi dengan bidang 'id', yang sebagian besar meja kami
gong untuk memiliki. Jika kita memiliki sebuah lapangan di meja user bernama peran dan peran
tabel yang berbeda bernama, itu akan menyebabkan jenis masalah dan mereka dapat sulit untuk
debug. Jadi kami melakukan yang terbaik untuk menghindari mereka sepenuhnya.

Dalam hal ini, kita perlu mengubah peran dan status bidang pada tabel user untuk role_id dan
status_id masing-masing. Cara terbaik untuk melakukan hal ini, jika Anda mengikuti dengan semua
alat, adalah melalui MySQL Workbench. Ini adalah grafis sedikit lebih dari phpMyAdmin, tapi salah
satu akan bekerja jika Anda memiliki preferensi.

Jadi mari kita mengubah peran untuk role_id dan pastikan memiliki nilai default '10'. Demikian pula,
mari kita mengubah status untuk status_id dan memberikan yang nilai default '10' juga. Sekarang
mari kita menambahkan satu lagi lapangan ke meja pengguna, dan kami akan menyebutnya
user_type_id itu dan juga memberikan bahwa nilai default '10'.

Berikut adalah screenshot dari Mysql Workbench:


Juga pastikan created_at dan updated_at bidang adalah tipe DATETIME. Untuk beberapa alasan
membangun awal diatur untuk menyimpan sebagai int untuk bidang-bidang, tapi kami akan bekerja
dengan perilaku pada model Pengguna memastikan mereka disimpan dengan benar sebagai
DATETIME.

Jangan lupa untuk melakukan sinkronisasi ke database:


Setelah kita membuat perubahan, tidak repot-repot menguji situs, tidak ada yang akan bekerja. Kita
akan harus mengubah User model sebelum kita menguji situs lagi.

Tip
Sebelum kita mulai, tip cepat jika anda tidak melihat. Hanya melihat file telah
menutup?> Tag. Tidak termasuk menutup?> Tag dalam model dan controller.

The User Model


Ok, mari kita lihat serius pada model pengguna. Ketika kami mendirikan Template advanced, Yii 2
melakukan semua pekerjaan untuk kita. Terbalik itu jelas, kita tidak perlu menulis kode apapun.
Downside adalah bahwa kita tidak benar-benar yakin bagaimana cara kerjanya. Dan tentu saja jika
kita akan mengontrol akses ke pengguna, kita akan harus tahu lebih banyak dari saat ini kami
lakukan tentang user model.

Demi singkatnya, saya tidak akan mengatakan terlalu banyak tentang model standar yang Anda
dapatkan dengan template advanced, karena kita memiliki begitu banyak tanah untuk menutupi.
Begitu banyak model inti adalah persis sama dengan model revisi kami, bahwa Anda akan
mendapatkan sebagian besar dari itu pula.

Ok, mari kita lakukan ini. Menggantikan User model yang ada dengan berikut:

<?php
namespace common\models;
use Yii;
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\db\Expression;
use yii\web\IdentityInterface;
use yii\helpers\Security;
/**
* User model
*
* @property integer $id
* @property string $username
* @property string $password_hash
* @property string $password_reset_token
* @property string $email
* @property string $auth_key
* @property integer $role_id
* @property integer $status_id
* @proprty integer $user_type_id
* @property integer $created_at
* @property integer $updated_at
* @property string $password write-only password
*/
class User extends ActiveRecord implements IdentityInterface
{
const STATUS_ACTIVE = 10;
public static function tableName()
{
return 'user';
}
/**
* behaviors
*/
public function behaviors()
{
return [
'timestamp' => [
'class' => 'yii\behaviors\TimestampBehavior',
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
'value' => new Expression('NOW()'),
],
];
}
/**
* validation rules
*/
public function rules()
{
return [
['status_id', 'default', 'value' => self::STATUS_ACTIVE],
['role_id', 'default', 'value' => 10],
['user_type_id', 'default', 'value' => 10],
['username', 'filter', 'filter' => 'trim'],
['username', 'required'],
['username', 'unique'],
['username', 'string', 'min' => 2, 'max' => 255],
['email', 'filter', 'filter' => 'trim'],
['email', 'required'],
['email', 'email'],
['email', 'unique'],
];
}
/* Your model attribute labels */
public function attributeLabels()
{
return [
/* Your other attribute labels */
];
}
/**
* @findIdentity
*/
public static function findIdentity($id)
{
return static::findOne(['id' => $id, 'status_id' => self::STATUS_ACTIVE]);
}
/**
* @findIdentityByAccessToken
*/
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['auth_key' => $token]);
}
/**
* Finds user by username
* broken into 2 lines to avoid wordwrapping * @param string $username
* @return static|null
*/
public static function findByUsername($username)
{
return static::findOne(['username' => $username, 'status_id' =>
self::STATUS_ACTIVE]);
}
/**
* Finds user by password reset token
*
* @param string $token password reset token
* @return static|null
*/
public static function findByPasswordResetToken($token)
{
$expire = Yii::$app->params['user.passwordResetTokenExpire'];
$parts = explode('_', $token);
$timestamp = (int) end($parts);
if ($timestamp + $expire < time()) {
// token expired
return null;
}
return static::findOne([
'password_reset_token' => $token,
'status_id' => self::STATUS_ACTIVE,
]);
}
/**
* @getId
*/
public function getId()
{
return $this->getPrimaryKey();
}
/**
* @getAuthKey
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* @validateAuthKey
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
/**
* Validates password
*
* @param string $password password to validate
* @return boolean if password provided is valid for current user
*/
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
/**
* Generates password hash from password and sets it to the model
*
* @param string $password
*/
public function setPassword($password)
{
$this->password_hash = Yii::$app->security->generatePasswordHash($password);
}
/**
* Generates "remember me" authentication key
*/
public function generateAuthKey()
{
$this->auth_key = Yii::$app->security->generateRandomString();
}
/**
* Generates new password reset token
* broken into 2 lines to avoid wordwrapping
*/
public function generatePasswordResetToken()
{
$this->password_reset_token = Yii::$app->security->generateRandomString()
. '_' . time();
}
/**
* Removes password reset token
*/
public function removePasswordResetToken()
{
$this->password_reset_token = null;
}
}

Tip
Kode untuk User.php tidak diformat persis seperti yang Anda inginkan dalam file
Anda. Ada beberapa contoh dari dua jalur yang digunakan ketika harus ada satu.
Alasannya adalah bahwa PDF dan format lain melanggar garis dengan wordwrap dan
menyisipkan karakter khusus yang mengacaukan kode, jadi saya harus proaktif
memformat kode sehingga garis tidak pecah. Ini tidak selalu terlihat cantik, tapi
setidaknya kode akan berfungsi. Anda harus menemukan kasus ini dan
mengkonversikannya ke satu baris dengan menghapus ruang putih. Fungsi public
static findByUsername ($username) dan fungsi publik generatePasswordResetToken ()
memiliki garis tambahan dalam tubuh fungsi. Jika Anda ingin, Anda dapat
menggunakan phpformatter.comuntuk memformat kode Anda, itu alat yang
berguna.

Properties of Model
Jadi di mana sifat-sifat dari kelas yang mewakili model? Anda dapat melihat mereka di komentar,
tapi mereka tidak terdaftar di kelas. Kenapa itu? Ternyata Yii 2, melalui itu sihir internal tahu sifat
dari model dengan nama field dari tabel, sehingga Anda tidak perlu menyatakan mereka. Betapa
kerennya itu? Ini tentu membuat sulit untuk lupa untuk menyertakan mereka.

Hal ini berlaku untuk model yang memperpanjang ActiveRecord. Model bentuk, yang akan kita
eksplorasi kemudian, memperpanjang Model dan memiliki sifat yang perlu dideklarasikan, tapi kami
tidak akan khawatir tentang itu sekarang.

Ok, mari kita beralih ke user model kami. Kami tidak membuat terlalu banyak perubahan, tapi jelas
kami menjatuhkan beberapa konstanta dan berubah peran dan status untuk role_id dan status_id.
Hal ini sesuai dengan perubahan tabel user kami. Meskipun kami menambahkan user_type_id ke
tabel user, kita tidak melihat bukti itu di sini, namun, seperti yang kita dijelaskan di atas, model tahu
itu atribut didasarkan pada struktur tabel.
Kita tidak bisa benar-benar memahami user model tanpa beberapa ide tentang bagaimana kita akan
mendukungnya, apa model lain kita akan membuat. Ke depan, ini adalah model kita tahu kita akan
membuat:

Role
Status
UserType
Profile
Gender

Dalam bab berikutnya, kita akan membuat tabel database untuk model ini, dan kemudian model
yang sebenarnya sendiri.

Banyak programmer akan membuat struktur database satu meja pada suatu waktu dan merasa
seperti mereka maju. Biasanya mereka menggunakan migrasi untuk mencapai hal ini. Selain migrasi
awal yang menciptakan model pengguna asli, kita tidak menggunakan migrasi.

Aku percaya besar dalam berpikir melalui struktur data dan menciptakan semuanya sekaligus,
sebagai lawan pendekatan adhoc. Itu tidak berarti Anda tidak dapat memperbaiki dan perubahan
saat Anda pergi, tapi pemikiran sedikit berjalan jauh. Anda tentu saja bebas untuk menggunakan
migrasi jika Anda inginkan, terutama jika Anda merasa nyaman menggunakan mereka. Lihat Yii 2
Panduan untuk rincian:

Yii 2 Migrations

Constants
Satu hal yang mungkin muncul keluar pada Anda dari yang daftar model baru, terutama dengan
Role, Status, dan UserType, adalah bahwa struktur data ini bisa alternatif ditangani oleh konstanta.
Sementara yang akan mungkin lebih mudah untuk menerapkan, saya mendukung menempatkan hal-
hal seperti nilai-nilai status di DB. Alasan untuk ini adalah bahwa saya kemudian dapat membuat UI
Admin yang memungkinkan saya untuk memperbarui dan menciptakan nilai-nilai baru, tanpa harus
pergi ke dalam kode.
const ROLE_ADMIN_VALUE = 20;

Tapi kemudian Anda memutuskan bahwa Anda perlu peran yang lebih luas, sebut saja SuperUser.
Anda harus kembali ke kode, menemukan setiap contoh di mana Anda menggunakan konstan,
membuat konstan lain, dan menambahkannya ke semua metode pendukung yang akan mengisi
nama-nama Roles untuk daftar dropdown, dll Ini cukup mudah untuk lakukan, tapi menurut saya,
bukan cara terbaik.

Saya lebih suka memiliki UI di backend yang memungkinkan saya untuk menambahkan catatan DB
yang mendefinisikan peran baru dan memberikan nilai. Kemudian, jika saya telah dikodekan metode
saya dengan benar, saya memilikinya tersedia untuk saya di mana-mana. Seperti yang kita kemajuan
dalam buku ini, Anda akan melihat bagaimana hal ini bermain keluar.

Sekarang jika Anda memeriksa di bawah deklarasi kelas kami, Anda akan melihat kami meninggalkan
satu konstan di tempat:
const STATUS_ACTIVE = 10;
Aku terus konstan di sana untuk alasan yang baik, meskipun itu melanggar DRY (sejauh untuk apa
yang akan kita membangun), karena nilai status aktif sangat penting untuk pendaftaran dan
memulihkan sistem password. Aku meninggalkan konstan di tempat, sehingga kita bisa
mendapatkan situs dan berjalan. Situs ini membutuhkan nilai ini untuk bekerja dan itu salah satu
dari kasus-kasus di mana aku bersedia untuk menduplikasi untuk kemudahan penggunaan. Anda
dapat mengganti ini kemudian dengan metode jika Anda memilih untuk melakukannya, meskipun
yang tidak tercakup dalam buku ini. Ini masalah sepele dalam tahap selanjutnya untuk membuat
perubahan jika Anda inginkan.

Identitiy Interface
Kembali ke deklarasi kelas sejenak:
class User extends ActiveRecord implements IdentityInterface
{

Ini adalah Yii 2 struktur kelas yang tidak saya tulis, tapi itu tidak masalah, kita masih dapat mencatat
beberapa hal tentang model.

Dalam hal ini, kami memperluas ActiveRecord dan menerapkan IdentityInterface, yang berarti kita
harus membuat metode antarmuka di User Class kami. Komentar memberikan rincian tentang apa
yang harus dilakukan metode. Ini akan memberi Anda beberapa ide tentang cara kerjanya, tapi
jangan khawatir jika Anda tidak langsung tahu bagaimana menulis metode, dan Anda akan melihat
mengapa itu dalam sekejap.

<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\web;
interface IdentityInterface
{

/**
* Finds an identity by the given ID.
* @param string|integer $id the ID to be looked for
* @return IdentityInterface the identity object that
*matches the given ID.
* Null should be returned if such an identity cannot be found
* or the identity is not in an active state
*(disabled, deleted, etc.)
*/
public static function findIdentity($id);
/**
* Finds an identity by the given secrete token.
* @param string $token the secrete token
* @param mixed $type the type of the token.
* The value of this parameter depends on the implementation.
* For example, [[\yii\filters\auth\HttpBearerAuth]] will
* set this parameter to be `yii\filters\auth\HttpBearerAuth`.
* @return IdentityInterface the identity object that matches
*the given token.
* Null should be returned if such an identity cannot be found
* or the identity is not in an active state
* (disabled, deleted, etc.)
*/
public static function findIdentityByAccessToken($token, $type = null);
/**
* Returns an ID that can uniquely identify a user identity.
* @return string|integer an ID that uniquely identifies a user identity.
*/
public function getId();
/**
* Returns a key that can be used to check the validity of a given identity ID.
*
* The key should be unique for each individual user, and should be persistent
* so that it can be used to check the validity of the user identity.
*
* The space of such keys should be big enough to defeat potential identity atta\
cks.
*
* This is required if [[User::enableAutoLogin]] is enabled.
* @return string a key that is used to check the validity of a given identity I\
D.
* @see validateAuthKey()
*/
public function getAuthKey();
/**
* Validates the given auth key.
*
* This is required if [[User::enableAutoLogin]] is enabled.
* @param string $authKey the given auth key
* @return boolean whether the given auth key is valid.
* @see getAuthKey()
*/
public function validateAuthKey($authKey);
}

Interface adalah seperti kontrak dengan subclass. Ia mengatakan jika Anda ingin menggunakan
antarmuka saya, Anda harus memiliki metode berikut. Jika Anda tidak memasukkan mereka semua,
itu akan kembali kesalahan. Programmer menggunakan Interfaces untuk mengontrol arsitektur.

Jadi IdentityInterface ini adalah kontrak User model kami perlu menerapkan. Ok, jadi saya berkata
kita tidak perlu khawatir tentang antarmuka, kenapa begitu? Untungnya bagi kita, template
advanced sudah mengimplementasikannya bagi kami, dan Anda dapat menemukan metode ini
sudah di User model kami, sehingga Anda tidak perlu menulis satu baris kode. Terima kasih Yii 2
Lanjutan Template!

Template dasar tidak datang dengan implementasi ini, jadi ini adalah salah satu alasan mengapa
template advanced sebenarnya lebih mudah diterapkan daripada template dasar. Ini salah satu
alasan utama kita memilih template advanced untuk buku ini.
Kami telah membuat perubahan kecil untuk sejumlah metode antarmuka yang disediakan oleh
template, mengubah atribut status' status_id 'untuk mencerminkan perubahan yang kami buat
dalam struktur data kami. Saya akan menunjukkan perubahan ini seperti yang kita bergerak melalui
setiap metode user model.

Jadi mari kita kembali ke User model kami yang tepat. Ketika kita bergerak melalui metode, saya
juga akan menunjukkan apa yang kita termasuk dalam laporan penggunaan untuk mendukung
metode ketika yang diperlukan.

Metode pertama yang kita lihat adalah:

public static function tableName()


{
return 'user';
}

Mudah-mudahan satu ini agak jelas. Saya berharap mereka semua ini mudah!

Behaviors
Metode berikutnya adalah:

public function behaviors()


{
return [
'timestamp' => [
'class' => 'yii\behaviors\TimestampBehavior',
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
value' => new Expression('NOW()'),
],
];
}

Saya menemukan konsep perilaku dalam Yii 2 sangat intuitif, ditulis dengan sintaks yang jelas dan
kode yang indah. Metode ini menceritakan model bagaimana berperilaku, mengingat peristiwa-
peristiwa tertentu.

Elemen pertama dalam array, 'timestamp' mengidentifikasi perilaku, dan kami katakan itu apa kelas
kita ingin menggunakan. Kemudian kita mendefinisikan peristiwa yang akan mempengaruhi atribut,
dalam hal ini ActiveRecord::EVENT_BEFORE_INSERT dan ActiveRecord::EVENT_BEFORE_INSERT. Titik
ini untuk atribut, 'created_at' dan 'updated_at', yang juga direpresentasikan sebagai field dalam
tabel user.

Perhatikan bahwa kita juga mendefinisikan nilai dan akan menggunakan:


'value' => new Expression('NOW()'),

Itu tangan string 'NOW()' untuk Mysql, yang merupakan sintaks MySQL untuk DateTime saat ini.
Tanpa itu, akan memasukkan integer, yang bukan perilaku yang kita inginkan. Jadi metode ini akan
menembakkan setiap kali sebuah record dibuat atau diperbarui dan menempatkan entri yang sesuai
ke dalam database dalam format DateTime yang benar.
Konsep perilaku digunakan secara luas pada Controller dan kami akan melihat nanti. Juga mencatat
bahwa untuk menggunakan Expression, kita harus menyertakan pernyataan penggunaan yang tepat:
use yii\db\Expression;

Ok, pada metode kami berikutnya:

Rules
public function rules()
{
return [
['status_id', 'default', 'value' => self::STATUS_ACTIVE],
['role_id', 'default', 'value' => 10],
['user_type_id', 'default', 'value' => 10],
['username', 'filter', 'filter' => 'trim'],
['username', 'required'],
['username', 'unique'],
['username', 'string', 'min' => 2, 'max' => 255],
['email', 'filter', 'filter' => 'trim'],
['email', 'required'],
['email', 'email'],
['email', 'unique'],
];
}

Ini adalah bagaimana mudah Yii 2 membuatnya untuk menegakkan aturan validasi pada model. Ini
format array, dimana nilai pertama adalah atribut, yang kedua adalah validator dipanggil, dan
kemudian datang parameter atau kondisi. Anda dapat memeriksa panduan untuk daftar yang lebih
lengkap dari validator dan bagaimana menggunakannya:

Yii 2 guide on Rules


Pertama 3 aturan berurusan dengan pengaturan default dan rentang yang diijinkan. Ruang putih di
antara baris hanya kosmetik untuk membuatnya lebih mudah untuk bekerja pada aturan untuk
atribut tertentu, urutan dalam mereka tidak terlalu penting.

Jika kita melihat set terakhir dari aturan, yang untuk email, kita melihat bahwa memastikan kita
memangkas ruang keluar, email diperlukan, email adalah tipe email, dan email unik. Yii 2 melakukan
semua ini untuk Anda dengan sintaks yang sederhana ini, bagaimana sekeren itu?

Identity Methods
Metode berikutnya pada User model findIdentity, yang merupakan implementasi dari
IdentityInterface, yang kita bahas sebelumnya.

public static function findIdentity($id)


{
return static::findOne(['id' => $id, 'status_id' => self::STATUS_ACTIVE]);
}

Ini adalah salah satu tempat di mana kami mengubah status ke status_id '. Ini diikuti dengan:

public static function findIdentityByAccessToken($token, $type = null)


{
return static::findOne(['auth_key' => $token]);
}

Juga dibuat untuk kita oleh template advanced:

/*
*broken into two lines to avoid wordwrapping
* line break to avoid wordwrap
* body should be single line in your IDE
*/
public static function findByUsername($username)
{
return static::findOne(['username' => $username, 'status_id' =>
self::STATUS_ACTIVE]);
}

Di sini sekali lagi kita telah menggunakan 'status_id' atribut bukan 'Status'. Metode lain dari
IdentityInterface, dengan perubahan yang sama untuk atribut 'status_id':

public static function findByPasswordResetToken($token)


{
$expire = Yii::$app->params['user.passwordResetTokenExpire'];
$parts = explode('_', $token);
$timestamp = (int) end($parts);
if ($timestamp + $expire < time()) {
// token expired
return null;
}
return static::findOne([
'password_reset_token' => $token,
'status_id' => self::STATUS_ACTIVE,
]);
}

Dan metode lain dari Interface:

public function getId()


{
return $this->getPrimaryKey();
}

Dan dua metode yang terakhir dari Interface yang disediakan oleh Template Lanjutan:

public function getAuthKey()


{
return $this->auth_key;
}

public function validateAuthKey($authKey)


{
return $this->getAuthKey() === $authKey;
}
Sejak template aplikasi canggih memberikan metode Interface untuk kami, kami tidak akan
menutupi mereka secara lebih rinci. Jika Anda ingin membaca lebih lanjut tentang mereka, Anda
dapat memeriksa:

Yii 2 Security Authentication

Boilerplate Methods
Beberapa kelas berikutnya adalah bagian dari boilerplate, yang tidak kita rubah. Komentar
memberikan penjelasan yang lebih baik daripada aku bisa, karena ini adalah metode kerangka
mendalam bahwa tidak saya tulis:

/**
* Validates password
*
* @param string $password password to validate
* @return boolean if password provided is valid for current user
*/
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
/**
* Generates password hash from password and sets it to the model
*
* @param string $password
*/
public function setPassword($password)
{
$this->password_hash = Yii::$app->security->generatePasswordHash($password);
}
/**
* Generates "remember me" authentication key
*/
public function generateAuthKey()
{
$this->auth_key = Yii::$app->security->generateRandomString();
}
/**
* Generates new password reset token
* line break to avoid wordwrap
* body should be single line in your IDE
*/
public function generatePasswordResetToken()
{
$this->password_reset_token = Yii::$app->security->generateRandomString()
. '_' . time();
}
/**
* Removes password reset token
*/
public function removePasswordResetToken()
{
$this->password_reset_token = null;
}

Jika semua berjalan dengan baik dengan memperbarui tabel pengguna dan menyalin User model
baru, Anda harus dapat menggunakan aplikasi tersebut untuk mendaftarkan pengguna. Setiap
pengguna lama kemungkinan besar turun ketika Anda membuat perubahan skema. Jika karena
alasan tertentu tidak bekerja, menelusuri kembali langkah-langkah dan periksa ejaan Anda dengan
hati-hati. Pastikan DB diperbarui dengan bidang yang benar.

Catatan: Karena kita mengubah bidang kita untuk status_id, out-of-the-box lupa fungsi sandi
sekarang rusak. Jangan khawatir, kami akan memperbaikinya nanti.

Other Models Accessing User


Sebelum kita mengakhiri bab tentang model User, kita harus membicarakan fakta bahwa controller
tidak selalu mengakses User model dengan cara yang sama. Ada berbagai model yang controller
dapat digunakan untuk memperbarui tabel user pada waktu yang berbeda. Misalnya, dalam aplikasi
kita, jika kita menciptakan pengguna dari formulir pendaftaran situs, controller akan menggunakan
model SignupForm terletak di frontend/models/SignupForm.php, yang disediakan oleh Yii 2 sebagai
bagian dari template advanced.

Itu mungkin terdengar membingungkan pada awalnya, tapi itu membuat banyak akal. Dalam
arsitektur MVC canggih, bentuk biasanya memiliki bentuk model untuk mengatur perilaku mereka.
Model bentuk bekerja di konser dengan controller untuk memberikan semua logika yang diperlukan
untuk memvalidasi dan memproses formulir.

SignupForm Model
Mari kita lihat model SingupForm, Anda melihat hanya ada 3 atribut:

class SignupForm extends Model


{
public $username;
public $email;
public $password;

Alasan mengapa tidak ada atribut atau aturan untuk role_id, status_id, user_type_id, misalnya,
adalah bahwa kita sedang mengatur yang secara default di latar belakang, tidak dari bentuk,
sehingga mereka tidak diperlukan. Ingat, kita menetapkan nilai default dari user_id sampai 10, dan
secara otomatis akan mencatat seperti itu ketika catatan pengguna dibuat.

Seringkali, data pengguna akan diserahkan ke model bentuk untuk menegakkan aturan validasi atau
metode lainnya. Data berasal dari dalam controller, yang memberikan model data posting dari
tampilan yang biasanya formulir. Ini terdengar lebih rumit daripada yang sebenarnya.

Ini penting untuk mengetahui bagaimana pengguna dibuat dalam aplikasi Anda, jadi kami mungkin
juga mengambil mengintip cepat, dan melihat bagaimana ini bekerja dengan melihat actionSignup()
metode pada frontend\controllersSiteController:

public function actionSignup()


{
$model = new SignupForm();
if ($model->load(Yii::$app->request->post())) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
return $this->goHome();
}
}
}
return $this->render('signup', [
'model' => $model,
]);
}

Anda dapat melihat metode panggilan contoh dari model SignupForm. Metode utama SingupForm
adalah signup(), yang menciptakan sebuah instance dari User model jika bentuk telah lulus validasi:

public function signup()


{
if ($this->validate()) {
$user = new User();
$user->username = $this->username;
$user->email = $this->email;
$user->setPassword($this->password);
$user->generateAuthKey();
$user->save();
return $user;
}
return null;
}

Ini akan mencoba untuk memvalidasi, dan jika dapat memvalidasi, itu panggilan sebuah instance dari
kelas pengguna, sehingga dapat mengatur properti pengguna untuk apa yang diserahkan formulir,
membuat password hash, menghasilkan kunci auth, menyimpan dan return $user. Sangat penting
untuk dicatat bahwa pernyataan kembali, ketika exectued, berakhir fungsi, sehingga Anda tidak
perlu lagi pernyataan di sini. Jika ada $user, hal itu akan kembali dan kode tidak pernah dijalankan
kembali nol. Jika jika pernyataan mengevaluasi palsu, itu akan mengembalikan null. Ini akan menjadi
false jika validasi gagal atau jika ada beberapa masalah lain.

Sekarang kepala seseorang mungkin meledak karena saya menjelaskan sesuatu yang begitu
mendasar. Tapi perlu diingat ini buku pemula dan kami ingin menyegarkan dan tumbuh
keterampilan pemrograman kami sebagai kita bergerak bersama.

Ok, kembali ke tindakan pada SiteController, di mana kita mendapatkan bagus bersarang jika
pernyataan, yang dapat kita pecah untuk memahami:
if ($model->load(Yii::$app->request->post())) {

Jika model (SignupForm) dapat memuat data posting dari Yii::$app->request->posting(), yang hanya
terjadi jika ada data posting. Sintaks untuk mendapatkan data posting jelas dan ringkas:
Yii::$app->request->post()

Ini membawa semua atribut bentuk bersama selama bentuk dan bentuk model yang dibangun
dengan benar. Data posting hanya dapat datang dari seseorang mengisi formulir pendaftaran pada
tampilan dan yang diteruskan oleh aksi pandangan. Jika itu terjadi, maka lanjutkan. Dalam hal ini
pandangan signup.php bawah frontend\views\site\signup.php. Kami tidak akan pergi ke detail pada
formulir sekarang, tetapi Anda dapat check it out untuk diri sendiri jika Anda ingin.

Berikutnya jika:
if ($user = $model->signup()) {

Memanggil metode pendaftaran dari SignupForm. Hal pertama metode pendaftaran yang dilakukan
adalah memvalidasi, jadi jika kita tidak bisa melewati aturan, itu tidak akan mendaftar pengguna dan
akan kembali pesan kesalahan kepada pengguna, berdasarkan perilaku aturan. Jika semuanya baik-
baik dan kita mendapatkan contoh dari $user, jika selanjutnya:

Kemudian ketiga jika:


if (Yii::$app->getUser()->login($user)) {

Kita mengakses getUser dan login user dari sebuah contoh aplikasi Yii, yang memiliki akses ke
metode-metode. Kami berbicara tentang menciptakan contoh aplikasi dari Index.php dalam bab 3,
jadi di sini sedang digunakan untuk memanggil beberapa metode dirantai.

Tip
Catatan, bagi kita untuk dapat menggunakan Yii::$app, kita perlu memiliki pernyataan
penggunaan, menggunakan Yii; di bagian atas file.

Jadi jika kita dapat menemukan pengguna dan login pengguna, maka:
return $this->goBack();

Ini hanya akan membawa Anda kembali ke halaman Anda memulai, tetapi dalam log in negara, jika
tidak, Anda mendapatkan formulir pendaftaran itu sendiri:

return $this->render('signup', [
'model' => $model,
]);

Dan dengan semua validasi dan metode internal Yii 2, jika Anda mencoba untuk mendaftar dan ada
yang tidak beres, maka akan muncul pesan error juga.

Metode login dari SiteController mirip:

public function actionLogin()


{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);
}
}
Pertama itu tes untuk melihat apakah Anda login atau tidak dengan memanggil metode isGuest.
Kami menggunakan ! di depan, jadi jika tidak tamu, Anda sudah login dan Anda pergi ke halaman
rumah.

Maka menggunakan model yang berbeda, model LoginForm dan baik log Anda dan membawa Anda
kembali ke halaman Anda berada di sebelumnya, tetapi dalam log in negara, atau berisi form login,
lagi dengan kesalahan jika Anda mencoba untuk login dan melakukannya dengan benar.

Ok, jadi kami mengambil jalan memutar cepat dari User model untuk memberikan gambaran
bagaimana pengguna diciptakan dan untuk memberikan melihat model bergerak data pengguna
melalui situs. Kami tidak benar-benar pergi ke terlalu banyak mendalam pada controller, kita akan
mencakup pengendali lebih rinci nanti, ini adalah tentang model yang mengendalikan pengguna. Di
sini kami memiliki 3 model yang berbeda, Pengguna, SignupForm, dan LoginForm yang dikendalikan
data pengguna.

Summary

Ok, itu banyak menyerap. Jika ini semua baru bagi Anda dan Anda sedang berjuang dengan itu
sedikit, jangan khawatir, hal itu akan menjadi lebih jelas dari waktu ke waktu karena Anda terbiasa
untuk melihat jenis yang sama dari metode yang digunakan untuk memindahkan data sekitar lokasi.
Kita akan melihat semua ini secara rinci lagi.

Jadi kita sedang membangun template dapat digunakan kembali dan mulai dengan memodifikasi
User model, yang memiliki banyak metode di atasnya yang mencapai jauh ke dalam kerangka kerja.

User model selalu drastis berbeda dari model lain karena hal-hal seperti metode set password dan
metode lain yang unik untuk pengguna. Kami juga menyentuh pada kenyataan bahwa kontroler
kadang-kadang dapat menggunakan model lain untuk membuat dan mengubah catatan pengguna.

Model-model lain kami akan membangun, seperti Role, Status,UserType, dll, cenderung lebih mudah
dan lebih mudah untuk memahami, belum lagi, jauh lebih pendek dalam ukuran.

Pada bagian berikutnya, kita akan menggunakan Gii, alat generasi kode Yii 2 ini, dan Anda akan
melihat betapa benar benar menakjubkan ini dan bagaimana cepatnya dalam bekerja.
Chapter Five: Creating New Models with Gii
Sebelum kita dapat menggunakan Gii untuk membuat model-model baru, kita harus membuat tabel
pertama. Seperti yang kami katakan di bab terakhir, tujuan kami adalah membuat struktur data yang
memungkinkan kita untuk mengelola pengguna dan mengontrol akses ke situs web.

Model yang akan kita buat:

Role
Status
Gender
UserType
Profile

Perhatikan bahwa dalam daftar di atas, karena kita berbicara tentang model-model, kita
menggunakan huruf besar, dan Anda dapat melihat pada UserType, yang saya gunakan format Gii
yang akan menciptakan dari konvensi di mana nama tabel adalah user_type. Kita akan memahami
bahwa lebih baik nanti dalam buku ini ketika kita menciptakan jenis user CRUD.

Creating Tables
Sekarang saatnya bagi kita untuk membuat sisa tabel. Aku akan memberikan screenshot dari Mysql
workbench, yang akan memberi kita kemudahan referensi untuk tidak hanya pada bidang yang kita
butuhkan, tetapi juga kendala dan jenis data.

Tip
MySQL CONSTRAINT digunakan untuk mendefinisikan aturan untuk mengizinkan atau
membatasi nilai-nilai apa yang dapat disimpan dalam kolom.

MySQL CONSTRAINT menegakkan integritas database.

MySQL CONSTRAINT dinyatakan pada saat membuat tabel.

MySQL CONSTRAINT adalah:

NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT

Untuk referesi tutorial di Mysql, cek W3Resource.

Role Table
Disini adalah table dari role
Perhatikan bahwa kita telah menggunakan huruf kecil untuk nama tabel. Jika nama tabel
membutuhkan dua kata, kita akan pisahkan dengan garis bawah. Kami juga akan menggunakan garis
bawah untuk memisahkan kata-kata dalam nama kolom seperti yang Anda lihat di atas.

Tabel role sangat sederhana. Pk singkatan Primary Key, NN berarti Not Null, dan AI adalah
autoincrement. Id record kami auto-increment. Kami menggunakan varchar untuk role_name dan
integer untuk role_value. Anda mungkin dapat menggunakan int kecil untuk role_value, saya akan
meninggalkan pilihan tergantung Anda.

Kadang-kadang ketika Anda membangun bahkan struktur data sepele, Anda akan ingin created_at
dan updated_at, ditambah created_by dan updated_by, hanya untuk melacak siapa yang melakukan
apa dan kapan. Tapi karena ini hanya memegang nama-nama dan nilai-nilai dari role, kita tidak perlu
field itu.

Status Table
Ok, mari kita lanjutkan dan sekarang melakukan dari satu status:

Ini identik dengan role, hanya itu status. Pada kedua tabel yang telah kita buat sejauh ini, kami
memilih untuk PK primary key pada kolom pertama, yang merupakan id. Kami juga mengaturnya
untuk NN, yang not null, yang berarti tidak boleh kosong.
User Type Table
Sekarang mari kita lakukan pada table user_type:

Itu jenis yang sama struktur data sebagai dua tabel pertama kita buat, hanya kita memiliki nama
tabel dengan garis bawah di dalamnya. Gii menciptakan konvensi penamaan khusus untuk
menangani hal ini, yang akan kita lihat nanti ketika kita membuat model, controller, dan views.

Gender Table
Disini kita mempunyai gender:

Yang satu ini bahkan lebih sederhana, hanya id dan gender_name.

Profile Table
Dan yang terakhir, adalah table profile:
Rencana kami adalah untuk memungkinkan setiap pengguna untuk membuat profil tunggal, jadi ini
akan memiliki satu untuk satu hubungan dengan User model. Inilah sebabnya mengapa pada User
model kita akan menambahkan metode berikut:

public function getProfile()


{
return $this->hasOne(Profile::className(), ['user_id' => 'id']);
}

Anda dapat melihat dalam hal ini id user diatur ke user_id catatan profil. Dan ini menetapkan
hubungan antara dua model. Kami akan melakukan itu dalam beberapa menit, setelah kami telah
menyiapkan model baru. Kemudian kita dapat memperbarui model Pengguna dengan metode
hubungan perlu berbicara dengan model lainnya.

Perhatikan bahwa pada kolom profil int, saya tidak mencentang UN, yang merupakan singkatan dari
unsigned dan tidak memungkinkan angka negatif.

Anda juga dapat melihat ada berlian merah pada kolom gender_id dan ini merupakan foreign key.
Foreign key ditetapkan untuk mengikat 2 tabel bersama-sama dan Gii dapat membaca data dan
konfigurasi ini hubungan untuk Anda ketika menciptakan model. Kita akan melihat hal ini dalam laga
nanti.

Sekarang semua yang perlu Anda ketahui, adalah bahwa foreign key untuk gender_id pada tabel
profil dipetakan ke id di tabel gender.

Synchronize
Jangan lupa untuk menyinkronkan model dengan DB yang sebenarnya:

Pastikan untuk memeriksa phpMyAdmin untuk memastikan semuanya disinkronkan ok:


Dan hanya itu. Semua dalam semua, itu adalah struktur data yang sangat sederhana dan kita akan
bersenang-senang dengan itu. Kita akan menggunakan Gii untuk membuat model, controller, dan
views, banyak kode yang akan dihasilkan bagi kami.

Configuring Gii
Tentu saja kita perlu memastikan bahwa kami telah menginstall Gii. Pergi ke url berikut di browser
Anda:
yii2build.com/index.php?r=gii

Jika itu tidak menyelesaikan, maka Anda perlu memeriksa berkas composer.json Anda untuk melihat
apakah Anda memiliki modul Gii yang diperlukan. composer.json dalam direktori root Anda dan
harus terlihat dalam IDE Anda.

Ini adalah file saya terlihat:

{
"name": "yiisoft/yii2-app-advanced",
"description": "Yii 2 Advanced Application Template",
"keywords": ["yii2", "framework", "advanced", "application template"],
"homepage": "http://www.yiiframework.com/",
"type": "project",
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "stable",
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": "*",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*",
"kartik-v/yii2-social": "dev-master",
"yiisoft/yii2-authclient": "*",
"fortawesome/font-awesome": "4.2.0"
},
"require-dev": {
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*",
"yiisoft/yii2-jui": "*"
},
"config": {
"process-timeout": 1800
},
"extra": {
"asset-installer-paths": {
"npm-asset-library": "vendor/npm",
"bower-asset-library": "vendor/bower"
}
}
}

Anda dapat melihat di bawah "require-dev", saya memiliki garis untuk gii. Saya memiliki beberapa
ekstensi termasuk untuk digunakan nanti, termasuk Karitk social, authclient, font-awesomedan lain-
lain. Masuk akal untuk hanya menyalin versi composer.json ke dalam file Anda, jadi pergi ke depan
dan melakukan itu, maka menjalankan update komposer dari baris perintah:

Sekarang jika Anda kembali ke url Anda:


yii2build.com/index.php?r=gii

Anda akan mendapatkan ke Gii. Jika Anda memiliki Gii di tempat pertama, pastikan Anda
menjalankan update komposer, sehingga kita dapat menarik dalam ekstensi kita akan butuhkan
nanti. Berikut ini adalah catatan hati-hati. Jika Anda melewatkan langkah, seperti pembaruan
komposer ini dengan file composer.json baru, maka akan menyebabkan masalah di kemudian ketika
diasumsikan Anda memiliki ekstensi ini. Harap berhati-hati untuk mengikuti instruksi persis, Anda
akan mendapatkan hasil yang lebih baik.

Lagi pula, jika Anda dapat melihat Gii, selamat dan mengambil napas, Anda akan bersenang-senang.

Making Models with Gii


Ok, arahkan browser anda ke:
backend.yii2build.com/index.php?r=gii

Create Role Model


Dan mari kita membuat model baru pertama kami. Kita akan mulai dengan model Role. Salah satu
keputusan yang kita harus membuat dimuka adalah tempat untuk mencari model. Pilihan logis yang
frontend, common, dan folder backend.

Panduan untuk Yii 2 merekomendasikan menggunakan folder common untuk model, dan kemudian
memperluas mereka untuk model yang berbeda untuk frontend dan backend jika perlu. Saya bukan
penggemar besar dari pendekatan ini atau setidaknya saya belum melihat itu digunakan dengan cara
yang masuk akal bagi saya. Perasaan saya adalah bahwa lebih baik untuk memiliki satu file otoritatif
untuk model, kecuali benar-benar diperlukan untuk melakukan sebaliknya.

Seperti apakah yang harus di frontend, common, atau folder backend, aku akan meletakkannya di
folder backend. Ini bisa dengan mudah berada di salah satu folder lain, tapi pilihan ini tampaknya
intuitif untuk saya, itu apa yang akan saya pikirkan ketika saya pergi mencarinya, jadi aku akan
memasukkan ke dalam backend.

Berikut adalah screenshot dari Gii dengan tabel role:


Perhatikan bidang Namespace. Anda dapat melihat kita memiliki namespace backend\models, jadi
pada file Role.php akan berada di folder tersebut dan namespace akan melekat pada file itu.
Kemudian setiap kali kita ingin menggunakannya, kita hanya menyertakan penggunaan:
use backend\models\Role;

Klik tombol preview. Ini otomatis akan menghasilkan file. Anda dapat memeriksanya dengan
menekan nama file. Untuk benar-benar menghasilkan kode, klik pada tombol hijau. Sekarang periksa
backend\models dan kamu akan melihat Role.php, sempurna diformat untuk kita:

<?php
namespace backend\models;
/**
* This is the model class for table "role".
*
* @property integer $id
* @property string $role_name
* @property integer $role_value
* @property User[] $users
*/
class Role extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'role';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['role_name'], 'string', 'max' => 45],
[['role_name', 'role_value'], 'required'],
[['role_value'], 'integer']
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'role_name' => 'Role Name',
'role_value' => 'Role Value'
];
}
}
Jadi ada itu di backend\models. Ini terlihat sangat akrab pada saat ini. Saya sudah menjelaskan
secara rinci apa aturan lakukan pada User model, dan aturan berfungsi dengan cara yang sama di
sini. Ini adalah suatu model sederhana, bahwa kita tidak memiliki banyak tentang itu untuk
dibicarakan.

Metode attributeLabels hanya menetapkan atribut untuk tingkat nama yang akan terlihat pada
aplikasi.

Add Records To Role Table


Sekarang kita telah memiliki sebuah tabel Role dan model Role, mari kita gunakan PhpMyadmin
untuk membuat beberapa catatan role yang bisa kita mainkan dengan ini. Ini akan membuat lebih
mudah untuk dipahami bagaimana semua bisa bersama-sama.

User tab memasukkan pada tabel role:

Kamu dapat melihat kita tidak membutuhkan itu untuk mengatur bidang id, itu adalah auto-
incremen. Jadi kami membuat 2 catatan 1 bernama User, 1 bernama Admin. User memiliki sebuah
role_valuee 10 dan Admin memiliki role_value 20. Setelah catatan ditambahkan, anda harus melihat
ini pada tab browser untuk tabel role:
Jika anda ingat, kita mengatur role_id pada tabel user untuk default ke 10 ketika membuat catatan
user. Jadi masuk akal bahwa role_id akan memetakan ke role_value. Sekarang kita hanya perlu
beberapa metode pada kedua model untuk mengikat semua ini bersama-sama.

Add Relationship To Role


Pada Role.php, model Peran, di bagian atas, bawah namespace, kita akan menambahkan:
use common\models\User;

Dan bagian bawah file tambahkan:

/**
* @return \yii\db\ActiveQuery
*/

public function getUsers()


{
return $this->hasMany(User::className(), ['role_id' => 'role_value']);
}

Pernyataan Penggunaan memberi kita visibilitas pada User model. Metode getUsers adalah cara
standar membangun hubungan dari peran untuk pengguna. Dalam hal ini, kami menciptakan
hubungan hasMany karena peran tunggal dapat memiliki banyak pengguna. Itulah juga mengapa
metode ini disebut getUsers bukan getUser tunggal. Dalam array, Anda lihat:
['role_id' => 'role_value']

Jadi field pertama adalah bahwa dari hubungan dan lapangan itu menunjuk ke dalam array adalah
dari model yang sedang Anda kerjakan. Sintaks sangat intuitif, tapi ada baiknya mengeja ini tahu
persis:
hasMany(User::className(), ['role_id' => 'role_value'])
className adalah metode model terkait. Model terkait nama bidang datang pertama, diikuti oleh
arus nama field model, jadi sekarang role_id pada tabel user dipetakan ke role_value dalam tabel
peran. Itu dia!

Update User Model with Role


Atau kursus, kita perlu jenis yang sama dari metode pada User model. Mari kita buka User model di
common\modelsUser.php dan menambahkan pernyataan penggunaan:
use backend\models\Role;

Sekarang mari kita menambahkan metode berikut:

/**
* get role relationship
*
*/

public function getRole()


{
return $this->hasOne(Role::className(), ['role_value' => 'role_id']);
}

/**
* get role name
*
*/

public function getRoleName()


{
return $this->role ? $this->role->role_name : '- no role -';
}

/**
* get list of roles for dropdown
*/

public static function getRoleList()


{
$droptions = Role::find()->asArray()->all();
return Arrayhelper::map($droptions, 'role_value', 'role_name');
}

Ok, mari kita lihat satu per satu ini. Yang pertama adalah hubungan getRole, yang merupakan sisi
lain dari hubungan getUsers yang ditambahkan ke Role. Dalam hal ini, Pengguna hanya memiliki satu
role, sehingga hubungan hasOne dan metode memiliki nama getRole tunggal untuk itu. Jika tidak,
format adalah persis sama seperti itu untuk model Role. Ini hanya cukup mengatakan bahwa
role_value di meja role peta untuk role_id pada tabel user. Ini harus mudah dipahami.

Metode kedua di sini User getRoleName. Hal ini memungkinkan kita untuk mengembalikan nama
role, yang kita ingin lakukan untuk backend UI kami. Kami memasukkan ke dalam tes terner untuk
melihat apakah role telah ditetapkan, dan jika demikian, mengembalikan nama atau string '- role -'.

Akhirnya, kami ingin kembali ke daftar nilai role dan nama untuk digunakan dalam daftar dropdown
di UI. Jadi kita membuat metode getRoleList sebagai berikut:
public static function getRoleList()
{
$droptions = Role::find()->asArray()->all();
return Arrayhelper::map($droptions, 'role_value', 'role_name');
}

Di sini kita membuat variabel $droptions lokal dan menetapkan contoh Role, dengan semua catatan
kembali sebagai array. Kemudian kita menggunakan ArrayHelper::map metode untuk daftar nilai-
nilai role dan nama. Untuk menggunakan ArrayHelper, kita perlu menyertakan pernyataan
digunakan untuk itu di bagian atas file di blok pernyataan digunakan:
use yii\helpers\ArrayHelper;

Ini adalah format yang sangat umum bagi kita untuk memiliki 3 metode hubungan ini dan kami akan
melakukan metode yang sama untuk model-model lain. Juga diketahui, panduan Yii 2 melakukan
pekerjaan yang cukup baik dari daftar jenis hubungan, sehingga mengacu itu juga ketika Anda
sedang membangun aplikasi Anda:

Yii DB Guide
Juga, sekarang kita memiliki metode getRoleList kami, kita dapat menggunakannya untuk
menegakkan aturan validasi pada User model. Kami hanya ingin model untuk menerima nilai-nilai
role_id yang berada dalam kisaran nilai-nilai di bidang role_value dalam tabel role. Kita bisa
mendapatkan mereka menggunakan berikut:
array_keys($this->getRoleList())

Jika Anda ingat, di getRoleList, tombol adalah catatan role_value. Jadi pernyataan ini kembali 10, 20
berdasarkan apa yang kita miliki di DB kami sejauh ini. Jika kita menambahkan nilai-nilai baru,
mereka secara otomatis akan ditambahkan ke dalam daftar.

Jadi untuk membuat aturan dari itu, kita lakukan hal berikut:
[['role_id'],'in', 'range'=>array_keys($this->getRoleList())],

Sintaks di atas sangat intuitif. Hanya timpa ini ke metode aturan Anda pada User model dan Anda
sekarang memiliki rentang nilai diberlakukan untuk entri pada kolom role_id di DB Anda. Ini adalah
teknik yang sangat umum dan kami akan melakukan hal yang persis sama untuk dua atribut lainnya
pada model User, yang akan kita lihat segera.

Create Status Model


Mari kita beralih ke model berikutnya, Status. Kita akan menempatkan model Status di backend juga.
Jadi mari kita jalankan Gii dan ulangi langkah-langkah yang kami lakukan untuk Role, hanya saja kali
ini menggunakan tabel status.

Sekali lagi, pastikan anda memasukkan namespace sebagai backend\models. Klik Preview, kemudian
tombol Generate. Jika semua berjalan dengan baik, Anda akan memiliki file status.php di
backend\models yang terlihat seperti ini:

<?php
namespace backend\models;
/**
* This is the model class for table "status".
*
* @property integer $id
* @property string $status_name
*
* @property User[] $users
*/
class Status extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'status';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['status_name'], 'string', 'max' => 45],
[['status_name', 'status_value'], 'required'],
[['status_value'], 'integer']
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'status_name' => 'Status Name',
'status_value' => 'Status Value'
];
}
}

Dan mari kita membuat hubungan ke pengguna. Pertama menambahkan pernyataan gunakan untuk
status.php:
use common\models\User;

Kemudian kita menambahkan metode hubungan:

/**
* @return \yii\db\ActiveQuery
*/
public function getUsers()
{
return $this->hasMany(User::className(), ['status_id' => 'status_value']);
}
Saya tidak akan menjelaskan banyak di sini, ini seperti model Role. Dan seperti yang kita lakukan
untuk Role, kita perlu menambahkan metode hubungan untuk Status ke User model.

Update User Model with getStatus


Jadi, pada User.php, menambahkan pernyataan penggunaan:
use backend\models\Status;

sekarang tambahkan 3 metode berikut:

/**
* get status relation
*
*/
public function getStatus()
{
return $this->hasOne(Status::className(), ['status_value' => 'status_id']);
}
/**
* get status name
*
*/
public function getStatusName()
{
return $this->status ? $this->status->status_name : '- no status -';
}
/**
* get list of statuses for dropdown
*/
public static function getStatusList()
{
$droptions = Status::find()->asArray()->all();
return Arrayhelper::map($droptions, 'status_value', 'status_name');
}

Dan sekarang mari kita tambahkan aturan validasi untuk rentang, karena kita memiliki akses ke
getStatusList:
[['status_id'],'in', 'range'=>array_keys($this->getStatusList())],

Urutan yang dimasukkan ke dalam ini tidak akan peduli, itu akan mengamati aturan, tapi untuk
pembacaan kode, yang dianjurkan bahwa Anda menempatkan ini di bawah kekuasaan lain status
seperti:

['status_id', 'default', 'value' => self::STATUS_ACTIVE],


[['status_id'],'in', 'range'=>array_keys($this->getStatusList())],
Add Record to Status Table
Sebelum kita lupa, mari kita tambahkan beberapa catatan ke tabel status via phpMyAdmin, sehingga
kita akan dapat menguji fungsionalitas nanti.

Tambahkan berikut melalui tab insert pada tabel status:

status_name: Active status_value: 10


status_name: Pending status_value: 5

Bila dilakukan, Anda akan melihat berikut di bawah browse tab pada tabel status:

Create UserType Model


Ok, jadi sekarang kita bisa pindah ke tabel user_type. Seperti yang akan kita lihat sebentar lagi, ini
adalah sedikit berbeda karena ada dua kata dalam nama tabel yang dipisahkan oleh garis bawah. Gii
akan memilih nama model bagi kita sebagai berikut:

UserType

Itu adalah konvensi penamaan untuk model yang didasarkan pada nama tabel dengan garis bawah
antara dua kata. Ini mungkin untuk mengubah ini secara manual, tetapi Anda harus memiliki alasan
yang baik untuk melakukannya, dan kami tidak memiliki alasan seperti dalam kasus ini. Jadi kita akan
dengan nama model Gii ini.
Sekarang pastikan namespace diatur untuk backend\models. Kemudian lakukan pratinjau dan
menghasilkan langkah-langkah dan kami harus berakhir dengan UserType.php di backend\models
yang terlihat seperti ini:

<?php
namespace backend\models;
use Yii;
/**
* This is the model class for table "user_type".
*
* @property string $id
* @property string $user_type_name
* @property integer $user_type_value
*/
class UserType extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'user_type';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['user_type_value'], 'required'],
[['user_type_value'], 'integer'],
[['user_type_name'], 'string', 'max' => 45]
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'user_type_name' => 'Type Name',
'user_type_value' => 'Type Value',
];
}
}

Ini adalah model sederhana lain sepanjang garis dua lainnya yang telah kita buat. Jadi mari kita pergi
ke depan dan menambahkan pernyataan penggunaan:
use common\models\User;

Dan kemudian mengatur metode getUsers untuk hubungan dengan pengguna:


/**
* @return \yii\db\ActiveQuery
*/
public function getUsers()
{
return $this->hasMany(User::className(), ['user_type_id' => 'user_type_value']);
}

Update User Model with UserType


Sekarang mari kita pindah ke file User.php common\models untuk membuat perubahan yang kita
butuhkan di sana:

Kami menambahkan pernyataan penggunaan di atas:


use backend\models\UserType;

Dan menambahkan metode berikut:

/**
*getUserType
*line break to avoid word wrap in PDF
* code as single line in your IDE
*/
public function getUserType()
{
return $this->hasOne(UserType::className(), ['user_type_value' =>
'user_type_id']);
}
/**
* get user type name
*
*/
public function getUserTypeName()
{
return $this->userType ? $this->userType->user_type_name : '- no user type -';
}
/**
* get list of user types for dropdown
*/
public static function getUserTypeList()
{
$droptions = UserType::find()->asArray()->all();
return Arrayhelper::map($droptions, 'user_type_value', 'user_type_name');
}
/**
* get user type id
*
*/
public function getUserTypeId()
{
return $this->userType ? $this->userType->id : 'none';
}
Ok, kita lakukan 4 metode bukannya 3. Tiga pertama harus melihat benar-benar akrab, karena kita
melakukan jenis yang sama pada model lain, dan kita dapat dengan cepat menambahkan aturan
validasi untuk range di user_type_id:
[['user_type_id'],'in', 'range'=>array_keys($this->getUserTypeList())],

Satu hal yang tidak begitu jelas adalah konvensi penamaan getUserTypeName. Nama metode yang
tampaknya logis, karena kita selalu mulai dengan huruf g kecil untuk mendapatkan dan kemudian
memanfaatkan kata-kata yang tersisa. Di mana ia mendapat rumit adalah di:
return $this->userType ? $this->userType->user_type_name : '- no user type -';

$this->userType yang menggunakan sihir mendapatkan metode, di mana get tersirat, dan dalam hal
ini, Yii 2 tidak ingin Anda untuk memulai dengan huruf besar, konvensi penamaan perubahan untuk
kasus khusus ini. Hal ini dapat membingungkan sehingga Anda harus sangat berhati-hati untuk
mengikuti konvensi penamaan persis atau hal-hal akan rusak.

Metode keempat getUserTypeId mengembalikan record id dari UserType, yang kita perlukan untuk
digunakan di masa depan, sehingga tidak banyak membahas tentang itu sekarang.

Add Records to user_type Table


Mari kita memasukkan dua catatan ke dalam tabel user_type:

value = 10, name = Free value = 30, name = Paid

Setelah selesai, gunakan tab browse untuk memeriksa dan melihat apakah catatan ada:

Jika Anda sedikit tidak jelas seperti apa yang kita maksudkan untuk model UserType, nama-nama ini
harus memberikan Anda ide yang cukup bagus. Struktur data ini akan datang sangat berguna ketika
kita ingin membatasi bagian dari aplikasi untuk dibayar pengguna saja.

Create Gender Model


Sekarang kita akan beralih ke model Gender. Saya ingin melakukan model ini pertama karena itu
model yang lebih kecil dan berhubungan dengan profil, dan karena kita telah menggunakan foreign
key untuk menghubungkan profil dan tabel Gender, Gii bahkan akan membuat metode hubungan
bagi kita.

Sejak gender berkaitan erat dengan Profil, saya telah memutuskan untuk menempatkan kedua
model tersebut di frontend. Saya memilih frontend karena tampaknya lebih mudah bagi saya untuk
mengingat cara itu, karena profil dan gender melibatkan pilihan pengguna. Ini keputusan sebagian
besar kosmetik, karena kita tidak mengikuti rekomendasi Yii 2 untuk menempatkannya di common.

Salah satu alasan saya tidak melakukan itu adalah saya ingin tetap umum relatif kecil, sehingga saya
dapat membuat kelas pembantu yang mudah untuk menemukan. Saya ingin menempatkan kelas
pembantu saya di commmon, sepertinya intuitif untuk saya untuk melakukannya dengan cara itu.
Tapi karena model namespace, Anda dapat menempatkan mereka di mana saja bahwa aplikasi
dapat menemukan mereka, sehingga frontend, backend, atau common, tidak masalah.
Yang penting adalah bahwa Anda menempatkan namespace dimaksud pada Gii benar ketika Anda
membuat model, sehingga dalam hal ini Gender kita menggunakan:
frontend\models

Jika semua berjalan dengan baik, Anda akan melihat Gender.php di frontend\models yang seperti
ini:

<?php
namespace frontend\models;
use Yii;
/**
* This is the model class for table "gender".
*
* @property string $id
* @property string $gender_name
*
*
*/
class Gender extends \yii\db\ActiveRecord
{
/**
Chapter Five: Creating New Models with Gii 85
* @inheritdoc
*/
public static function tableName()
{
return 'gender';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['gender_name'], 'required'],
[['gender_name'], 'string', 'max' => 45]
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'gender_name' => 'Gender Name',
];
}
/**
* @return \yii\db\ActiveQuery
*/
Chapter Five: Creating New Models with Gii 86
public function getProfiles()
{
return $this->hasMany(Profile::className(), ['gender_id' => 'id']);
}
}

Add Record to Gender Table


Ini bagus dan lengkap untuk kami dan kami tidak perlu melakukan apa-apa. Mari kita luangkan
waktu dan tambahkan 2 catatan ke tabel Gender:

1 = male 2 = female

Seharusnya terlihat seperti ini:

Kami tidak perlu memperbarui User karena model ini, model User tidak menyebutnya. Sebaliknya,
itu erat terkait dengan Profil.

Sejauh ini, sebagian besar model kami telah difokuskan ke model yang berisi struktur data bahwa
setiap pengguna yang mendaftar dengan aplikasi tersebut harus memiliki. Role_id itu, status_id, dan
user_type_id akan semua diatur secara default ketika register pengguna, dan kami telah
menghubungkan mereka untuk model yang memiliki datastructure yang menyediakan mendalam
kepada pengguna.

Create Profile Model


Sekarang kita akan membuat model bernama Profil. Semua pengguna akan dapat membuat profil,
tapi profil hanya akan ada jika pengguna secara eksplisit menciptakan itu. Jadi tentu saja profil
pengguna mendapatkan tabel sendiri, yang telah kita buat.

Sebagai pengingat, kita memiliki kolom berikut pada tabel profil:

id
user_id
first_name
last_name
birthdate
gender_id
created_at
updated_at

Anda bisa mendapatkan kreatif dengan ini dan menambahkan atribut lainnya, kita hanya
menetap dis ini untuk tujuan demonstrasi. Hanya ingat jika Anda menambahkan lebih untuk itu,
untuk menambahkannya baik dalam struktur tabel dan dalam model.

Ok, kita sudah memutuskan Profil akan di frontend, jadi pastikan bidang namespace diatur:
frontend\models

Sekarang kita akan mengklik pratinjau dan menghasilkan langkah-langkah dan jika semua telah
berjalan dengan baik, kita memiliki profile.php berikut di frontend\models. Jika semua berjalan
dengan baik, Anda dapat melihat file:
Catatan: profile.php adalah di direktori models, bukan direktori search. Berikut adalah isi dari
file:

<?php
namespace frontend\models;
use yii\db\ActiveRecord;
use Yii;
/**
Chapter Five: Creating New Models with Gii 89
* This is the model class for table "profile".
*
* @property string $id
* @property string $user_id
* @property string $first_name
* @property string $last_name
* @property string $birthdate
* @property string $gender_id
* @property string $created_at
* @property string $updated_at
*
* @property Gender $gender
*/
class Profile extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'profile';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['birthdate', 'created_at', 'updated_at'], 'safe'],
[['gender_id', 'user_id', 'birthdate'], 'required'],
[['gender_id', 'user_id'], 'integer'],
[['first_name', 'last_name'], 'string', 'max' => 45],
Chapter Five: Creating New Models with Gii 90
[['birthdate'], 'date', 'format'=>'Y-m-d'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'first_name' => 'First Name',
'last_name' => 'Last Name',
'birthdate' => 'Birthdate',
'gender_id' => 'Gender ID',
'created_at' => 'Member Since',
'updated_at' => 'Last Updated',
'user_id' => 'User ID',
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getGender()
{
return $this->hasOne(Gender::className(), ['id' => 'gender_id']);
}
}

Sekarang ini contoh model harus tampak akrab, jadi saya tidak akan menjelaskan semuanya lagi. Jika
Anda perlu untuk menyegarkan pengetahuan Anda, tinjau model sebelumnya.

Kita perlu menambahkan beberapa hal, namun. Mari kita mulai dengan laporan penggunaan:

use common\models\User;
use yii\helpers\Url;
use yii\helpers\Html;
use yii\helpers\ArrayHelper;
use yii\db\Expression;

Selanjutnya kita memiliki Selain aturan kami, dan jangan khawatir, kami akan menambahkan metode
getGenderList sebenarnya yang kita panggil di sini di bawah class:

[['gender_id'],'in', 'range'=>array_keys($this->getGenderList())]

Bergerak turun class, kita perlu menambahkan beberapa label atribut untuk metode hubungan
dengan metode attributeLabels, sehingga kita dapat menggunakannya pada widget kami di seluruh
aplikasi. Kita tidak perlu pergi terlalu mendalam pada saat ini, selain untuk mengatakan kami
menggunakan sintaks keajaiban nama metode dan yang digunakan oleh metode Yii::t, yang
merupakan menerjemahkan metode aplikasi dan akan membuat label yang tersedia di seluruh
aplikasi:

'genderName' => Yii::t('app', 'Gender'),


'userLink' => Yii::t('app', 'User'),
'profileIdLink' => Yii::t('app', 'Profile'),

Karena model Profil kami berurusan dengan DATETIME di beberapa bidang, mari kita tambahkan
metode perilaku yang memanggil timestamp:

/**
* behaviors to control time stamp, don't forget to use statement for expression
*
*/
public function behaviors()
{
return [
'timestamp' => [
'class' => 'yii\behaviors\TimestampBehavior',
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
'value' => new Expression('NOW()'),
],
];
}

Mari kita pastikan kita memiliki pernyataan penggunaan yang tepat di bagian atas file:
use yii\db\Expression;

Untuk TimestampBehavior, kita menggunakan path lengkap:


'class' => 'yii\behaviors\TimestampBehavior'

Jadi ada pernyataan penggunaan diperlukan pada satu.

Reminder
Hanya pengingat. Kode perilaku tidak diformat persis seperti yang Anda lihat dalam
IDE Anda. Alasannya adalah bahwa PDF dan format lain melanggar garis dengan
wordwrap dan menyisipkan karakter khusus yang mengacaukan kode, jadi saya harus
proaktif memformat kode sehingga garis tidak pecah. Ini tidak selalu terlihat cantik,
tapi setidaknya kode akan berfungsi.

Sekarang kita beralih ke hubungan.

/**
* uses magic getGender on return statement
*
*/
public function getGenderName()
{
return $this->gender->gender_name;
}
/**
* get list of genders for dropdown
*/
public static function getGenderList()
{
$droptions = Gender::find()->asArray()->all();
return Arrayhelper::map($droptions, 'id', 'gender_name');
}
/**
* @return \yii\db\ActiveQuery
*/
public function getUser()
{
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
/**
* @get Username
*/
public function getUsername()
{
return $this->user->username;
}
/**
* @getUserId
*/
public function getUserId()
{
return $this->user ? $this->user->id : 'none';
}
/**
* @getUserLink
*/
public function getUserLink()
{
$url = Url::to(['user/view', 'id'=>$this->UserId]);
$options = [];
return Html::a($this->getUserName(), $url, $options);
}
/**
* @getProfileLink
*/
public function getProfileIdLink()
{
$url = Url::to(['profile/update', 'id'=>$this->id]);
$options = [];
return Html::a($this->id, $url, $options);
}

Hanya dua metode yang kita belum lihat contoh sebelum adalah dua terakhir. Jadi untuk singkatnya,
saya akan melewatkan orang-orang yang kita sudah memahami dan fokus pada yang baru. Namun,
kita perlu menyertakan pernyataan penggunaan di atas untuk kelas ArrayHelper:
use yii\helpers\ArrayHelper;

Kita dapat memanfaatkan metode getGenderList memaksakan pembatasan pada nilai-nilai dalam
model seperti yang kami lakukan pada user model:

[['gender_id'],'in', 'range'=>array_keys($this->getGenderList())]

Dengan cara ini, tidak ada yang bisa menambahkan id gender yang tidak valid.

Kedua getUserLink dan getProfileIdLink memanfaatkan kelas Html dan kelas pembantu Url, sehingga
kita perlu meliputi laporan penggunaan berikut:

use yii\helpers\Url;
use yii\helpers\Html;

Kedua getUserLink dan getProfileIdLink melakukan jenis yang sama hal. Mereka adalah metode yang
membuat link ke pengguna terkait dan dengan id profil pengguna. Kami menggunakan ini di
beberapa UI kami kemudian dan dengan cara yang rapi untuk membuat link yang berhubungan
model. Jangan khawatir jika Anda tidak sepenuhnya mendapatkannya, Anda akan ketika kita bekerja
pada bagian itu.

Update User Model with Profile


Jadi sekarang kami memperbarui user model dengan metode untuk menarik hubungan profil.
Tambahkan metode berikut untuk User.php:

/**
* @getProfile
*
*/
public function getProfile()
{
return $this->hasOne(Profile::className(), ['user_id' => 'id']);
}
/**
* @getProfileId
*
*/
public function getProfileId()
{
return $this->profile ? $this->profile->id : 'none';
}
/**
* @getProfileLink
*
*/
public function getProfileLink()
{
$url = Url::to(['profile/view', 'id'=>$this->profileId]);
$options = [];
return Html::a($this->profile ? 'profile' : 'none', $url, $options);
}

Jadi metode getProfile sangat akrab pada titik ini, kita hanya pemetaan user_id pada tabel profil ke
kolom id di tabel user. Ini adalah bagaimana keduanya terkait.

Metode getProfileId adalah pernyataan terner yang menunjukkan 'tidak' jika pengguna tidak
memiliki profil. Jadi ketika kita memanggil metode ini di UI, dan pengguna tidak memiliki profil, kita
punya jawaban bukan nol. Kembali null ketika jawaban lain diharapkan dapat menyebabkan
kesalahan dan banyak waktu debugging. Itu terbaik untuk memperhitungkan nol ketika Anda bisa.

Kita perlu metode getProfileId untuk memberi masukkan ke dalam metode getProfileLink kami
bahwa metode ini dengan metode Url::to .getProfileLink adalah seperti getUserLink pada model
profil. Ini menggunakan kelas Url pembantu dan penolong kelas Html, jadi kita harus meliputi
laporan penggunaan di bagian atas file:

use yii\helpers\Url;
use yii\helpers\Html;

Finish Up User Model


Sementara kita di sini, kita akan menambahkan dua metode yang lebih untuk User.php. Ini adalah
jenis yang sama dari metode yang telah kita tambah, tetapi mereka melayani tujuan tertentu untuk
UI kami nanti.

/**
* get user id Link
*
*/
public function getUserIdLink()
{
$url = Url::to(['user/update', 'id'=>$this->id]);
$options = [];
return Html::a($this->id, $url, $options);
}
/**
* @getUserLink
*
*/
public function getUserLink()
{
$url = Url::to(['user/view', 'id'=>$this->Id]);
$options = [];
return Html::a($this->username, $url, $options);
}

Salah satu dari sedikit terakhir bekerja pada model User. Kita perlu menambahkan label untuk
semua metode berikut melalui metode attributeLabels:

/* Your model attribute labels */


public function attributeLabels()
{
return [
/* Your other attribute labels */
'roleName' => Yii::t('app', 'Role'),
'statusName' => Yii::t('app', 'Status'),
'profileId' => Yii::t('app', 'Profile'),
'profileLink' => Yii::t('app', 'Profile'),
'userLink' => Yii::t('app', 'User'),
'username' => Yii::t('app', 'User'),
'userTypeName' => Yii::t('app', 'User Type'),
'userTypeId' => Yii::t('app', 'User Type'),
'userIdLink' => Yii::t('app', 'ID'),
];
}

Atribut label memberitahu Yii 2 bagaimana menampilkan atribut Anda ketika mereka muncul di
situs. Dalam beberapa kasus, seperti yang kita telah mereka digunakan di sini, atribut adalah nama
dari sebuah metode. Misalnya, RoleName adalah label untuk metode getRoleName, yang kami buat
untuk model User ini. Hal ini dipasangkan dengan metode Yii::t(), yang merupakan menerjemahkan
metode untuk seluruh aplikasi, sehingga pengaturan itu di sini harus membuatnya tampak seperti ini
di mana-mana.

Jika ini tampaknya sedikit membingungkan, jangan khawatir tentang hal itu sekarang. Ini akan
menjadi lebih jelas ketika Anda melihat label atribut muncul dalam tampilan file dan widget. Saya
akan referensi itu lagi ketika kita datang ke titik itu.

The Complete User Model


Untuk referensi, saya akan menyertakan salinan file User.php, sehingga Anda pastikan Anda memiliki
semua yang diperlukan sampai saat ini. Ini adalah untuk referensi saja, Anda tidak perlu untuk
menyalin file ini:

<?php
namespace common\models;
use Yii;
use yii\base\NotSupportedException;
use yii\db\ActiveRecord;
use yii\db\Expression;
use yii\web\IdentityInterface;
use yii\helpers\Security;
use backend\models\Role;
use backend\models\Status;
use backend\models\UserType;
use frontend\models\Profile;
use yii\helpers\ArrayHelper;
use yii\helpers\Url;
use yii\helpers\Html;
/**
* User model
*
* @property integer $id
* @property string $username
* @property string $password_hash
* @property string $password_reset_token
* @property string $email
* @property string $auth_key
* @property integer $role
* @property integer $status
* @property integer $created_at
* @property integer $updated_at
* @property string $password write-only password
*/
class User extends ActiveRecord implements IdentityInterface
{
const STATUS_ACTIVE = 10;
public static function tableName()
{
return 'user';
}
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'timestamp' => [
'class' => 'yii\behaviors\TimestampBehavior',
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
'value' => new Expression('NOW()'),
],
];
}
/**
* @inheritdoc
*/
public function rules()
{
return [
['status_id', 'default', 'value' => self::STATUS_ACTIVE],
[['status_id'],'in', 'range'=>array_keys($this->getStatusList())],
['role_id', 'default', 'value' => 10],
[['role_id'],'in', 'range'=>array_keys($this->getRoleList())],
['user_type_id', 'default', 'value' => 10],
[['user_type_id'],'in', 'range'=>array_keys($this->getUserTypeList())],
['username', 'filter', 'filter' => 'trim'],
['username', 'required'],
['username', 'string', 'min' => 2, 'max' => 255],
['email', 'filter', 'filter' => 'trim'],
['email', 'required'],
['email', 'email'],
['email', 'unique'],
];
}
/* Your model attribute labels */
public function attributeLabels()
{
return [
/* Your other attribute labels */
'roleName' => Yii::t('app', 'Role'),
'statusName' => Yii::t('app', 'Status'),
'profileId' => Yii::t('app', 'Profile'),
'profileLink' => Yii::t('app', 'Profile'),
'userLink' => Yii::t('app', 'User'),
'username' => Yii::t('app', 'User'),
'userTypeName' => Yii::t('app', 'User Type'),
'userTypeId' => Yii::t('app', 'User Type'),
'userIdLink' => Yii::t('app', 'ID'),
];
}
/**
* @inheritdoc
*/
public static function findIdentity($id)
{
return static::findOne(['id' => $id, 'status_id' => self::STATUS_ACTIVE]);
}
/**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['auth_key' => $token]);
}
/**
* Finds user by username
*line break for wordwrap in pdf, should be single line
* @param string $username
* @return static|null
*/
public static function findByUsername($username)
{
return static::findOne(['username' => $username, 'status_id' =>
self::STATUS_ACTIVE]);
}
/**
* Finds user by password reset token
*
* @param string $token password reset token
* @return static|null
*/
public static function findByPasswordResetToken($token)
{
$expire = Yii::$app->params['user.passwordResetTokenExpire'];
$parts = explode('_', $token);
$timestamp = (int) end($parts);
if ($timestamp + $expire < time()) {
// token expired
return null;
}
return static::findOne([
'password_reset_token' => $token,
'status_id' => self::STATUS_ACTIVE,
]);
}
/**
* @inheritdoc
*/
public function getId()
{
return $this->getPrimaryKey();
}
/**
* @inheritdoc
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* @inheritdoc
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
/**
* Validates password
*
* @param string $password password to validate
* @return boolean if password provided is valid for current user
*/
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
/**
* Generates password hash from password and sets it to the model
*
* @param string $password
*/
public function setPassword($password)
{
$this->password_hash = Yii::$app->security->generatePasswordHash($password);
}
/**
* Generates "remember me" authentication key
*/
public function generateAuthKey()
{
$this->auth_key = Yii::$app->security->generateRandomString();
}
/**
* Generates new password reset token
* 2 lines to avoid wordwrapping, should be one line
*/
public function generatePasswordResetToken()
{
$this->password_reset_token = Yii::$app->security->generateRandomString()
. '_' . time();
}
/**
* Removes password reset token
*/
public function removePasswordResetToken()
{
$this->password_reset_token = null;
}
/**
* @getRole
*
*/
public function getRole()
{
return $this->hasOne(Role::className(), ['role_value' => 'role_id']);
}
/**
* @getRoleName
*
*/
public function getRoleName()
{
return $this->role ? $this->role->role_name : '- no role -';
}
/**
* @getRoleList
*/
public static function getRoleList()
{
$droptions = Role::find()->asArray()->all();
return Arrayhelper::map($droptions, 'role_value', 'role_name');
}
/**
* @getStatus
*
*/
public function getStatus()
{
return $this->hasOne(Status::className(), ['status_value' => 'status_id']);
}
/**
* @getStatusName
*
*/
public function getStatusName()
{
return $this->status ? $this->status->status_name : '- no status -';
}
/**
* @getStatusList
*/
public static function getStatusList()
{
$droptions = Status::find()->asArray()->all();
return Arrayhelper::map($droptions, 'status_value', 'status_name');
}
/**
* @getProfile
*
*/
public function getProfile()
{
return $this->hasOne(Profile::className(), ['user_id' => 'id']);
}
/**
* @getProfileId
*
*/
public function getProfileId()
{
return $this->profile ? $this->profile->id : 'none';
}
/**
* @getProfileLink
*
*/
public function getProfileLink()
{
$url = Url::to(['profile/view', 'id'=>$this->profileId]);
$options = [];
return Html::a($this->profile ? 'profile' : 'none', $url, $options);
}
/**
* @getUserType
* 2 lines to avoid wordwrap
*/
public function getUserType()
{
return $this->hasOne(UserType::className(), ['user_type_value' =>
'user_type_id']);
}
/**
* @getUserTypeName
*
*/
public function getUserTypeName()
{
return $this->userType ? $this->userType->user_type_name : '- no user type -';
}
/**
*@getUserTypeList
*/
public static function getUserTypeList()
{
$droptions = UserType::find()->asArray()->all();
return Arrayhelper::map($droptions, 'user_type_value', 'user_type_name');
}
/**
* @getUserTypeId
*
*/
public function getUserTypeId()
{
return $this->userType ? $this->userType->id : 'none';
}
/**
* @getUserIdLink
*
*/
public function getUserIdLink()
{
$url = Url::to(['user/update', 'id'=>$this->id]);
$options = [];
return Html::a($this->id, $url, $options);
}
/**
* @getUserLink
*
*/
public function getUserLink()
{
$url = Url::to(['user/view', 'id'=>$this->Id]);
$options = []; //
return Html::a($this->username, $url, $options);
}
}

Summary

Bab ini adalah binatang. Kami menciptakan 5 tabel baru untuk menambah struktur data kami. Kami
menciptakan 5 model baru dan memperbarui model User. Kami tidak melakukan banyak coding
kustom belum, kami terutama mengandalkan Gii untuk membuat model kami untuk kami. Kemudian
kita menambahkan metode hubungan, aturan, penggunaan pernyataan, perilaku dan berbagai
peluang lainnya dan berakhir untuk membuka kekuatan Yii 2.

Banyak metode hubungan kami menambahkan akan pergi jauh untuk membangun sebuah UI yang
intuitif yang memungkinkan kita untuk mengelola pengguna dan mengontrol akses mereka ke
berbagai bagian aplikasi. Kami sedang membangun aplikasi dengan mata terhadap penggunaan
kembali kode dan diperpanjang. Kami ingin membuat template yang akan menjadi titik awal yang
baik untuk aplikasi apapun.

Kami belum menghubungkan semua model ini bersama-sama, tapi jangan khawatir. Dan Anda akan
mendapatkan untuk melihat seberapa mudah Yii 2 membuat ini untuk kita.
Chapter Six: Helpers
Anda mungkin telah memperhatikan sekarang bahwa buku ini disusun sekitar konsep-konsep kunci,
tidak bekerja aliran, setidaknya sampai saat ini. Realitas alur kerja adalah bahwa Anda melompat
sekitar cukup sedikit antara models, controllers dan views, dan ini dapat benar-benar
membingungkan bila Anda baru untuk framework.

Sebagai contoh, kita melihat model User secara luas, tapi kami masih benar-benar tidak tahu banyak
tentang bagaimana pengguna log in atau bahkan bagaimana model kita buat dalam bab sebelumnya
akan mendukung itu. Tapi jangan khawatir, itu datang. Kami sedang meletakkan dasar untuk
segalanya dan itu semua akan datang bersama-sama. Dan pada saat kami selesai, Anda akan
memiliki template yang bekerja, dengan model pengguna bekerja dengan kontrol admin penuh
melalui UI yang dapat Anda memperpanjang ke aplikasi yang kuat.

Bab ini didedikasikan untuk pembantu, kelas khusus yang kami buat untuk memformat dan kembali
nilai-nilai tertentu. Hal ini mungkin terdengar sepele, tapi pembantu ini akan cepat mempercepat
siklus pengembangan kami setelah kami memiliki mereka.

Jika Anda berpikir tentang hal itu, kerangka adalah satu set raksasa kelas pembantu, dan Yii 2 tentu
cocok dengan gambaran ini. Tapi tidak peduli berapa banyak kerangka ada, masing-masing
programmer individu memiliki kebutuhan untuk pembantu mereka sendiri. Ini adalah kelas yang
akan membantu Anda bergerak pengembangan bersama cepat dengan kode dapat digunakan
kembali yang telah Anda tulis sendiri.

Kami sudah berbicara tentang fakta kami berencana untuk mengontrol akses pengguna. Jadi kita
bisa bertanya pada diri sendiri beberapa pertanyaan kunci. Bagaimana controller akan tahu siapa
yang memiliki peran Admin? Bagaimana hal itu akan mengetahui status atau user_type_name?
Ketika seseorang mengklik pada link profil dalam navigasi, bagaimana akan controller tahu apakah
mereka sudah memiliki profil atau jika mereka perlu untuk membuat satu?

Dalam rangka untuk mengontrol akses berdasarkan jenis hal, kita harus mampu untuk mengekstrak
nilai-nilai yang kita inginkan ringkas dan mudah. Untuk membantu mempermudah pada diri saya
sendiri, saya membuat sejumlah metode yang akan mengembalikan nilai-nilai yang saya perlukan
untuk operasi yang lebih kompleks.

Value Helpers
Saya bisa menempatkan semua metode ini dalam Utilitas tunggal atau kelas Helpers, tapi baru ini
saya membaca Kode Clean oleh Robert Martin, dan salah satu hasil dari membaca buku-buku
tentang pemrograman adalah bahwa Anda mencoba untuk mengadopsi prinsip-prinsip yang Anda
sukai. Dalam hal ini, saya benar-benar menyukai ide mendapatkan bantuan semantik dari nama
kelas dan nama metode. Jadi saya memutuskan untuk pergi untuk kelas pembantu kecil yang lebih
deskriptif.

Sebagai contoh, kita bisa memiliki kelas bernama ValueHelpers. Mari kita pergi ke depan dan
membuat yang di folder common\models. Demi konsistensi dan tidak harus bangkit di semua
tempat, aku hanya akan memberikan seluruh kelas:

<?php
namespace common\models;
Class ValueHelpers
{
/**
* return the value of a role name handed in as string
* example: 'Admin'
*
* @param mixed $role_name
*/
public static function getRoleValue($role_name)
{
$connection = \Yii::$app->db;
$sql = "SELECT role_value FROM role WHERE role_name=:role_name";
$command = $connection->createCommand($sql);
$command->bindValue(":role_name", $role_name);
$result = $command->queryOne();
return $result['role_value'];
}
/**
* return the value of a status name handed in as string
* example: 'Active'
* @param mixed $status_name
*/
public static function getStatusValue($status_name)
{
$connection = \Yii::$app->db;
$sql = "SELECT status_value FROM status WHERE status_name=:status_name";
$command = $connection->createCommand($sql);
$command->bindValue(":status_name", $status_name);
$result = $command->queryOne();
return $result['status_value'];
}
/**
* returns value of user_type_name so that you can
* used in PermissionHelpers methods
* handed in as string, example: 'Paid'
*
* @param mixed $user_type_name
*/
public static function getUserTypeValue($user_type_name)
{
$connection = \Yii::$app->db;
$sql = "SELECT user_type_value FROM user_type
WHERE user_type_name=:user_type_name";
$command = $connection->createCommand($sql);
$command->bindValue(":user_type_name", $user_type_name);
$result = $command->queryOne();
return $result['user_type_value'];
}
}

Anda dapat melihat kami memiliki 3 metode yang persis sama, kecuali mereka masing-masing
referensi model yang berbeda. Jadi jelas, kita bisa menyerahkan argumen kedua untuk $ModelName
dan itu akan kurang prosedural dan kami hanya akan memiliki satu metode. Tapi aku memilih untuk
tidak melakukan itu karena itu hanya sedikit lebih intuitif cara ini untuk memahami metode, dan ini
adalah metode yang kita ingin ke akses cepat, tanpa harus berpikir terlalu banyak tentang
bagaimana mereka bekerja atau apa yang mereka lakukan.

Jadi misalnya, jika saya ingin mengetahui nilai Admin, saya bisa memanggil:
getRoleValue(admin);

Dan menurut apa yang ada di DB kami:

Anda juga akan melihat bahwa metode kami metode statis publik, yang berarti mereka dapat
disebut sebagai begitu:

ValueHelpers::getRoleValue('Admin');

Selama Anda telah memasukkan pernyataan penggunaan:

use common\models\ValueHelpers;

di bagian atas file Anda, Anda dapat menggunakan metode seperti itu.

Kami telah melakukan yang terbaik dengan metode pembantu untuk membuat mereka sebagai
semantis menyenangkan dan mungkin mudah dimengerti. Sekali lagi, itu sebabnya kita memiliki 3
metode, bukan satu, Anda dapat melihat bagaimana intuitif sintaks adalah, setidaknya itu adalah apa
yang kita tuju.

Meskipun ini adalah metode sederhana, kita harus istirahat setidaknya satu ke bawah baris demi
baris sehingga kita tahu bagaimana mereka bekerja. Mari kita lihat:

public static function getRoleValue($role_name)

Hal pertama yang akan kita lakukan adalah mengatur sambungan:

$connection = \Yii::$app->db;

Berikutnya kita mendefinisikan pernyataan sql:

$sql = "SELECT role_value FROM role WHERE role_name=:role_name";


Ini diikuti dengan sintaks yang mengatakan itu untuk menggunakan $sql.

$command = $connection->createCommand($sql);

Perhatikan pada metode, kita menggunakan parameter menuju role_name, yang kita menyerahkan
dari tanda tangan fungsi dan kemudian mengikatnya ke parameter seperti:

$command->bindValue(":role_name", $role_name);

Jadi $role_name, yang kita gunakan sebagai string, dalam contoh kita, kita menggunakan 'Admin',
akan terikat untuk

:role_name

Selanjutnya mengeksekusi query:

$result = $command->queryOne();

Dan kemudian kita kembali hasilnya dan hasilnya diformat sebagai sebuah array, jadi kami harus
nama kunci yang kita inginkan:

return $result['role_value'];

Dan itu saja, kita memiliki nilai 'Admin'. 2 model lain yang persis sama kecuali untuk menggunakan
model yang berbeda.

Saya menggunakan sql baku untuk metode untuk dua alasan. 1. Mereka kembali hasil yang lebih
cepat dan 2. Kita harus tahu bagaimana format semacam query ini. Sangat mudah untuk dilakukan.

Permission Helpers
Seperti yang kita bayangkan bagaimana kita akan menggunakan penolong kita, mengetahui nilai
tidak cukup. Jika kita akan mengontrol akses ke bidang aplikasi, kita ingin pembantu yang
menggunakan nilai dan menentukan izin. Jadi kita akan membuat kelas PermissionHelpers
common\models. Pergi ke depan dan membuat PermissionHelpers.php common\models. Berikut
adalah seluruh file:

<?php
namespace common\models;
use common\models\ValueHelpers;
use yii;
use yii\web\Controller;
use yii\helpers\Url;
Class PermissionHelpers
{
/**
* check if the user is the owner of the record
* use Yii::$app->user->identity->id for $userid, 'string' for model name
* for example 'profile' will check the profile model to see if the user
* owns the record. Provide the model instance, typically as $model->id as
* the last parameter. Returns true or false, so you can wrap in if statement
* @param mixed $userid
* @param mixed $model_name
* @param mixed $model_id
*/
public static function userMustBeOwner($model_name, $model_id)
{
$connection = \Yii::$app->db;
$userid = Yii::$app->user->identity->id;
$sql = "SELECT id FROM $model_name WHERE user_id=:userid AND id=:model_id";
$command = $connection->createCommand($sql);
$command->bindValue(":userid", $userid);
$command->bindValue(":model_id", $model_id);
if($result = $command->queryOne()) {
return true;
} else {
return false;
}
}
/**
* method for requiring paid type user, if test fails, redirect to upgrade page
* $user_type_name handed in as 'string', 'Paid' for example.
*
* used two lines for if statement to avoid word wrapping
*
* @param mixed $user_type_name
* @return \yii\web\Response
*/
public static function requireUpgradeTo($user_type_name)
{
if ( Yii::$app->user->identity->user_type_id !=
ValueHelpers::getUserTypeValue($user_type_name)) {
return Yii::$app->getResponse()->redirect(Url::to(['upgrade/index']));
}
}
/**
* @requireStatus
* used two lines for if statement to avoid word wrapping
* @param mixed $status_name
*/
public static function requireStatus($status_name)
{
if ( Yii::$app->user->identity->status_id ==
ValueHelpers::getStatusValue($status_name)) {
return true;
} else {
return false;
}
}
/**
* @requireMinimumStatus
* used two lines for if statement to avoid word wrapping
* @param mixed $status_name
*/
public static function requireMinimumStatus($status_name)
{
if ( Yii::$app->user->identity->status_id >=
ValueHelpers::getStatusValue($status_name)) {
return true;
} else {
return false;
}
}
/**
* @requireRole
* used two lines for if statement to avoid word wrapping
* @param mixed $role_name
*/
public static function requireRole($role_name)
{
if ( Yii::$app->user->identity->role_id ==
ValueHelpers::getRoleValue($role_name)) {
return true;
} else {
return false;
}
}
/**
* @requireMinimumRole
* used two lines for if statement to avoid word wrapping
* @param mixed $role_name
*/
public static function requireMinimumRole($role_name)
{
if ( Yii::$app->user->identity->role_id >=
ValueHelpers::getRoleValue($role_name)) {
return true;
} else {
return false;
}
}
}

Kami akan bergerak melalui ini agak cepat, kita masuk ke detail lebih ketika kita benar-benar
menggunakan metode. Metode pertama, userMustBeOwner, mengambil 2 parameter, nama model
dan model id. Kemudian ia melakukan query untuk melihat apakah pengguna saat ini adalah pemilik
yang merekam tertentu. Jika mereka, itu mengembalikan nilai true, jika tidak kembali palsu. Ketika
menggunakannya, sintaks akan terlihat seperti ini:

if (PermissionHelpers::userMustBeOwner (profile, $model->id)) {


//do something
}

Jadi bagaimana Anda akan menggunakan ini? Nah, katakanlah Anda memiliki sekelompok posting
atau catatan lain yang terlihat untuk semua orang, tetapi hanya penulis dapat memperbarui atau
menghapus mereka dan Anda ingin membuat navigasi terlihat hanya untuk pemilik catatan. Jadi
"melakukan sesuatu" dalam contoh di atas, bisa menunjukkan navigasi dalam tampilan file. Kami
akan menggunakan contoh yang tepat ini nanti dalam buku ini.
Saya menulis dengan cara ini karena aku suka sintaks dan saya merasa seperti ini akan menjadi cara
yang baik untuk bekerja dengan itu. Namun perlu diingat ada biasanya banyak cara untuk mencapai
hal yang sama dan pembantu tidak selalu diperlukan. Saya suka menggunakan mereka karena juga
memberi saya konsistensi dalam coding, tapi ini pasti salah satu area di mana Anda harus
menggunakan penilaian Anda sendiri.

Ingat, semua metode pembantu ini statis publik sehingga mereka dapat disebut seperti:

PermissionHelpers::requireUpgradeTo(Paid);

Dan jadi kita melompat tepat ke contoh kita berikutnya. Jika Anda membangun sebuah aplikasi yang
memiliki luas bagi pengguna dari tipe yang berbeda, dalam contoh di atas, Dibayar pengguna, maka
ini sempurna untuk controller. Ini tes pengguna saat untuk melihat apakah tipe user mereka cocok
apa yang Anda menyerahkan ke metode.

Hal ini berguna menggunakan metode ValueHelpers::getUserTypeValue. Jadi kita sudah


menggunakan kembali kode dari kelas ValueHelpers kami, Anda harus mencintai itu.

Ok, kembali ke ujian, Jika jenis pengguna cocok, baik, terus, jika tidak, mengarahkan untuk meng-
upgrade halaman. Tentu saja jika Anda memiliki tujuan yang berbeda dalam pikiran, hanya
menempatkan controller/action dalam metode.

Jika Anda memiliki lebih dari satu upgrade atau mengarahkan halaman, Anda bisa menulis ulang
metode untuk mengambil argumen kedua, seperti:

public static function requireUpgradeTo($user_type_name, $redirect_destination)


{
if ( Yii::$app->user->identity->user_type_id !=
ValueHelpers::getUserTypeValue($user_type_name)) {
return Yii::$app->getResponse()->redirect(Url::to([$redirect_destination]));
}
}

Dalam hal ini, Anda hanya akan menyerahkan dalam aksi kontroler sebagai string
'upgrade2/upgradenow' sebagai contoh, dalam argumen kedua. toh, saya hanya termasuk metode
yang memiliki redirect hardcoded di karena aku tidak mengantisipasi aplikasi menjadi lebih rumit
dari itu dan saya suka sintaks sederhana dari argumen tunggal.

Selanjutnya, kami memiliki metode requireStatus. Ini adalah satu lagi metode super sederhana
untuk melihat apakah pengguna saat ini memiliki status yang Anda butuhkan. Hal ini juga
menggunakan metode ValueHelper. Cha ching! Gunakan kembali kode lain.

Metode ini akan datang dalam berguna dalam controller untuk memeriksa apakah pengguna
memiliki status yang cukup untuk mengakses halaman. Kami akan menggunakan ini kemudian ketika
kita bekerja dengan pengendali untuk mengontrol akses.

Saya melakukan versi lain dari ini hanya untuk bersenang-senang, requireMinimumStatus. Satu-
satunya perbedaan dalam metode ini adalah bahwa kita menggunakan >= operator yang
memungkinkan kita untuk mengatur status minimum yang diperlukan. Selain itu, itu persis sama
dengan metode sebelumnya.

Metode requireRole mengambil nama role sebagai argumen, jadi misalnya, jika Anda ingin meminta
user untuk memiliki peran dengan nama Admin, Anda dapat menggunakan metode ini. Sekali lagi,
kelas ValueHelpers kami sangat berguna untuk membantu kami melakukan metode yang sangat
ringkas.

Dan akhirnya, saya melakukan metode requireMinimumRole persis seperti metode requireRole,
tetapi dengan> = operator, jadi jika Anda ingin misalnya Admin dan SuperUser untuk dapat
mengakses backend, Anda bisa mengontrol akses ke backend dengan metode ini.

Lihatlah bagaimana intuitif sintaks ini:

PermissionHelpers::requireMinimumRole('Admin');

Biasanya, Anda akan menggunakannya sebagai bagian dari pernyataan jika, karena ia
mengembalikan benar atau salah. Hanya untuk menjadi jelas, itu memeriksa untuk melihat apakah
pengguna saat ini memiliki peran dengan setidaknya role_value itu.

Meskipun kita belum sepenuhnya menjelaskan, Anda mulai mendapatkan beberapa ide tentang
bagaimana kita menjawab pertanyaan, "Bagaimana kita akan mengontrol akses ke backend?"

Jangan khawatir jika Anda tidak benar-benar mengerti sekarang, Anda akan mengerti dengan
melihatnya dalam tindakan.

Record Helpers
Ok, jadi kami memiliki satu file penolong terakhir, RecordHelpers. Mari kita pergi ke depan dan
menciptakan RecordHelpers.php common\models dan menempatkan isi berikut dalam file:

<?php
namespace common\models;
use yii;
Class RecordHelpers
{
public static function userHas($model_name)
{
$connection = \Yii::$app->db;
$userid = Yii::$app->user->identity->id;
$sql = "SELECT id FROM $model_name WHERE user_id=:userid";
$command = $connection->createCommand($sql);
$command->bindValue(":userid", $userid);
$result = $command->queryOne();
if ($result == null) {
return false;
} else {
return $result['id'];
}
}

Kelas ini hanya memiliki satu metode. Apa yang saya rencanakan untuk aplikasi kita adalah profil
pengguna dan saya ingin Profil link yang ketika Anda klik di atasnya, angka keluar apakah pengguna
memiliki profil atau jika mereka perlu untuk membuat satu.

Saya ingin menjaga sintaks di controller saya sangat intuitif dan memiliki hasil diformat baik palsu
atau catatan id. Dengan cara itu jika ia datang kembali palsu, saya dapat memiliki pengguna
membuat catatan, dan jika ia mengembalikan id dari catatan karena pengguna sudah memiliki satu,
saya bisa membuat pandangan itu. Sesuatu seperti:
If ($already_exists = RecordHelpers::userHas('profile') {
// show profile with id with value of $already_exists
} else {
// go to form to create profile
}

Semacam ini sintaks membuatnya sangat mudah untuk memahami apa yang terjadi di sini. Jika
pernyataan mengembalikan id catatan, menunjukkan profil dengan id catatan, yang sekarang
direferensikan oleh variabel $already_exists. Jika ia datang kembali palsu, pergi ke membuat
formulir.

Saya juga menulis itu sehingga saya bisa menggunakannya dengan model lain, saya hanya perlu
menyerahkan nama model sebagai string. Metode ini juga menggunakan:
Yii::$app->user->identity->id

Kami menggunakan ini untuk mengatur id dari pengguna saat ini. User id saat selalu tersedia melalui
panggilan ini seluruh aplikasi. Jadi itu adalah bagaimana kita tahu bahwa kita berhadapan dengan
pengguna saat ini.

Anda harus mencatat bahwa metode ini ditulis untuk kembali satu catatan, Anda harus memodifikasi
jika ada kemungkinan bahwa pengguna bisa memiliki beberapa catatan, beberapa profil misalnya.

Summary

Ok, sekarang Anda menyadari bahwa belajar Yii 2 adalah menyenangkan, tetapi juga banyak
pekerjaan. Ini adalah kerangka besar, elegan dan kuat, mampu melakukan banyak hal. Kami telah
melakukan banyak sudah. Kami mendirikan aplikasi, kita sebentar Ulasan arsitektur MVC, dan kami
memodifikasi User model. Kami juga membangun 5 model baru dan menempatkan hubungan
mereka satu sama lain dan hubungan mereka dengan User model, dan kami membangun sejumlah
metode pembantu untuk membuat coding lebih mudah ketika kita menggali lebih jauh ke dalam
aplikasi.

Kami telah melakukan semua ini, namun aplikasi kita saat ini tidak apa-apa lebih dari itu ketika Anda
menginstal itu. Terima kasih atas kesabarannya. Dalam bab-bab selanjutnya, kita akan mulai
menambahkan fitur untuk aplikasi kita.
Chapter Seven: Site Controller
Kami akan melanjutkan pembangunan kita dengan melihat Site Controller dan itu pandangan terkait.
Ini akan memperkenalkan kita untuk controllers Yii 2, sehingga kita bisa mendapatkan pengetahuan
tentang bagaimana mereka bekerja. Hal pertama yang kita harus menyebutkan adalah bahwa ada
dua site controllers, satu untuk backend dan satu untuk frontend.

Kami akan mulai dengan membahas site controller frontend, yang akan membawa kita melalui
registrasi dan login, maka kita akan beralih ke site controller backend, menunjukkan perbedaan. Dan
kemudian kita akan menambahkan fungsi baru pertama kami sejak kami memasang template
advanced. Kita akan mendapatkan site controller backend untuk menegakkan tingkat akses yang
berbeda untuk login backend.

Ok, mari kita mulai. Kita akan melihat frontend\controllers\SiteController.php dalam potongan, tidak
perlu untuk mereproduksi seluruh file, karena kita tidak mengubah apa-apa.

Pertama atas, namespace dan menggunakan pernyataan:

<?php
namespace frontend\controllers;
use Yii;
use common\models\LoginForm;
use frontend\models\PasswordResetRequestForm;
use frontend\models\ResetPasswordForm;
use frontend\models\SignupForm;
use frontend\models\ContactForm;
use yii\base\InvalidParamException;
use yii\web\BadRequestHttpException;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;

Menggunakan beberapa model dan kami akan melihat ini dalam action. Berikutnya kita memiliki
deklarasi class:
class SiteController extends Controller

Anda bisa melihat luasnya Controller. Bila Anda memiliki waktu, menelusuri Controller, itu akan
memberi Anda ide yang lebih baik tentang bagaimana sesuatu bekerja, tapi lebih dulu, kode
kerangka kadang-kadang sulit untuk diikuti, terutama bagi pemula. Kode yang Anda lihat di
permukaan lebih ramah daripada apa yang akan Anda lihat di bawah.

Behaviors
Berikutnya kita memiliki sesuatu yang akrab, metode perilaku. Kami melihat mereka pada beberapa
model kami dengan perilaku Timestamp. Controllers kami menggunakan perilaku accessControl:

public function behaviors()


{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout', 'signup'],
'rules' => [
[
'actions' => ['signup'],
'allow' => true,
'roles' => ['?'],
],
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}

Ini adalah kami out-of-the-box metode untuk mengendalikan akses ke situs, dan terutama kontrol
login atau tamu. The '?' Adalah tamu dan '@' login. Jadi sekarang kita tahu bahwa, kita bisa melihat
sintaks sangat intuitif Yii 2 di tempat kerja. Tapi mari kita memecahnya hanya untuk memastikan. Hal
pertama:

Nama perilaku:

return [
'access' => [

Ini disebut akses, tetapi Anda bisa menyebutnya string apapun dan itu akan bekerja sama.
Berikutnya datang class:

'class' => AccessControl::className(),

Ini hanya memberitahu kita apa class untuk menerapkan. Berikutnya kita lihat apa tindakan untuk
menerapkan untuk perilaku:
'only' => ['logout', 'signup'],

Jadi aturan ini hanya akan berlaku untuk logout dan pendaftaran. Berikutnya datang aturan, dan ini
adalah di mana kita dapat menerapkan mereka untuk tindakan tertentu:

[
'actions' => ['signup'],
'allow' => true,
'roles' => ['?'],
],
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
Jadi, aturan pertama mengatakan pendaftaran, benar, tamu, dengan kata lain, tamu diperbolehkan
untuk mendaftar. Aturan kedua mengatakan, logout, benar, login user, dengan kata lain login
pengguna yang diizinkan untuk mengakses aksi logout. Karena kita ditentukan dalam 'only' bagian
dari metode ini, semua tindakan lain yang tidak dikendalikan oleh aturan-aturan ini.

Seperti kita melalui tindakan lain, kita akan melihat mengapa ini masuk akal.

Actions
Metode pertama di bawah perilaku adalah tindakan:

public function actions()


{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}

Ini adalah metode konfigurasi, memberitahu kita yang class digunakan untuk kesalahan dan yang
class digunakan untuk Captcha. Konfigurasi dalam tindakan membuat konfigurasi ini tersedia untuk
setiap tindakan. Jadi jika Anda ingin menggunakan Captcha untuk sesuatu, Anda perlu konfigurasi
dalam controller, seperti di atas. Kemudian dipanggil keluar sebagai widget, yang akan kita lihat
segera dalam tindakan.

Index Action
Mari kita beralih ke actionIndex:

public function actionIndex()


{
return $this->render('index');
}

Iya nih! Hal harus mendapatkan sederhana cepat atau lambat ... ini hanya memanggil metode
membalas pandangan, dalam hal ini 'index'.

Ini memberi kita kesempatan untuk menyegarkan diri kita sendiri tentang bagaimana routing
bekerja. Rute ke indeks terlihat seperti ini:
yii2build.com/index.php?r=site/index

Karena kita meninggalkan url jelek di tempat, itu sangat eksplisit. Index.php adalah halaman
bootstrap, semuanya berjalan melalui pintu itu. R untuk rute, = site/index. Dalam hal ini, site adalah
controllers, indeks adalah tindakan. Jika Anda meninggalkan tindakan off controller, itu akan
mencari tindakan indeks dan standar untuk itu. Jika tidak ada tindakan indeks, itu akan kembali
kesalahan.
Juga catatan singkat, default ke situs diatur dengan yang di atas, jadi jika Anda hanya mengetikkan
domain, yii2build.com, itu adalah rute Anda akan mendapatkannya.

Tindakan dalam kebanyakan kasus akan membuat tampilan, menggunakan sintaks yang kita lihat
pada tindakan indeks di atas, dan itu adalah bagaimana kita bisa melihat halaman. Pada.
Bagaimanapun, Anda harus memiliki rasa sekarang bagaimana controller/action menggerakkan kita
melalui site.

Login Action
Metode berikutnya pada controllers adalah actionLogin:

public function actionLogin()


{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);
}
}

Ok, bagus, kita akan melihat bagaimana user log in Hal pertama yang terjadi adalah tes untuk
melihat apakah mereka sudah login:

if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}

Hal ini dilakukan dengan memeriksa untuk melihat apakah pengguna tidak tamu. Jika mereka tidak
tamu, berarti mereka sudah login dan dalam hal ini, kami mengirim mereka ke homepage.

Login Form Model


Jika belum login, kita membuat sebuah instance baru dari LoginForm:
$model = new LoginForm();

Kami berbicara sedikit tentang model LoginForm, ketika kami berada di Memodifikasi model User,
tapi beruang mengambil melihat lebih dekat, sehingga kita dapat memahami persis bagaimana ini
bekerja. Kota ini terletak di common\models, jadi itu sebabnya blok pertama terlihat seperti:

<?php
namespace common\models;
use Yii;
use yii\base\Model;
use yii\web\NotFoundHttpException;

Maka kita mendapatkan deklarasi kelas dan atribut:


class LoginForm extends Model
{
public $username;
public $password;
public $rememberMe = true;
private $_user = false;

Ingat, model ini meluas Model, tidak Pengguna, jadi kami harus menyatakan atribut. Default kami
$rememberMe ke true, ini menetapkan bendera pada formulir untuk cookie. Secara default $_user
ke false dan kita akan melihat mengapa dalam sekejap.

Berikutnya kami memiliki metode aturan:

public function rules()


{
return [
// username and password are both required
[['username', 'password'], 'required'],
// rememberMe must be a boolean value
['rememberMe', 'boolean'],
// password is validated by validatePassword()
['password', 'validatePassword'],
];
}

Kami memiliki komentar yang menjelaskan validator kita gunakan. Anda dapat melihat password
menggunakan metode validatePassword seperti validator itu:

public function validatePassword($attribute, $params)


{
if (!$this->hasErrors()) {
$user = $this->getUser();
if (!$user || !$user->validatePassword($this->password)) {
$this->addError($attribute, 'Incorrect username or password.');
}
}
}

Metode yang cukup intuitif, jika tidak ada kesalahan, besar mendapatkan pengguna, jika tidak
menyatakan kesalahan. Berikutnya kita memiliki metode login sendiri:

/**
* 2 lines in return statement to avoid wordwrap
*/
public function login()
{
if ($this->validate() && $this->getUser()) {
return Yii::$app->user->login($this->getUser(),
$this->rememberMe ? 3600 * 24 * 30 : 0);
} else {
return false;
}
}
Ok, sedikit lebih rumit. $this->validate() memanggil metode memvalidasi Model. dan getUser dari
model LoginForm, yang akan kita lihat sebentar lagi. Jika kita memvalidasi dan pengguna, kita
kembali metode login pengguna yang tersedia untuk kita dari Yii::$app.

Ini sebenarnya referensi model User di vendor\yiisoft\yii\webUser. Ini adalah kelas Yii 2 digunakan
untuk mengelola identitas dan login dan ada metode masuk agak rumit di sana. Ia sedikit agak
membingungkan untuk memiliki beberapa model dan beberapa metode, tetapi itu adalah sifat dari
binatang itu. Aku tidak akan pergi lebih jauh ke dalam metode login karena itu di luar cakupan
diskusi ini dan pasti bukan untuk pemula, tetapi Anda dapat check it out untuk diri sendiri jika Anda
inginkan.

Setidaknya itu membuat kode dalam model LoginForm tampak sangat intuitif dengan perbandingan.
Pokoknya, ia bekerja, dan log in pengguna dan menetapkan ingat saya cooke jika bendera yang telah
ditetapkan dalam bentuk.

Jika sesuatu gagal, ia mengembalikan palsu, dan biasanya pesan validasi akan dikirim ke tampilan
memberitahu pengguna apa masalahnya. Di permukaan, itu sangat sederhana.

Ok, metode terakhir dari model ini:

public function getUser()


{
if ($this->_user === false) {
$this->_user = User::findByUsername($this->username);
}
return $this->_user;
}

Karena kita tahu atribut $default _user swasta untuk palsu, kondisi di jika pernyataan akan dipenuhi
jika metode ini belum sudah dijalankan. Jadi jika tidak ada nama di $_user, maka menggunakan
metode statis dari model Pengguna untuk kembali contoh model pengguna dan set ke $_user.

Dalam rangka untuk bekerja, model LoginForm jelas memiliki untuk mendapatkan nilai-nilai untuk
atribut dari pos, sehingga tahu yang $this->username mengacu pada, dan dapat mencari pengguna
dan set ke $_user. Jadi mari kita lihat bagaimana kita mendapatkan data posting dengan kembali
sekarang untuk metode actionLogin dari SiteController dan mengambil tempat kami tinggalkan. Jadi
setelah memanggil contoh baru dari model LoginForm, kita mendapatkan:

if ($model->load(Yii::$app->request->post()) && $model->login()) {


return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);

Ini akan mendapatkan itu data posting dari:


Yii::$app->request->post()

Jika kita dapat memuat data posting, yang akan memvalidasi sesuai dengan model seperti yang kita
jelaskan sebelumnya dan jika dapat memanfaatkan metode login model, itu akan mengembalikan
pengguna ke halaman apapun mereka gunakan:
return $this->goBack();
Hanya sekarang mereka akan berada dalam keadaan login.

Jika tidak, jika sesuatu yang gagal atau kita belum diposting formulir, kami akan menampilkan form:

} else {
return $this->render('login', [
'model' => $model,
]);

Anda juga dapat melihat di sini bahwa itu melewati sebuah contoh dari $model ke tampilan, yang
kita tahu dalam hal ini adalah model LoginForm yang kita tetapkan sebelumnya dengan:
$model = new LoginForm();

Yang membuat model tersedia untuk tampilan. Dan itu untuk login, mudah-mudahan Anda
mendapat pemahaman yang baik tentang bagaimana yang bekerja.

Logout Action
Metode actionLogout secara signifikan lebih sederhana:

public function actionLogout()


{
Yii::$app->user->logout();
return $this->goHome();
}

Ia menggunakan metode logout dari model pengguna terkubur jauh di dalam perut Yii 2 dan
mengirimkan pengguna ke halaman indeks melalui gohome().

Contact Action
Rute Metode berikutnya kami ke halaman kontak sederhana, dengan metode actionContact, tetapi
ada beberapa hal yang menarik di sini.

public function actionContact()


{
$model = new ContactForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('success',
'Thank you for contacting us. We will respond to you as soon as possible.');
} else {
Yii::$app->session->setFlash('error', 'There was an error sending email.');
}
return $this->refresh();
} else {
return $this->render('contact', [
'model' => $model,
]);
}
}
Contact Form Model
Pertama Metode hal actionContact pada controller yang dilakukan adalah memanggil model bentuk
baru, ContactForm, terletak di frontend/models. Itu model bentuk lain yang meluas Model, jadi mari
kita melangkah melalui itu:

<?php
namespace frontend\models;
use Yii;
use yii\base\Model;
/**
* ContactForm is the model behind the contact form.
*/
class ContactForm extends Model
{
public $name;
public $email;
public $subject;
public $body;
public $verifyCode;
/**
* @inheritdoc
*/
public function rules()
{
return [
// name, email, subject and body are required
[['name', 'email', 'subject', 'body'], 'required'],
// email has to be a valid email address
['email', 'email'],
// verifyCode needs to be entered correctly
['verifyCode', 'captcha'],
];
}

Jadi kita memiliki namespace, laporan penggunaan, atribut, dan metode pertama, aturan.

Captcha
Perhatikan kita memiliki atribut verifyCode. Kami akan menggunakan validator captcha pada atribut
ini. Jika Anda ingat, kelas captcha dikonfigurasi ke controller melalui metode tindakan, sehingga
tersedia pada setiap tindakan, dan kita lihat di sini bahwa itu benar-benar disebut sebagai aturan
validasi pada model bentuk. Barang keren.

Jika Anda perlu untuk mengimplementasikan captcha pada apa pun pada aplikasi masa depan Anda,
Anda dapat menggunakan ini sebagai contoh bagaimana untuk menerapkannya. Ini akan menjadi
langkah-langkah untuk menerapkan captcha:

Mengkonfigurasi ke controller melalui metode tindakan


Termasuk sebagai validator pada aturan bentuk model
Termasuk widget pada tampilan
Aku tidak tahu dari PHP framework lain yang membuatnya mudah. Lagi pula, kami melompat ke
depan, kita tidak melihat tampilan lagi, ditambah kami memiliki postingan keren lainnya terjadi di
sini dalam beberapa saat. Pertama mari kita lanjutkan dengan model ContactForm. Metode
attributeLabels sebelah:

public function attributeLabels()


{
return [
'verifyCode' => 'Verification Code',
];
}

Ini adalah label yang akan muncul pada formulir di tampilan. Tidak ada penjelasan lebih lanjut
dibutuhkan di sana. Dan akhirnya, metode sendEmail:

public function sendEmail($email)


{
return Yii::$app->mailer->compose()
->setTo($email)
->setFrom([$this->email => $this->name])
->setSubject($this->subject)
->setTextBody($this->body)
->send();
}

Ini memanggil metode compose dari mailer dikonfigurasi dalam aplikasi yang harus Swiftmailer.
Ketika Anda berada dalam mode pembangunan, yang bagaimana kita setup aplikasi kita pada init di
setup, email akan dikirim ke frontend\runtime\email. Sehingga Anda dapat mencoba formulir
kontak Anda untuk melihat apakah menempatkan email ada. Selain itu, saya tidak benar-benar
menutupi bahwa subjek dalam buku ini. Tetapi Anda dapat memeriksa Yii 2 panduan untuk petunjuk
konfigurasi:

Yii 2 Email Guide


Dan itu saja untuk model ContactForm kami. Mari kita kembali sekarang untuk SiteController dan itu
metode actionContact. Jadi kita disebut contoh ContactForm dan set ke $model. Kemudian kita
memiliki:

if ($model->load(Yii::$app->request->post()) && $model->validate()) {


if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('success',
'Thank you for contacting us. We will respond to you as soon as possible.');
} else {
Yii::$app->session->setFlash('error', 'There was an error sending email.');
}
return $this->refresh();
} else {
return $this->render('contact', [
'model' => $model,
]);
}
Jadi, jika kita mendapatkan data pos dan proses dan memvalidasi melalui model bentuk, dan jika
email dapat dikirim, kami menginstruksikan metode untuk mengirim pesan kilat. Sebuah pesan flash,
yang merupakan teks yang akan muncul dalam tampilan, akan dikirim dari controller ke tampilan
melalui sesi. Jadi di sini kita memiliki metode setFlash. Itu semua yang Anda butuhkan untuk
mengirim pesan kilat, Yii 2 akan melakukan sisanya.

Perhatikan bahwa dalam setiap peristiwa dalam metode ini, itu akan tetap pada halaman kontak.
Dalam kasus di mana proses formulir, berhasil atau tidak, itu refresh halaman, selain itu
menunjukkan bentuk, yang merupakan hal yang sama, tetapi tanpa pesan flash.

Ini layak sekarang untuk melihat pada pandangan karena kami memiliki beberapa hal menarik yang
terjadi, termasuk penggunaan captcha sebagai metode verifikasi.

Contact View Form


Jadi bagaimana keren itu yang pertama file tampilan kita melihat secara mendalam adalah form?
Prediksi saya adalah bahwa Anda akan takjub melihat betapa singkat file ini. Dan akhirnya, Anda
akan melihat siklus MVC penuh di tempat kerja.

Ok, jadi di folder frontend/views/site, kita memiliki contact.php:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\captcha\Captcha;
/* @var $this yii\web\View */
/* @var $form yii\widgets\ActiveForm */
/* @var $model \frontend\models\ContactForm */
$this->title = 'Contact';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-contact">
<h1><?= Html::encode($this->title) ?></h1>
<p>
If you have business inquiries or other questions, please fill out the
following form to contact us. Thank you.
</p>
<div class="row">
<div class="col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
<?= $form->field($model, 'verifyCode')
->widget(Captcha::className(), [
'template' => '<div class="row"><div class="col-lg-3">
{image}</div><div class="col-lg-6">{input}</div></div>',
]) ?>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'contact-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
</div>

37 baris, itu saja!

Anda dapat melihat kita mulai dengan pernyataan kita gunakan dan beberapa komentar yang
memberitahu kita apa yang kita akses variabel:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\captcha\Captcha;
/* @var $this yii\web\View */
/* @var $form yii\widgets\ActiveForm */
/* @var $model \frontend\models\ContactForm */

Hal ini berguna untuk referensi karena mudah untuk $this dan $model bingung. Tapi tidak perlu
khawatir, Anda hanya dapat melihat atas file.

Berikutnya kita mendapatkan judul dan breadcrumbs:

$this->title = 'Contact';
$this->params['breadcrumbs'][] = $this->title;
?>

Kami menggunakan metode params untuk mengirim parameter breadcrumb ke file tata letak
(frontend\views\layout\main.php), yang menyebutnya melalui widget Breadcrumbs, sehingga
muncul di bagian atas halaman.

Juga, Perhatikan penutupan tag php di bawah ini. Dalam model kami dan pengendali, kami tidak
menggunakan penutup tag ?> . Dalam pandangan kami, tidak hanya kita gunakan menutuptag ?>,
tapi kami harus memastikan kami membuka dan php dekat dengan benar seperti yang kita diselingi
dengan HTML.

Selanjutnya kita mendapatkan sebuah div. Bukan php:


<div class="site-contact">

Kemudian kami mendapatkan <H1> dengan Php di dalamnya:


<h1><?= Html::encode($this->title) ?></h1>

Tip
Aku penggemar besar dari tag php merah, terutama dalam pandangan. Aku tidak bisa
mengendalikan warna dalam buku ini, tapi itu hanya tip untuk coding Anda sendiri.
Warna yang benar-benar membantu itu muncul keluar terhadap kode Html.

Juga perhatikan lebih pendek <?= Membuka tag php. Ini adalah versi pendek dari:
<?php echo
Jadi dalam h1 kami, kami bergema judul, dalam metode Html::encode. Ini akan mengkonversi
karakter khusus ke dalam entitas html. Inilah sebabnya mengapa kita perlu:
use yii\helpers\Html;

Kemudian kita memiliki <p> untuk petunjuk tentang mengisi formulir. Ini adalah format Html
sekadar.

Kemudian kami mendapatkan dua div untuk widget formulir kami untuk diletakkan di:

<div class="row">
<div class="col-lg-5">

Dan kemudian kita memanggil widget ActiveForm sendiri:


<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>

Perhatikan bahwa kita tidak dapat menggunakan ActiveForm tanpa pernyataan penggunaan di
bagian atas file:
use yii\widgets\ActiveForm;

Dalam array konfigurasi widget, kami menetapkan 'id=>'contact-form. Ini memberitahu bentuk
untuk menggunakan model ContactForm. Jadi melihat dari atas sisa kode, tidak ada yang
menunjukkan bentuk tindakan. Bagaimana cara mengetahui tindakan apa yang harus di posting?

Ini adalah salah satu fitur yang benar-benar mengagumkan dari Yii 2. Ia tahu bahwa lokasi form
adalah file view yang disebut contact.php dalam situs bernama tampilan folder. Oleh karena itu ia
tahu bahwa itu harus menyerahkan aksi ke site/contact. Anda bahkan tidak perlu mengatakan itu di
mana untuk mengirim formulir. Dan karena kami telah menyebutkan bahwa kita mengatur id
formulir untuk contact-form, ia memiliki model juga, sehingga memiliki segala yang dibutuhkan
untuk menempatkan ini bersama-sama untuk Anda di balik layar, termasuk validasi dan pengolahan.

Jadi sekarang hanya menentukan bidang apa Anda ingin memposting:

<?= $form->field($model, 'name') ?>


<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
<?= $form->field($model, 'verifyCode')
->widget(Captcha::className(),
[
'template' => '<div class="row"><div class="col-lg-3">
{image}</div><div class="col-lg-6">{input}</div></div>',
])
?>

Tip
Hanya pengingat lain, Anda perlu menyertakan penutupan Tag ?> dalam views.

Di field terakhir, kami mendapat sedikit rumit, kami menempatkan widget di field. Ini adalah
implementasi captcha yang kita berbicara tentang sebelumnya. Ini hanya penerapan standar, ia akan
bekerja dalam bentuk apapun selama Anda telah melakukan dua langkah pertama yang kita jelaskan
sebelumnya.
Terakhir, kita menambahkan div untuk tombol dan akhir dalam bentuk:

<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary',
'name' => 'contact-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
</div>

Saya tidak tahu bagaimana perasaan Anda tentang itu, tapi bagi saya, yang begitu sederhana, itu
inspirasi. Semua validasi, semua hal regex rumit, ditangani dengan mudah. Jika bekerja pada bentuk
validasi adalah hobi favorit Anda, saatnya untuk menemukan hobi baru.

Ok, percaya atau tidak, kita berada dalam sebuah bab tentang site controller. Jadi mari kita kembali
sekarang.

About Action
Metode berikutnya adalah actionAbout:

public function actionAbout()


{
return $this->render('about');
}

Jelas, semuanya dalam tampilan file dan sebagian besar itu hanya teks.

Signup Action
Mari kita beralih ke actionSignup:

public function actionSignup()


{
$model = new SignupForm();
if ($model->load(Yii::$app->request->post())) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
return $this->goHome();
}
}
}
return $this->render('signup', [
'model' => $model,
]);
}

Di sini kita pergi, model formulir baru, SignupForm. Hanya catatan singkat. Aku memeriksa
pandangan signup.php dan id dari widget bentuk ditetapkan untuk form-signup, yang saya percaya
adalah salah cetak. Konvensi tampaknya sebaliknya, jadi hanya untuk memeriksa apakah itu akan
berhasil, aku berubah untuk mendaftar-bentuk, dan tentu saja, itu masih bekerja. Jadi kemungkinan
besar, Yii 2 tidak peduli apa agar Anda menempatkan mereka. Aku, di sisi lain, gugup tentang hal-hal
seperti itu, jadi aku menempel dengan salah satu cara untuk melakukannya, yang menempatkan
kata form' kedua. Ini juga merupakan indikasi bahwa saat membuat model formulir, Anda harus
tetap dengan konvensi penamaan ExampleForm, misalnya.

Signup Form Model


Kami melihat model SignupForm sebentar di Memodifikasi bab Model Pengguna, tapi mari kita lihat
model SignupForm secara lebih rinci sekarang. Kita akan mulai dengan namespace, penggunaan
pernyataan, deklarasi kelas, dan atribut:

<?php
namespace frontend\models;
use common\models\User;
use yii\base\Model;
use Yii;
/**
* Signup form
*/
class SignupForm extends Model
{
public $username;
public $email;
public $password;

Tidak ada yang kita belum lihat sebelumnya. Mari kita lihat metode aturan:

public function rules()


{
return [
['username', 'filter', 'filter' => 'trim'],
['username', 'required'],
['username', 'unique',
'targetClass' => '\common\models\User',
'message' => 'This username has already been taken.'],
['username', 'string', 'min' => 2, 'max' => 255],
['email', 'filter', 'filter' => 'trim'],
['email', 'required'],
['email', 'email'],
['email', 'unique',
'targetClass' => '\common\models\User',
'message' => 'This email address has already been taken.'],
['password', 'required'],
['password', 'string', 'min' => 6],
];
}

Ok, kita memiliki beberapa aturan untuk memangkas keluar ruang putih, memerlukan fields kami,
dan menunjukkan kepada kita jika username atau email sudah digunakan, contoh validator yang
unik. Perhatikan bahwa pada email dan user aturan yang unik, itu daftar kelas sasaran, bersama
dengan pesan respon. Ini adalah satu-satunya waktu saya pernah melihat ini dan saya tidak bisa
menemukan apa pun di dokumentasi di atasnya, jadi saya akan mengambil menebak di sini dan
mengatakan itu perlu tahu model mana yang akan digunakan untuk validasi unik, karena memiliki
untuk query database untuk menjalankan validator.
Kemudian kita memiliki metode signup:

public function signup()


{
if ($this->validate()) {
$user = new User();
$user->username = $this->username;
$user->email = $this->email;
$user->setPassword($this->password);
$user->generateAuthKey();
$user->save();
return $user;
}
return null;
}

Ini sebenarnya cukup sederhana untuk memahami. Itu panggilan contoh User model, kemudian
menggunakan metode User model untuk membuat user, selama input telah lulus validasi.

Jadi satu hal yang perlu diperhatikan tentang controller adalah bahwa mereka dapat referensi
berbagai model. Sejauh ini site controller telah menggunakan 3 model bentuk yang berbeda dan
model pengguna.

Pokoknya, mari kita kembali ke metode actionSignup pada controller. Ini dia lagi untuk referensi:

public function actionSignup()


{
$model = new SignupForm();
if ($model->load(Yii::$app->request->post())) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
return $this->goHome();
}
}
}
return $this->render('signup', [
'model' => $model,
]);
}

Pada titik ini, kita cukup akrab dengan cara Yii 2 memuat data posting. Kemudian berjalan metode
pendaftaran pada model, yang akan menciptakan pengguna. Kemudian ia menemukan sebuah
instance dari pengguna dan log mereka. Akhirnya, ia mengembalikan mereka ke homepage.

Jika gagal atau tidak ada posting data, itu menunjukkan formulir pendaftaran.

Dua metode terakhir di site controller kesepakatan dengan ulang password. Yang pertama adalah
actionRequestPasswordReset dan panggilan model PasswordResetRequestForm.

Ini menarik untuk dicatat id pada tampilan form adalah


<?php $form = ActiveForm::begin(['id' => 'request-password-reset-form']); ?>

Sehingga Anda dapat melihat konvensi penamaan berikut apa yang kita harapkan.
Ok, kembali ke model, mari kita melangkah melalui ini cukup sederhana sebenarnya:

<?php
namespace frontend\models;
use common\models\User;
use yii\base\Model;
/**
* Password reset request form
*/
class PasswordResetRequestForm extends Model
{
public $email;
/**
* @inheritdoc
*/
public function rules()
{
return [
['email', 'filter', 'filter' => 'trim'],
['email', 'required'],
['email', 'email'],
['email', 'exist',
'targetClass' => '\common\models\User',
'filter' => ['status' => User::STATUS_ACTIVE],
'message' => 'There is no user with such email.'
],
];
}

Atribut hanya di sini adalah $email. Perhatikan pada aturan dalam array itu ada kita mendapatkan
'targetClass', 'filter', dan message. Ini menunjukkan kepada kita bagaimana validasi canggih dapat.
Kami juga melihat salah satu konstan aku meninggalkan di tempat pada model Pengguna yang
direferensikan. Jadi jika di masa depan, kita ingin mengganti itu, kita harus melakukannya di sini
serta dalam model. Tapi tunggu dulu. Kami mengubah atribut dari status ke status_id, jadi kita harus
mengubah itu di sini. Pergi ke depan dan membuat perubahan sekarang.

Sekarang kita hanya memiliki satu metode yang lebih, sendEmail:

public function sendEmail()


{
/* @var $user User */
$user = User::findOne([
'status' => User::STATUS_ACTIVE,
'email' => $this->email,
]);
if ($user) {
$user->generatePasswordResetToken();
if ($user->save()) {
return \Yii::$app->mailer->compose('passwordResetToken',
['user' => $user])
->setFrom([\Yii::$app->params['supportEmail'] => \Yii::$app->name . ' robot'])
->setTo($this->email)
->setSubject('Password reset for ' . \Yii::$app->name)
->send();
}
}
return false;
}

Kami juga perlu membuat atribut nama perubahan di sini. Pergi ke depan dan perubahan status' ke
'status_id '.

Metode SendEmail mendongak pengguna dengan alamat email untuk melihat apakah mereka aktif.
Jika kita baik di sana, kita sebut generatePasswordResetToken. Jika kita dapat menyimpannya, kami
mengirim token dalam email. Jika tidak kembali palsu.

Jadi kembali ke site controller dan metode actionRequestPasswordReset. Jadi setelah mencoba
untuk mengirim data dan memvalidasi, ia mencoba untuk mengirim email, dan jika baik,
menetapkan pesan kilat keberhasilan. Jika lulus validasi tapi untuk beberapa alasan email tidak
dapat dikirim, itu menunjukkan pesan kilat untuk kesalahan.

Jika data tidak diposting, itu menunjukkan formulir.

Ok, satu lagi tindakan di site controller, actionResetPassword ($token). Satu ini membutuhkan
variabel get dari url untuk token:

public function actionResetPassword($token)


{
try {
$model = new ResetPasswordForm($token);
} catch (InvalidParamException $e) {
throw new BadRequestHttpException($e->getMessage());
}
if ($model->load(Yii::$app->request->post()) && $model->validate()
&& $model->resetPassword()) {
Yii::$app->getSession()->setFlash('success', 'New password was saved.');
return $this->goHome();
}
return $this->render('resetPassword', [
'model' => $model,
]);
}

Tidak mengherankan, kami memiliki model yang bentuk lain. Sekarang karena kita mengharapkan
token dari variabel get, kami membungkus panggilan untuk model dalam mencoba menangkap blok
sehingga kita dapat menangani kesalahan jika kita tidak mendapatkan token yang diharapkan.

ResetPasswordForm Model
Mari kita lihat model ResetPasswordForm:

<?php
namespace frontend\models;
use common\models\User;
use yii\base\InvalidParamException;
use yii\base\Model;
use Yii;
/**
* Password reset form
*/
class ResetPasswordForm extends Model
{
public $password;
/**
* @var \common\models\User
*/
private $_user;

Kita melihat namespace, gunakan pernyataan, deklarasi kelas dan atribut. Ada komentar
mengatakan bahwa kita akan referensi User model. Kemudian kami mendapatkan konstruktor yang
membutuhkan dua argumen, token dan $config yang defaultnya array kosong. Aku cukup yakin array
kosong ada karena konstruktor induk Model, kelas yang sedang diperpanjang.

/**
* Creates a form model given a token.
*
* @param string $token
* @param array $config name-value pairs that will be used to initialize
*the object properties
* @throws \yii\base\InvalidParamException if token is empty or not valid
*avoiding line-wrap in function. do not breakup lines in your code.
*/
public function __construct($token, $config = [])
{
if (empty($token) || !is_string($token)) {
throw new InvalidParamException(
'Password reset token cannot be blank.');
}
$this->_user = User::findByPasswordResetToken($token);
if (!$this->_user) {
throw new InvalidParamException(
'Wrong password reset token.');
}
parent::__construct($config);
}

Jelas lagi, kita menghindari wordwrap, jadi ada jeda baris di mana tidak aka ada biasanya. Itu
membuat kode terlihat rapi tetapi tidak ada yang bisa saya lakukan tentang hal itu. Jadi mari kita
lanjutkan.

Jadi dua hal utama konstruktor lakukan. 1. Ia memeriksa untuk melihat apakah token kosong atau
tidak string. 2. Ia melakukan User::findByPasswordResetToken($token) memanggil untuk mengatur
pengguna untuk $_user.

Jika Anda ingat ketika kami pergi melalui User model secara detail, kita melihat metode
findByPasswordReset-Token($ token).

Konstruktor selesai dengan memanggil induk.


Berikutnya kita memiliki metode aturan:

public function rules()


{
return [
['password', 'required'],
['password', 'string', 'min' => 6],
];
}

Cukup mudah untuk memahami.

Kami menyelesaikan model dengan metode resetPassword:

/**
* Resets password.
*
* @return boolean if password was reset.
*/
public function resetPassword()
{
$user = $this->_user;
$user->password = $this->password;
$user->removePasswordResetToken();
return $user->save();
}

Hal ini cukup mudah untuk mendapatkan. Password akan ditetapkan oleh data pos yang controller
akan memberi makan ke model.

Ok, jadi untuk menutup metode pengontrol actionResetPassword:

if ($model->load(Yii::$app->request->post()) && $model->validate()


&& $model->resetPassword()) {
Yii::$app->getSession()->setFlash('success', 'New password was saved.');
return $this->goHome();
}
return $this->render('resetPassword', [
'model' => $model,
]);
}

Posting data ke model, reset password dan pulang, atau, menunjukkan bentuk tampilan.

Jelas Pengendali Situs mencakup banyak tempat, tapi kami masih memiliki tempat lebih untuk
menutupi. Itu frontend.

Backend Site Controller


Kami memiliki Backend Site Controller di backend\controllersSiteController.php. Satu ini namun
cukup sedikit lebih kecil. Mari kita menggali lebih dalam.

<?php
namespace backend\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use common\models\LoginForm;
use yii\filters\VerbFilter;
/**
* Site controller
*/
class SiteController extends Controller
{

Kita begitu terbiasa dengan ini sekarang, kita tidak perlu benar-benar komentar di sini, selain untuk
menunjukkan bahwa kita akan menggunakan model LoginForm sama frontend lakukan.

Metode selanjutnya, perilaku:

public function behaviors()


{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['get','post'],
],
],
];
}

Kami harus menambah kata kerja, baik mendapatkan dan posting untuk logout. Yang tampaknya
menjadi gejala dari beberapa perilaku buggy, karena kita tidak harus melakukannya untuk frontend.

Sekarang kita beralih ke metode tindakan, mengkonfigurasi hanya untuk kesalahan, karena kita tidak
perlu captcha:

public function actions()


{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}

Kemudian actionIndex:

public function actionIndex()


{
return $this->render('index');
}

Super sederhana seperti frontend itu.

Sekarang datang actionLogin:

public function actionLogin()


{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);
}
}

Sekali lagi, sama seperti frontend.

Dan akhirnya, actionLogout:

public function actionLogout()


{
Yii::$app->user->logout();
return $this->goHome();
}

Tidak ada penjelasan yang diperlukan pada saat ini (saya harap).

Beginning Access Control


Jadi akhirnya, terkubur di akhir bab yang panjang, kita bisa membuat beberapa perubahan dan
mempengaruhi perilaku aplikasi kita. Kita akan mulai dengan perubahan yang sangat kecil untuk
backend site controller.

Mengubah actionLogin sebagai berikut:

public function actionLogin()


{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->loginAdmin()) {
return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);
}
}

Hanya ada satu perubahan kecil. Bukan memanggil login(), kita sebut loginAdmin() dari model
LoginForm.

loginAdmin Method
Kami belum membuat metode itu, jadi mari kita pergi ke depan dan melakukannya sekarang.
Masukkan metode berikut ke common\modelsLoginForm.php:

public function loginAdmin()


{
if (($this->validate()) && $this->getUser()->role_id >=
ValueHelpers::getRoleValue('Admin')
&& $this->getUser()->status_id ==
ValueHelpers::getStatusValue('Active')) {
return Yii::$app->user->login($this->getUser(),
$this->rememberMe ? 3600 * 24 * 30 : 0);
} else {
throw new NotFoundHttpException('You Shall Not Pass.');
}
}

Jadi apa yang telah kita lakukan di sini ditambahkan lebih untuk jika pernyataan. Sekarang kita ingin
memvalidasi pengguna, dapatkan pengguna selama mereka memiliki roleValue dari Admin atau
lebih besar dan status_id Aktif. Dengan satu perubahan yang relatif kecil, kita sekarang mengontrol
akses ke login admin dengan mengharuskan pengguna untuk memiliki setidaknya peran admin dan
status aktif. Dan lihat betapa sederhananya itu!

Kelas pembantu kami, ValueHelpers datang sangat berguna dan dengan metode-metode, kita tidak
perlu kode verbose untuk mendapatkan nilai yang kita inginkan. Dan kami telah digunakan kembali
kelas pembantu ini beberapa kali.

Jadi sekarang Anda bisa bermain-main dengan ini dengan mendaftarkan user dan pengaturan
role_id mereka melalui PhpMyAdmin. Membuat beberapa yang Pengguna dan beberapa yang Admin
dan login dan keluar untuk kedua frontend dan backend. Itu cukup keren.

Karena kita menambahkan status aktif sebagai persyaratan untuk masuk ke backend, masuk akal kita
ingin persyaratan yang sama pada login frontend. Jadi pada file LoginForm.php yang sama, mari kita
mengubah metode login ke berikut:

public function login()


{
if ($this->validate() && $this->getUser()->status_id ==
ValueHelpers::getStatusValue('Active')) {
return Yii::$app->user->login($this->getUser(),
$this->rememberMe ? 3600 * 24 * 30 : 0);
} else {
return false;
}
}

Sekarang pengguna harus memiliki status aktif untuk login ke kedua sisi situs.

Summary

Kita membahas banyak tanah dengan memeriksa Site Controller secara rinci. Kami belajar banyak
tentang controller, actions, views, dan bahkan lebih pada bentuk models. Sekarang kita tahu, setelah
melihat begitu banyak contoh, bahwa pelaksanaan khas formulir dapat melibatkan pandangan
bentuk, model bentuk dan controller.

Kami belajar tentang widget ActiveForm, yang berada dalam pandangan dan membuatnya mudah
bagi kita untuk membuat formulir. Kami belajar bagaimana menerapkan captcha dan mengirim
pesan flash dari controller ke tampilan.

Kami juga belajar tentang beberapa tindakan yang lebih menarik, seperti resetPassword dan model
bentuk mereka terkait. Kita melihat bagaimana kita dapat menargetkan user class dalam aturan
validasi.

Terakhir, kita harus menerapkan beberapa perubahan yang sekarang mengontrol akses ke backend
dengan menegakkan nilai minimum untuk peran pengguna. Kami melakukan itu hanya dari
menggunakan metode Helper dari bab sebelumnya, sehingga tampak seperti itu perubahan apa-apa,
namun itu adalah awal dari kami membangun sistem kontrol seluruh aplikasi.

Kami sudah menjelaskan segala sesuatu dalam sedetail mungkin. Mudah-mudahan cukup itu
menempel dengan Anda. Jika tidak, berikan waktu, itu akan. Yii 2 membutuhkan kesabaran dan
ketekunan untuk belajar. Kami akhirnya perjalanan ke membangun aplikasi. Dan begitu seterusnya
kita berbaris!
Chapter Eight: Profile Crud
Ok, setelah begitu banyak kesabaran belajar apa Yii 2 menyerahkan kami keluar dari kotak, kita siap
untuk memperluas aplikasi kita dan menciptakan sesuatu. Kami akan mulai dengan menciptakan
kode untuk memungkinkan pengguna untuk membuat profil.

Profil akan menjadi unik untuk setiap pengguna dan hanya itu pengguna harus melihat Profil
mereka. Hal ini akan membutuhkan perubahan apa Gii akan menciptakan bagi kita, tetapi kita tentu
saja akan menggunakan Gii untuk mendapatkan kita mulai dengan membantu kami membuat Profil
CRUD.

CRUD
CRUD singkatan Create, Read, Update dan Delete, singkatan sederhana untuk mengingatnya. Bila
Anda menggunakan Gii untuk membuat CRUD, Anda mendapatkan controller, forms, dan model
pencarian. Itu mengagumkan!

Jadi mari kita mencobanya. Mari kita arahkan kembali ke Gii:


yii2build.com/index.php?r=gii

Anda dapat melihat bahwa kita perlu namespace dan mengikuti konvensi nama file.

Kami sudah memutuskan untuk menempatkan Profil model dalam folder frontend, jadi kami akan
melakukan hal yang sama untuk mentah tersebut. Pastikan ruang nama adalah sebagai berikut:

Model Class adalah frontend\models\Profile

Search Class adalah frontend\models\search\ProfileSearch

Controller Class itu adalah frontend\controllers\ProfileController


Gii harus membuat folder pencarian di bawah frontend\models, tapi aku selalu dalam kebiasaan
memastikan itu ada sebelum saya menggunakan Gii. Jadi, jika Anda mendapatkan error, membuat
folder yang pertama.

Kami menyediakan Gii dengan informasi hanya sedikit dan kali ini akan membuat 8 file bagi kita:

ProfileController.php
ProfileSearch.php
views\profile_form.php
views\profile_search.php
views\profile\create.php
views\profile\index.php
views\profile\update.php
views\profile\view.php

Jika Anda mengikuti preview/generate siklus pada Gii, Anda harus berakhir dengan 8 file. Mari kita
membahas secara singkat apa yang setiap file.

Profile Controller
Ini adalah ProfileController.php dan ditemukan di bawah frontend\controllers\ProfileController.php.
Kita akan melihat ini dengan sangat rinci dalam beberapa menit.

Profile Search
ProfileSearch.php terletak di frontend\models\search\ProfileSearch.php dan berisi logika yang
kekuatan form pencarian. Ini pada dasarnya adalah ekstensi khusus dari basis model Profile yang
untuk pencarian. Karena kita tidak akan mencari melalui profil di frontend, kita tidak akan
menggunakannya. Pengguna hanya akan memiliki satu profil dan karena itu tidak perlu untuk
mencari. Saya termasuk di sini karena saya ingin menunjukkan kepada Anda bagaimana untuk
membuat file seperti ini. Kami akan menggunakan jenis file untuk backend kami nanti.

_search
Form pencarian itu sendiri adalah named _search.php parsial yang akan diberikan ke halaman Profil
indeks. Karena kita tidak memungkinkan pengguna lain untuk profil mencari, kita tidak akan
menggunakan ini.

_form
_form.php adalah pandangan lain parsial yang berisi bentuk yang diberikan untuk membuat dan
memperbarui tampilan. Bentuk yang sama parsial diberikan ke kedua membuat dan melihat
pembaruan halaman.

Index
Index.php adalah pandangan indeks termasuk widget yang dibuat siap untuk menampilkan hasil
rekaman paginasi di kolom terorganisir, bersama dengan _search.php parsial di atas formulir.
Meskipun kita tidak akan memerlukan ini untuk pengguna frontend, yang hanya pernah memiliki
satu profil, kita akan membutuhkan ini untuk pengguna backend admin yang dapat meninjau profil
semua pengguna. Hanya untuk menjadi benar-benar jelas, kami tidak akan menggunakan file ini
sama sekali, tapi kami akan menggunakan satu seperti itu untuk backend. Kami akan
meninggalkannya di tempat untuk saat untuk tujuan demonstrasi.

Setelah file dilakukan melalui Gii, Anda dapat mencapai halaman ini di:
yiibuild.com/index.php?r=profile/index

View
View.php adalah rincian catatan individu dan memanfaatkan widget DetailView. Setelah file
dilakukan melalui Gii, Anda dapat mencapai halaman ini di:
yiibuild.com/index.php?r=profile/view

Jelas karena tidak ada profil di db, ini melakukan tidak buruk.

Create
Memanggil create.php merender _form.php parsial sehingga Anda dapat input data yang diperlukan
untuk membuat catatan.

Setelah file dilakukan melalui Gii, Anda dapat mencapai halaman ini di:
yiibuild.com/index.php?r=profile/create

Berikut adalah foto dari halaman yang diberikan oleh url di atas:

Anda dapat memberi makan di user id secara manual jika Anda ingin mencari user id melalui
PhpMyAdmin. Jika Anda ingin menguji, menggunakan formulir yang ada, meninggalkan created_at
dan updated_at kosong, kita tahu ini akan diisi oleh perilaku. Juga menggunakan, 2014-01-01 format
untuk tanggal, yang merupakan satu-satunya format yang akan memvalidasi. Memilih 1 atau 2 untuk
jenis kelamin, selama Anda telah menciptakan catatan gender dalam bab sebelumnya. Aku tidak
akan repot-repot dengan itu meskipun, sampai kita telah membuat beberapa perubahan.

Update
Memanggil update.php merender _form.php parsial sehingga Anda dapat input data yang
diperlukan untuk memperbarui catatan.

Setelah file dilakukan melalui Gii, Anda dapat mencapai halaman ini di:
yiibuild.com/index.php?r=profile/update

Ketika Anda melihat tampilan halaman ini, Anda akan melihat bahwa ada banyak masalah. Bidang
seperti created_at muncul sebagai bidang teks dan mengembalikan nomor gender.

Tentu saja jika Anda mencoba url ini tanpa membuat profil, Anda akan mendapatkan hasil yang
kosong. Anda dapat membuat profil dengan memaksa jalan Anda, tapi ini bukan apa yang ingin Anda
lakukan. Kami memiliki banyak pekerjaan yang harus dilakukan sebelum UI ini siap.

Juga, karena kita belum dihubungkan bersama-sama navigasi kanan, form tidak tahu apa pengguna
adalah pengguna yang tepat untuk mengasosiasikan dengan profil. Memasuki manual bahwa
mengekspos pertanyaan keamanan dan manipulasi url, karena bahkan jika Anda mengasosiasikan
catatan yang tepat secara manual, Anda harus mencegah pengguna dari catatan pembajakan
mereka tidak sendiri.

Kita perlu melakukan sedikit pekerjaan pada controller dan views untuk mendapatkan apa yang kita
butuhkan, generasi kode hanya pergi sejauh ini.

Kabar baiknya adalah bahwa bahkan dalam segala keadaan dalam, Gii telah memberikan kita dengan
banyak dari apa yang akan kita butuhkan. Hal ini juga telah memberi kita sebuah arsitektur yang
mudah tindak itu, yang, dengan beberapa modifikasi pada bagian kami, akan membuat template
yang kuat untuk catatan-pengguna yang dimiliki.

Jadi, untuk aplikasi apa pun kebutuhan Anda memiliki di masa depan, ketika melibatkan rekor
pengguna yang dimiliki, seperti profil, preferensi, blog, dll, Anda akan memiliki contoh kerja yang
mudah direplikasi. Dan setelah Anda masuk ke ritme ini, Anda akan kagum pada cara mengalir.

Dengan memulai dengan catatan pengguna yang dimiliki seperti profil, kami menciptakan sebuah
struktur yang Gii tidak menyerahkan kepada kami dalam kondisi sempurna, itu kabar buruk. Kabar
baiknya adalah bahwa ketika kita membangun versi backend profil, untuk membantu admin
mengelola profil, itu adalah lebih dekat fit untuk pelat boiler, sehingga hal-hal akan menjadi semakin
lebih mudah seperti yang kita inginkan.

Modifying Profile Controller & Views


Ok, mari kita memenuhi kebutuhan kita. Kita bisa membuat profil bagi pengguna, tetapi bentuk tidak
terlihat benar dan tidak ada navigasi untuk itu. Juga, tidak ada kontrol akses atas CRUD, sehingga
profil pengguna, yang harus pribadi, terbuka lebar dan dapat dimanipulasi oleh siapapun.

Kita akan melakukan hal berikut untuk memperbaiki ini:

1. Kami akan memodifikasi controller akses kontrol untuk tindakan CRUD. Misalnya, hanya
pengguna yang memiliki catatan profil harus dapat view, create, update atau delete catatan
profil.
2. Kami akan memodifikasi tampilan, sehingga mereka memiliki daftar dropdown mana yang
sesuai. Kami akan menghapus bidang yang tidak perlu juga. Kami akan membawa nama yang
tepat untuk gender bukan hanya daftar nomor id.
3. Kami akan memodifikasi tampilan layout utama kami sehingga kami memiliki navigasi untuk
profil pengguna.

Ketika kita sudah selesai dengan bagian ini, template yang Yii2build kami akan mengambil langkah
besar ke depan.

Keluar dari kotak, pengguna dapat mendaftar dan login ke aplikasi. Kami telah memperpanjang
Template Aplikasi Advanced untuk menghormati perbedaan antara tingkat peran untuk frontend
dan backend, sehingga hanya pengguna dengan tingkat peran minimal admin dapat login ke
backend.

Tip
Hanya demi kejelasan, saya akan menyebutkan bahwa CRUD profil frontend tidak ada
hubungannya dengan backend dan tidak akan muncul di sana. Kami akan membangun
itu secara terpisah ketika kita membuat admin area backend.

Dengan membangun Model profil frontend berfungsi penuh kami, pengguna akan diminta untuk log
in untuk membangun profil. Aplikasi ini akan tahu apakah mereka sudah memiliki profil, dan jika
tidak, ketika mereka mengklik pada link profil, akan membawa mereka ke profil membuat halaman.
Aplikasi ini juga akan menegakkan aturan untuk memastikan pengguna hanya dapat mengakses
profil mereka sendiri. Kami juga akan menyediakan navigasi di halaman tampilan yang tahu kapan
saat yang tepat untuk menunjukkan link profil.

Jadi ketika kita sudah selesai dengan ini bagian dari proyek, kita akan memiliki template yang ketat
dan contoh untuk mengikuti jika kita ingin membuat jenis lain dari catatan-friendly milik yang harus
tetap pribadi ke pengguna. Ini adalah hal yang baik.

Modifying the Profile Controller


Kita harus mulai dengan memasukkan beberapa laporan penggunaan yang lebih, sehingga copy ini
lebih laporan penggunaan yang ada di bagian atas file ProfileController.php:

namespace frontend\controllers;
use Yii;
use frontend\models\Profile;
use frontend\models\search\ProfileSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use common\models\PermissionHelpers;
use common\models\RecordHelpers;

Hal ini membuat referensi untuk kami kelas RecordHelpers dan PermissionHelpers kami yang kami
tulis dalam bab sebelumnya.

Saat ini, metode perilaku hanya memiliki pembatasan delete yang mengatakan itu harus dilakukan
dengan metode post:

public function behaviors()


{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}

Kami ingin menambahkan beberapa akses dasar kontrol logika yang membatasi pengguna dari
tindakan pada controller ini kecuali mereka login Jadi mengubah perilaku ini:

public function behaviors()


{
return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['index', 'view','create', 'update', 'delete'],
'rules' => [
[
'actions' => ['index', 'view','create', 'update', 'delete'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}

Simbol @ berarti login, sehingga tindakan yang terdaftar hanya dapat dilakukan bila pengguna yang
login. Itu tidak benar-benar akses kontrol yang cukup, tapi itu mulai. Kami akan melakukan lagi nanti.

Harap dicatat bahwa peran dalam hal ini tidak merujuk ke kolom role_id pada catatan pengguna,
dua tidak ada hubungannya dengan satu sama lain.

Index Action
Ok, sekarang kita siap untuk tindakan. Aksi Indeks, yang merupakan aksi default controller, terlihat
seperti ini:

/**
* Lists all Profile models.
* @return mixed
*/
public function actionIndex()
{
$searchModel = new ProfileSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}

Hal ini dimaksudkan untuk mengembalikan daftar hasil dan menggunakan model yang berbeda,
ProfileSearch, yang membentang model profil untuk menyediakan fungsi pencarian. Tapi dalam
kasus profil pengguna kami, kami hanya mengizinkan satu profil per pengguna, jadi kami tidak akan
menggunakan kode ini.

Kami hanya bisa menonaktifkan tindakan ini, hentikan itu dari controller sepenuhnya, dan
menghapus file index.php, tetapi beberapa navigasi yang dibangun ke Yii 2 kemudian akan kembali
pengecualian halaman tidak ditemukan dan yang tidak perilaku kita inginkan. Juga, seseorang bisa
ketik r=profil ke url dan itu akan kembali halaman yang sama tidak ditemukan kesalahan, lagi
perilaku kita tidak ingin. Kami ingin semua navigasi kami super ketat, jadi bukan kami akan
mengarahkan Index.php ke view.php.

View.php, jika Anda ingat, daftar rincian dari catatan, dan ini akan sesuai bagi seseorang yang ingin
melihat profil mereka sendiri.

Tentu saja itu tidak sesederhana mengarahkan. Kami juga harus menerapkan logika pengendalian
yang menentukan apakah pengguna yang sesuai memiliki profil, jika demikian, menunjukkan kepada
mereka, dan jika tidak, mengirim mereka ke halaman Buat.

Jadi mari kita mengganti metode actionIndex dengan berikut:

public function actionIndex()


{
if ($already_exists = RecordHelpers::userHas('profile')) {
return $this->render('view', [
'model' => $this->findModel($already_exists),
]);
} else {
return $this->redirect(['create']);
}
}

Baris pertama harus terlihat sedikit akrab bagi Anda. Kami berbicara tentang melakukan sesuatu
seperti ini ketika kita membangun RecordHelpers metode userHas. Sekarang kita siap untuk
menggunakannya.

Hanya pengingat cepat, userHas metode pemeriksaan untuk catatan pengguna pada model yang
disediakan, sehingga dalam hal ini kita memeriksa untuk melihat apakah pengguna memiliki catatan
profil. Jika tidak ada catatan, ia mengembalikan palsu, jika benar, ia mengembalikan id dari catatan.

Mari menjelaskan dengan tepat bagaimana ini bekerja. Hal pertama yang kita lakukan adalah
memanggil metode userHas dari kelas RecordHelpers dan pengaturan hasil untuk already_exists, jika
dibungkus dalam sebuah pernyataan.
Jadi jika userHas mengevaluasi benar, ia kembali ke file view, dengan model contoh yang benar
diadakan dalam variabel $already_exists.

Ia kemudian menggunakan metode controller findModel untuk kembali contoh bahwa untuk
pandangan, dalam hal ini itu bernama view.php, seperti yang diteruskan dalam array:
'model' => $this->findModel($already_exists),

Sekarang jika $already_exists mengevaluasi palsu, kita redirect ke membuat tampilan, karena
pengguna tidak memiliki profil, dan mereka perlu membuat satu:

} else {
return $this->redirect(['create']);
}

Dengan mengambil upaya ekstra untuk menciptakan kelas pembantu, kita diekstraksi beberapa
logika yang membuat sederhana controller dan bersih. Jika kita ingin menggunakan sintaks
hubungan Yii dalam membuat jika kondisi, kita mungkin menulis:
if($already_exists = Profile::find()->where(['user_id' => Yii::$app->user->identity->id])->one())

Secara pribadi, saya suka sintaks ini lebih baik:


if ($already_exists = RecordHelpers::userHas('profile'))

Hal ini mungkin tampak seperti perbedaan sepele, tapi kami memiliki potensi untuk menggunakan
sintaks ini di banyak tempat di proyek. Kita dapat menggunakannya pada model lain hanya dengan
menyerahkan dalam nama model yang berbeda.

Robert C. Martin menulis sebuah buku yang sangat bagus yang disebut Clean Code. Dia membuat
titik bahwa programmer menghabiskan sebagian besar waktu mereka membaca kode, tidak menulis
itu. Jadi sedikit perbedaan sintaksis yang membuat kode lebih mudah dibaca, ketika skala di atas
sebuah proyek besar, membuat perbedaan besar dalam kecepatan dan kejelasan mereka yang harus
bekerja pada sistem.

Perubahan besar lain dalam cara kita membangun metode controller kita adalah bahwa kita
menghilangkan mendapatkan variabel yang diserahkan ke metode, sehingga catatan id tidak dapat
dibajak melalui browser. Ini menambahkan lapisan keamanan tambahan ke sistem. Kami akan
menambahkan lebih banyak keamanan kemudian.

Sekarang kita mengerti cara RecordHelpers::userHas('profil') memeriksa hubungan antara pengguna


dan catatan profil, kami siap untuk melangkah melalui sisa tindakan.

View Action
Ini adalah aksi view:

/**
* Displays a single Profile model.
* @param string $id
* @return mixed
*/
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}

Rubah menjadi:

public function actionView()


{
if ($already_exists = RecordHelpers::userHas('profile')) {
return $this->render('view', [
'model' => $this->findModel($already_exists),
]);
} else {
return $this->redirect(['create']);
}
}

Hei, itu persis sama dengan tindakan indeks, ada apa dengan itu? Ingat kita mengatakan bahwa kita
sedang mengubah tindakan indeks standar untuk menjadi sama dengan tindakan lihat karena kita
tidak perlu daftar profil, hanya profil yang benar bagi pengguna atau membuat form jika mereka
tidak memiliki satu. Jadi Anda tertangkap istirahat di sana dan kami hanya disalin kode.

Create Action
Ok, pada Create tindakan. Inilah yang Anda keluar dari kotak:

public function actionCreate()


{
$model = new Profile();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view'', 'id' => $model->id]); } else {
return $this->render('create', [
'model' => $model,
]);
}
}

Pada dasarnya ini mengatakan jika bentuk dimuat, simpan dan pergi untuk melihat atau
menampilkan membuat formulir. Nah, kami memiliki sedikit lebih untuk versi kita ini:

public function actionCreate()


{
$model = new Profile;
$model->user_id = \Yii::$app->user->identity->id;
if ($already_exists = RecordHelpers::userHas('profile')) {
return $this->render('view', [
'model' => $this->findModel($already_exists),
]);
} elseif ($model->load(Yii::$app->request->post()) && $model->save()){
return $this->redirect(['view']);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}

Kita mulai dengan memanggil contoh baru dari model, maka kita menetapkan atribut user_id model
untuk pengguna saat melalui Yii::$app->user->identity-> id. Seperti yang sudah saya katakan
sebelumnya, user id saat selalu tersedia bagi kita melalui panggilan statis ini dari aplikasi kelas Yii.

Selanjutnya kita periksa untuk melihat apakah pengguna sudah memiliki profil dengan menjalankan
RecordHelpers::userHas('profil') metode dan pengaturan hasil untuk$ already_exists.

if ($already_exists = RecordHelpers::userHas('profile')) {
return $this->render('view', [
'model' => $this->findModel($already_exists),
]);
}

Jika kita mendapatkan id model di respon, kita menunjukkan file view id itu. Kita perlu
menempatkan tes ini pada metode ini karena pengguna mungkin dapat menavigasi langsung ke
membuat tindakan, tanpa pergi ke indeks atau pandangan pertama.

Jika $already_exists mengevaluasi palsu, hal berikutnya kode dilakukan adalah memanggil metode
beban dari data pos dan mencoba untuk menyimpannya:

elseif ($model->load(Yii::$app->request->post()) && $model->save()) {


return $this->redirect(['view']);
}

Tapi ini hanya akan terjadi jika metode beban telah menerima data dari formulir yang telah
diposting. Jika menerima dan dapat memvalidasi, itu akan menyimpan dan kemudian kembali sesuai
tampilan halaman.

Anda mungkin bertanya-tanya bagaimana ia tahu apa yang user_id untuk menetapkan dalam
catatan yang baru dibuat, karena kita tidak menetapkan itu pada formulir, yang berarti itu tidak
disahkan dalam melalui pos. Ini akan diatur pada baris kedua dari metode tindakan ketika kita
menetapkan bahwa $model->user_id untuk pengguna saat ini. Dan ketika $model memanggil
metode beban, ia mengingat atribut ini.

Terakhir, jika tidak ada data pos atau jika ada kesalahan validasi, kita menunjukkan bentuk:

else {
return $this->render('create', [
'model' => $model,
]);
}

Update Action
Selanjutnya kita beralih ke metode actionUpdate. Berikut adalah apa yang Gii memberi kami:

/**
* Updates an existing Profile model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param string $id
* @return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}

Kita modifikasi menjadi seperti ini:

/**
* Updates an existing Profile model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param string $id
* @return mixed
*if statement in two lines due to avoid wordwrap
*/
public function actionUpdate()
{
if($model = Profile::find()->where(['user_id' =>
Yii::$app->user->identity->id])->one()) {
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view']);
} else {
return $this->render('update', [
'model' => $model,
]);
}
} else {
throw new NotFoundHttpException('No Such Profile.');
}
}

Segera kami melihat sesuatu yang berbeda karena saya menggunakan:


if($model = Profile::find()->where(['user_id' => Yii::$app->user->identity->id])->one())

Saya melakukan itu karena saya merasa bahwa karena nama variabel adalah $model, itu sedikit lebih
sintaksis logis untuk mengikuti dengan nama model kita tertarik, bukan kelas pembantu:
if($model = RecordHelpers::userHas('profile'))

sintaks lagi hanya tampaknya jelas bahwa kita sedang mencari catatan profil yang cocok dengan
pengguna saat ini. Ok, jadi sekarang kita tahu mengapa kita menggunakan:
if($model = Profile::find()->where(['user_id' => Yii::$app->user->identity->id])->one())
Jadi, mari kita istirahat yang turun. Mengatur contoh model Profil, dimana user_id adalah pengguna
saat ini ke variabel $model, jika Anda bisa. Jika mengevaluasi palsu, kita melompat ke lain
pernyataan terakhir dan membuang:

throw new NotFoundHttpException('No Such Profile.');

Jika tidak, jika kita mendapatkan variabel $model kita set dengan contoh yang benar dari model, kita
sebut data dari bentuk pos dan mencoba untuk menyimpannya melalui berikutnya jika pernyataan.

if ($model->load(Yii::$app->request->post()) && $model->save()) {


return $this->redirect(['view']);
}

Jika update berhasil, bagaimana cara mengetahui yang melihat untuk menampilkan? Metode
redirect, yang dalam hal ini hanya diberikan dengan tindakan, tidak render. Hal ini routing untuk
tindakan bernama controller saat ini, sehingga dalam hal ini, tindakan pandangan akan menentukan
pandangan benar untuk menampilkan.

Tentu saja, ini juga mengasumsikan ada data posting.

Jika tidak ada data post, tidak ada perubahan dari apa yang sudah ada, maka akan kembali ke
bentuk, dengan model kita menyerahkan sehingga dapat pra-mengisi dengan benar.

else {
return $this->render('update', [
'model' => $model,
]);
}

Sekali lagi, tidak ada mendapatkan variabel yang digunakan, sehingga tidak akan ada pembajakan
catatan dari mendapatkan variabel.

Delete Action
Perubahan akhir kami ke ProfileController akan pada tindakan delete. Kami mendapat ini dari Gii:

public function actionDelete($id)


{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}

Rubah menjadi:

public function actionDelete()


{
$model = Profile::find()->where(['user_id' => Yii::$app->user->id])->one();
$this->findModel($model->id)->delete();
return $this->redirect(['site/index']);
}

Di sini kita mengatur $model menggunakan metode yang sama dari pembaruan untuk alasan yang
sama, karena kita tidak memiliki variabel get. Kemudian kita menggunakan metode delete,
menyerahkan di $model-> id.
Kemudian kita redirect ke halaman indeks situs. Jika kita hanya menempatkan 'indeks' sebagai nilai,
controller akan menganggap itu adalah 'profile/index', yang tidak apa yang kita inginkan.

FindModel Action
Metode terakhir di Profil controller, kita tidak rubah:

protected function findModel($id)


{
if (($model = Profile::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}

Ini adalah metode untuk menemukan contoh khusus dari model. Tangan Anda di $id Anda cari dan
Yii kembali bahwa contoh dari model, memang metode yang sangat berguna.

Satu hal yang kita bisa menghargai tentang Yii 2 adalah kode controller sangat bersih, jelas dan
ringkas. Semua angkat berat adalah disarikan keluar dan kami hanya menyediakan satu set kecil
instruksi untuk tindakan untuk mengikuti. Ini adalah PHP yang modern yang terbaik.

Modifying the Profile Views


Profil fungsi controller kita seperti yang kita inginkan, tapi kami memiliki bentuk bidang tanggal yang
kita tidak perlu dan masukan teks bukan dropdown, jadi mari kita pergi melalui views kita dan
memperbaikinya.

View.php
Ok, mari kita mulai dengan view.php. Berikut adalah apa yang kita dapatkan dari Gii:

<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
/* @var $this yii\web\View */
/* @var $model frontend\models\Profile */
$this->title = $model->id;
$this->params['breadcrumbs'][] = ['label' => 'Profiles', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="profile-view">
<h1><?= Html::encode($this->title) ?> Profile</h1>
<p>
<?= Html::a('Update', ['update', 'id' => $model->id],
['class' => 'btn btn-primary']) ?>
<?= Html::a('Delete', ['delete', 'id' => $model->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => 'Are you sure you want to delete this item?',
'method' => 'post',
],
]) ?>
</p>
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'user_id',
'first_name:ntext',
'last_name:ntext',
'birthdate',
'gender_id',
'created_at',
'updated_at',
],
]) ?>
</div>

Ok, mari kita mulai dengan view.php. Berikut adalah apa yang kita dapatkan dari Gii:

use yii\helpers\Html;
use yii\widgets\DetailView;

Ini akan menjadi pertama kami melihat secara mendalam pada widget DetailView, yang akan kita
lihat dalam satu menit. Berikutnya kami memiliki beberapa komentar dari Yii, $this adalah view
model, dan $model adalah model profil yang telah diserahkan melalui controller, sehingga
merupakan contoh yang tepat dari model profil yang kita butuhkan.

/* @var $this yii\web\View */


/* @var $model frontend\models\Profile */

Anda selalu dapat merujuk kepada orang-komentar jika Anda bingung tentang yang variabel
merupakan yang model.

Selanjutnya kita mengatur judul dengan $model->id:


$this->title = $model->id;

Kemudian breadcrumbs yang sederhana bagus untuk menggunakan format:

$this->params['breadcrumbs'][] = ['label' => 'Profiles', 'url' => ['index']];


$this->params['breadcrumbs'][] = $this->title;

$this->params berasal dari kelas pandangan dasar. Ketika Anda membuat tampilan, dalam hal ini,
view.php, Anda menelepon sebuah contoh dari yii\webView, yang memperpanjang yii\base\ view
class, dan melalui keajaiban routing Yii 2, membuat objek tersedia sebagai $this, maka komentar:
/* @var $this yii\web\View */

Ini adalah arsitektur yang sangat kuat. Anda juga tangan dalam model atau model melalui controller
juga, sehingga Anda memiliki banyak kemampuan untuk memanipulasi data dalam pandangan. Yii 2
melakukan semua ini, dan pada saat yang sama, membuatnya tampak sederhana, menjaga sebanyak
PHP coding dan logika dari pandangan mungkin.

Ok, pindah. Ketika kita menetapkan div, h1, dan beberapa nav:

<div class="profile-view">
<h1><?= Html::encode($this->title) ?> Profile</h1>
<p>
<?= Html::a('Update', ['update', 'id' => $model->id],
['class' => 'btn btn-primary']) ?>
<?= Html::a('Delete', ['delete', 'id' => $model->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => 'Are you sure you want to delete this item?',
'method' => 'post',
],
]) ?>
</p>

Tombol Delete gaya yang btn btn-danger dan tangan Anda dalam parameter data tambahan dari
konfirmasi dan metode. Hal ini menghasilkan peringatan konfirmasi, cukup berguna untuk fungsi
delete dan itu membuat untuk UI besar, tepat di luar kotak.

Akhirnya kami memiliki widget detailview:

<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'user_id',
'first_name:ntext',
'last_name:ntext',
'birthdate',
'gender_id',
'created_at',
'updated_at',
],
]) ?>
</div>

Anda dapat dengan mudah menambah atau mengurangi atribut dan kami akan menunjukkan
dengan contoh. Mari kita pergi ke depan dan mengganti seluruh file tampilan dengan:

<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
use common\models\PermissionHelpers;
/**
* @var yii\web\View $this
* @var app\models\Profile $model
*/
$this->title = $model->user->username . "'s Profile";
$this->params['breadcrumbs'][] = ['label' => 'Profiles', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="profile-view">
<h1><?= Html::encode($this->title) ?></h1>
<p>
<?Php
//this is not necessary but in here as example
if (PermissionHelpers::userMustBeOwner('profile', $model->id)) {
echo Html::a('Update', ['update', 'id' => $model->id],
['class' => 'btn btn-primary']);
} ?>
<?= Html::a('Delete', ['delete', 'id' => $model->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('app', 'Are you sure to delete this item?'),
'method' => 'post',
],
]) ?>
</p>
<?= DetailView::widget([
'model' => $model,
'attributes' => [
//'id',
'user.username',
'first_name',
'last_name',
'birthdate',
'gender.gender_name',
'created_at',
'updated_at',
//'user_id',
],
]) ?>
</div>

Sekarang mari kita melangkah melalui perubahan. Untuk memulai, kami membuat beberapa
perubahan kosmetik untuk judul untuk menampilkan nama pengguna, yang sepele, dan kami
berhenti pernyataan penggunaan tambahan:
use common\models\PermissionHelpers;

Ini akan memberi kita akses ke metode PermissionHelpers::userMustBeOwner(). Ini adalah salah
satu metode pembantu kita buat kembali bab Helpers, yang mengembalikan benar atau salah untuk
menentukan apakah pengguna saat ini adalah pemilik dari catatan.

Kami akan menggunakan userMustBeOwner(), untuk menempatkan lapisan tambahan keamanan


navigasi kami di frontend\views\profile\views.php. Dalam hal ini, kami membungkus metode dalam
sebuah pernyataan jika, dan jika benar, kami menampilkan navigasi:

<p>
<?Php
//this is not necessary but in here as example
if(PermissionHelpers::userMustBeOwner( 'profile', $model->id)) {
echo Html::a('Update', ['update', 'id' => $model->id],
['class' => 'btn btn-primary']);
} ?>
Metode userMustBeOwner() mengambil 2 argumen, pertama, nama model menyerahkan sebagai
string, kedua, id dari model contoh, tersedia bagi kita sebagai $model->id karena kami mengirim
model contoh untuk melihat melalui controller.

Sebagai komentar dalam kode menunjukkan, tes ini pada pengguna tidak benar-benar diperlukan
karena untuk profile/view, Anda tidak bisa mendapatkan ke halaman tampilan tanpa pemilik catatan
dan tindakan pembaruan juga tes untuk membatasi akses ke pemilik saja.

Saya termasuk ini di sini hanya sebagai contoh untuk kasus-kasus di mana Anda mungkin memiliki
pandangan catatan dilihat oleh semua pengguna, tetapi tindakan seperti pembaruan hanya tersedia
untuk pemilik rekor dan dalam kasus-kasus, Anda hanya ingin link untuk memperbarui terlihat
pemilik rekor. Sebuah blog di mana penulis dapat memperbarui posting mereka, tapi pengguna lain
hanya dapat membacanya akan menjadi contoh dari hal ini.

Aku bisa melakukan tes yang sama pada link delete, tapi sekali lagi, tidak diperlukan, karena tes
controller untuk pemilik dan hanya pemilik rekor bisa berada di halaman tampilan di mana nav ini
berada.

Akhirnya, kami memiliki beberapa perubahan pada widget DetailView

<?= DetailView::widget([
'model' => $model,
'attributes' => [
//'id',
'user.username',
'first_name',
'last_name',
'birthdate',
'gender.gender_name',
'created_at',
'updated_at',
//'user_id',
],
]) ?>

Kami komentar "id" dan bidang "user_id" karena angka-angka ini tidak akan berarti apa-apa kepada
pengguna akhir. Sebaliknya kita muncul di user.username dan gender.gender_name. Kita mengakses
properti ini melalui hubungan malas-loaded dan itu adalah sintaks untuk itu. Cukup sederhana kan?

Sebentar menyentuh pada apa malas beban berarti, itu berarti bahwa akan ada permintaan untuk
setiap baris, dalam hal ini 2 pertanyaan terpisah. Itu mungkin baik pada halaman seperti ini yang
memiliki sejumlah kecil pertanyaan. Untuk daftar besar dengan beberapa pertanyaan, itu akan
sangat tidak efisien dan kita perlu menggunakan eager loading dalam kasus-kasus, dan kami akan
menunjukkan cara untuk melakukan itu ketika kita berhadapan dengan hasil orang-orang.

Kita perlu melakukan pekerjaan rumah tangga sedikit pada model Gender dan Pengguna dalam hal
atribut label, sehingga mereka menampilkan apa yang kita inginkan benar pada halaman. Dan
karena kami mengambil waktu untuk memperbarui model-model, kita juga menambahkan bahwa
hubungan kita akan membutuhkan dalam waktu dekat untuk model User, sementara kami bekerja
pada file tersebut.
Gender
Jadi mari kita mulai dengan sederhana, Gender.php terletak di frontend\models.

Kami memiliki satu perubahan hanya untuk label atribut:

public function attributeLabels()


{
return [
'id' => 'ID',
'gender_name' => 'Gender Name',
];
}

Rubah menjadi:

public function attributeLabels()


{
return [
'id' => 'ID',
'gender_name' => 'Gender',
];
}

Setelah Anda menyimpan perubahan, memukul refresh pada yiibuild.com/index.php?r=profile/view


dan Anda akan melihat bahwa label untuk jenis kelamin telah berubah dari Gender Name ke Gender,
yang akan lebih masuk akal untuk pengguna dan ramah UI.

Itu label satu atribut aku pergi untuk bekerja pada saat kita membangun model-model baru di Model
Baru bab. Semua yang lain, kita sudah memiliki di tempat, serta semua hubungan tambahan.

Anda dapat melihat kami menempatkan label-label lain bersama-sama di luar alur kerja normal,
kalau tidak kita akan terpental sekitar antara model dan tampilan. Saya pikir itu lebih baik untuk
menjaga fokus ketat pada satu hal pada suatu waktu, sehingga orang-orang yang baru untuk
kerangka, akan mampu menyerap informasi lebih mudah.

Form Partial
Ok, selanjutnya kita akan memodifikasi _form.php, yang merupakan parsial. Sebuah parsial, yang
pada Yii 2 ditunjuk oleh undescore di depan nama file, merupakan pandangan akan dimasukkan ke
tampilan lain, dalam hal ini melalui:
<?= $this->render('_form', [ 'model' => $model, ])?>

Melalui keajaiban routing dan struktur file Yii 2, itu tahu yang _form Anda maksud. Hal ini membuat
kode sangat ringkas. Mari kita lihat bagaimana kami menggunakannya.

Kode di atas disebut di update.php, misalnya. Ini adalah waktu yang tepat untuk menyebutkan
bahwa _form.php yang lebih sederhana dari kontak yang kita lihat di awal.

Misalnya, dalam hal ini, karena kami hanya melakukan tindakan CRUD lurus, kita tidak perlu model
bentuk terpisah. Kita bahkan tidak perlu menentukan model bentuk sama sekali karena sekali lagi Yii
2 tahu dari struktur file, dan dari model yang diserahkan ke tampilan dari controller, model mana
untuk memperbarui. Ini sangat keren dan menghemat banyak waktu.
Jadi untuk menciptakan lurus, memperbarui, menghapus, Anda biasanya tidak perlu model bentuk
terpisah. Hanya ketika ada beberapa validasi rumit atau proccesses lainnya akan Anda
membutuhkan model bentuk.

Dengan contoh kita di sini, update.php, $model adalah model Profile.

Ok, mari kita kembali ke _form tersebut. Ini adalah apa yang Gii memberi kami pada boilerplate:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model frontend\models\Profile */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="profile-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'user_id')->textInput(['maxlength' => 11]) ?>
<?= $form->field($model, 'first_name')->textarea(['rows' => 6]) ?>
<?= $form->field($model, 'last_name')->textarea(['rows' => 6]) ?>
<?= $form->field($model, 'birthdate')->textInput() ?>
<?= $form->field($model, 'gender_id')->textInput(['maxlength' => 10]) ?>
<?= $form->field($model, 'created_at')->textInput() ?>
<?= $form->field($model, 'updated_at')->textInput() ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' =>
$model->isNewRecord ? 'btn btn-success' : 'btn btn-primary'])
?>
</div>
<?php ActiveForm::end(); ?>
</div>

Ini adalah kode singkat bagus dan Anda harus mencintai kerangka untuk itu. Tapi ada beberapa hal
yang tidak kita butuhkan. Pengguna id tidak perlu ditampilkan dalam bentuk, sudah diatur pada
model di controller, sehingga akan disimpan dengan benar tanpa bentuk masukan. Kami juga dapat
menghapus kolom untuk created_at dan updated_at seperti yang kita telah menambahkan perilaku
pada model Profil yang secara otomatis memasukkan mereka bagi kita.

Lalu kami memiliki hanya 2 perubahan lain, kita akan menggunakan widget datepicker untuk tanggal.
dan membuat daftar dropdown untuk Gender. Berikut adalah apa yang seluruh file akan terlihat
seperti:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\jui\DatePicker;
/**
* @var yii\web\View $this
* @var app\models\Profile $model
* @var yii\widgets\ActiveForm $form
*/
?>
<div class="profile-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'first_name')->textInput(['maxlength' => 45]) ?>
<?= $form->field($model, 'last_name')->textInput(['maxlength' => 45]) ?>
<br/>
<?php echo $form->field($model,'birthdate')->widget(DatePicker::className(),
['clientOptions' => ['dateFormat' => 'yy-mm-dd']]); ?>
<br/>
<?= $form->field($model, 'gender_id')->dropDownList($model->genderList,
['prompt' => 'Please Choose One' ]);?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update',
['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

Perhatikan bahwa <?= Adalah pernyataan singkat untuk <?Php echo. Setiap bentuk field mendapat
baris terpisah dan Anda dapat melihat bagaimana kami melakukannya di atas. Juga perhatikan
DatePicker widget konfigurasi untuk bidang lahir.

DatePicker
Mari kita pastikan kita ingat untuk menyertakan pernyataan penggunaan:
use yii\jui\DatePicker;

Ini adalah perpustakaan pihak ke-3 yang tidak termasuk dalam basis menginstal Yii. Ketika kita
diperbarui komposer untuk memastikan kami memiliki Gii, kami seharusnya juga menginstal
perpustakaan jui. Kamu harus punya:
"yiisoft/yii2-jui": "*"

File composer.json Anda di yiibuild akan terlihat seperti berikut:

"require-dev": {
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*",
"yiisoft/yii2-jui": "*"
},

Anda dapat melihat baris terakhir kami menambahkan "yiisoft/yii2-jui": "*" Jangan lupa koma pada
baris sebelumnya.

Kalau itu tidak ada, maka Anda tidak memilikinya, sehingga Anda perlu menambahkan baris yang
sekarang. Lalu pergi ke baris perintah Anda dan ketik:
\var\www\yiibuild>composer update

Ini akan membawa dependensi yii2-jui. Jadi sekarang kita ditetapkan untuk menggunakannya. Jika
semua berjalan dengan baik, Anda sekarang harus melihat perbedaan update Anda dan menciptakan
bentuk dari Profil Anda.
Namun, dan aku benci untuk melempar dalam kerut pertengahan pembangunan, tetapi sampai
tulisan ini, widget DatePicker tidak bekerja dengan benar. Ini bukan berarti bahwa biasa bagi Anda
untuk menghadapi masalah seperti itu. Masalahnya bermuara pada fakta widget tidak menghormati
format tanggal dan format default menggunakan tidak akan lulus validasi. Jadi pada dasarnya,
memperbarui dan menciptakan mati sampai kita memperbaikinya.

Sekarang kita hanya bisa memiliki kolom input teks biasa dan tetap dalam sebuah catatan
memberitahu orang-orang format apa yang kita inginkan, tapi itu tampaknya begitu bawah standar
dengan indah Bootstrap tampilan dan merasa kami telah pergi, aku memutuskan untuk mengatasi
masalah tersebut.

Pada dasarnya, saya perlu mencari tahu bagaimana untuk mendapatkan validasi untuk lulus. Format
tanggal default widget adalah:
MMM d, Y

Ini berarti seperti Oct 14, 2014

Format yang kita butuhkan untuk datetime di Myslq adalah:


Y-m-d

Yang berarti seperti 2014-10-14

Jadi jelas masalah konversi. Saya memutuskan untuk menyelesaikannya dengan menciptakan
metode validasi sebelum pada Profil Model. Yii 2 memiliki metode yang benar-benar berguna ini
bernama beforeValidate, dan secara otomatis akan disebut selama metode panggilan kelas induk.
Berikut adalah kode saya:

public function beforeValidate()


{
if ($this->birthdate != null) {
$new_date_format = date('Y-m-d', strtotime($this->birthdate));
$this->birthdate = $new_date_format;
}
return parent::beforeValidate();
}

Jadi jika atribut tanggal lahir tidak kosong, mengambil $this contoh dari tanggal lahir dan format itu
menggunakan:
date('Y-m-d', strtotime($this->birthdate))

Mereka adalah dua fungsi built-in PHP ada, tanggal dan strtotime. Aku benar-benar ingin
menggunakan DateTime kelas PHP, tapi Yii 2 tidak akan instantiate itu, jadi saya menggunakan
metode strtotime tua.

Lagi pula, maka kita menetapkan $this->birthdate ke $new_date_format, yang sekarang memegang
lahir yang diserahkan, dalam format tanggal yang benar.

Kemudian kami kembali Parent::beforeValidate(); untuk memastikan metode dipanggil dan hanya
itu.

Ini benar-benar berubah menjadi plus karena sekarang pengguna dapat memasukkan format tanggal
yang lebih valid ke dalam formulir dan akan mengkonversi sebelum memvalidasi. Trade off adalah
mereka juga dapat memasukkan omong kosong, dan itu akan mendapatkan set untuk tanggal pada
tahun 1970. Tapi aku bisa hidup dengan perdagangan yang turun di titik ini karena itu adalah pilihan
yang paling fleksibel tersedia bagi saya, dan saya tidak berpikir semua orang ingin dilahirkan pada
tahun 1970. di beberapa titik saya mungkin menulis aturan validasi lebih lanjut untuk menghilangkan
omong kosong, jika memungkinkan.

Pokoknya, menambahkan metode beforeValidate atas model Profil Anda dan akan memecahkan
masalah tanggal dan Anda dapat menggunakan datepicker cukup jui.

Kembali ke _form, kita harus memperhatikan bidang untuk gender_id:


<?= $form->field($model, 'gender_id')->dropDownList($model->genderList, [ 'prompt' =>
'Please Choose One' ]);?>

Dua hal yang perlu diperhatikan. Kami dimasukkan metode dropDownList menggunakan $model-
>genderList, yang menggunakan sihir mendapatkan, maka g huruf kecil di gender. Kita bisa
melakukan ini karena hubungan metode getGenderList yang ditambahkan ke Profil dalam bab
sebelumnya.

Kami juga menambahkan dalam parameter dalam sebuah array untuk cepat karena kita tidak ingin
daftar untuk default ke nilai pertama, yang adalah apa yang akan dilakukan jika prompt tidak ada di
sana.

Sekarang ke sisa perubahan pandangan kecil yang kita miliki dalam pikiran untuk frontend Profil
dilihat.

Create
Buka create.php:

Dan rubah pada baris


$this->params['breadcrumbs'][] = ['label' => 'Profiles', 'url' => ['index']];

Menjadi:

$this->params['breadcrumbs'][] = ['label' => 'Profile', 'url' => ['index']];

Hanya membuang s pada profil disana.

Update
Sekarang ke update.php. Memotong keluar jalur breadcrumb 2 dan mengubah judul, sehingga
terlihat seperti ini:

<?php
use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model frontend\models\Profile */
$this->title = 'Update '. $model->user->username . "'s Profile ";
$this->params['breadcrumbs'][] = ['label' => 'Profile', 'url' => ['index']];
$this->params['breadcrumbs'][] = 'Update';
?>
<div class="profile-update">
<h1><?= Html::encode($this->title) ?></h1>
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>

Dan hanya untuk konsistensi, mari kita yang 's' keluar dari Profil kata pada breadcrumbs view.php
juga:

$this->params['breadcrumbs'][] = ['label' => 'Profile', 'url' => ['index']];


$this->params['breadcrumbs'][] = $this->title;

Yang membungkus up perubahan untuk Profil dilihat. Anda akan melihat bahwa kita tidak
memperbarui index.php atau _search.php. Kita tidak perlu file-file, mereka otomatis dihasilkan oleh
Gii. Alih-alih menyingkirkan mereka sekarang, kami akan menunggu sampai nanti dalam proyek
untuk menghapus karena jika kita mengubah pikiran kita dan ingin menggunakannya, kita memiliki
mereka dan tidak perlu menciptakan. Jika rasa alur kerja tersinggung dengan ini, maka jangan ragu
untuk menghapusnya sekarang.

Site Layout
Sudah waktunya kita memodifikasi tata letak situs untuk menyertakan link ke Profil di header. Kami
ingin link ini muncul di sebelah link logout, yang adalah apa yang muncul ketika Anda login. Jadi kita
perlu memodifikasi frontend\views\layout\main.php

Ini adalah di mana file tersebut berada. Ada yang serupa di backend, jadi pastikan Anda berada di
tempat yang tepat.

Ini adalah apa yang Anda dapatkan dari kotak dengan template advanced:

<?php
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use frontend\assets\AppAsset;
use frontend\widgets\Alert;
/* @var $this \yii\web\View */
/* @var $content string */
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
<meta charset="<?= Yii::$app->charset ?>"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class="wrap">
<?php
NavBar::begin([
'brandLabel' => 'My Company',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
$menuItems = [
['label' => 'Home', 'url' => ['/site/index']],
['label' => 'About', 'url' => ['/site/about']],
['label' => 'Contact', 'url' => ['/site/contact']],
];
if (Yii::$app->user->isGuest) {
$menuItems[] = ['label' => 'Signup', 'url' => ['/site/signup']];
$menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
} else {
$menuItems[] = [
'label' => 'Logout (' . Yii::$app->user->identity->username . ')',
'url' => ['/site/logout'],
'linkOptions' => ['data-method' => 'post']
];
}
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => $menuItems,
]);
NavBar::end();
?>
<div class="container">
<?= Breadcrumbs::widget([
'links' => isset($this->params['breadcrumbs']) ?
$this->params['breadcrumbs'] : [], ]) ?>
<?= Alert::widget() ?>
<?= $content ?>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-left">&copy; My Company <?= date('Y') ?></p>
<p class="pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

Ini adalah ringkas template yang bagus yang tidak sedikit. The AppAsset::register($this); menarik di
style sheet dan js. untuk template. Ini cara referensi aset app tidak aspek favorit saya dari kerangka,
tampaknya terlalu rumit.

Yii 2 menggunakan sistem penerbitan aset tembolok. Saya yakin ini melayani tujuan yang mulia,
namun itu tidak membuat lebih sulit untuk menangani struktural. Anda harus membayar perhatian
ke file konfigurasi Anda.

Kemudian dalam buku ini, kita akan menutupi menerapkan aset baru, tapi kami tidak akan pergi
terlalu dalam. Buku ini tidak benar-benar menutupi dekorasi fronted secara rinci.

Tapi kita bisa menghabiskan satu menit pada menjelaskan bagaimana tata letak bekerja. Jika Anda
melihat di body file, Anda akan melihat:
<?= $content ?>

Pernyataan agak mencolok menempatkan pandangan dalam tata letak. Mekanisme routing Yii 2 ini
tahu mana pandangan dan tata letak yang digunakan. Anda dapat menggunakan beberapa layout
dan tema dan topik ini mendapat jauh dengan cepat, tapi seperti saya katakan, kita hanya menutupi
permukaan. Anda dapat melihat bagian dekat bagian bawah adalah:
<footer class="footer">

Segala sesuatu di bawah yang ada di bagian footer.

Segala sesuatu di atas <?= $content ?> Akan di header.

Mari pop nama template kami ke dalam widget NavBar:

NavBar::begin([
'brandLabel' => 'Yii 2 Build',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
Profile Link
Jadi hal berikutnya kita akan lakukan adalah menambahkan link ke Profil. Sekarang, cara kita setup
Profil kontroler adalah bahwa tindakan indeks tes pertama untuk melihat apakah rekor ada. Dan jika
demikian, itu diarahkan ke halaman tampilan dan jika tidak, diarahkan ke membuat tampilan. Jadi
kita benar-benar hanya perlu satu link ke Profil dan meliputi segala sesuatu. Update dan menghapus
pandangan sudah terhubung dari dalam file view.php, sehingga tidak perlu membuat nav itu.

Apa yang kita ingin menguji bagaimanapun, adalah bahwa pengguna login. Kami tidak ingin
menunjukkan link profil jika pengguna belum login. Juga perhatikan, kita tidak perlu menyediakan
variabel get. Kami menghilangkan kebutuhan untuk itu dengan cara kita menulis logic controller.

Masukkan blok kode berikut setelah yang pertama $MenuItems Array:

if (!Yii::$app->user->isGuest) {
$menuItems[] = ['label' => 'Profile', 'url' => ['/profile/view']];
}

Jadi kita menggunakan Yii::$app->isGuest metode untuk menentukan apakah atau tidak pengguna
login, maka jika demikian, kita menunjukkan kepada mereka link profil. The $MenuItems Format
Array bekerja karena di antara NavBar::begin dan NavBar::end.

Summary

Jadi di sana Anda memilikinya, profil pengguna bekerja. Anda bisa klik pada link sekarang dan
menguji semua halaman. Anda dapat melihat kami akhirnya membuat lompatan dalam
pembangunan, tidak lagi terbatas hanya belajar tentang bagaimana segala sesuatu bekerja.

Anda melihat bahwa kita harus menggunakan kelas pembantu kami untuk membantu kami menguji
apakah atau tidak pengguna memiliki profil. Kami membangun pembantu kami di muka karena aku
menutupi konsep sebagai luar seluruh alur kerja. Ketika Anda mengembangkan aplikasi, Anda akan
memikirkan hal-hal seperti itu saat Anda pergi, yang baik-baik saja.

Anda juga harus melihat sejumlah besar efisiensi diserahkan kepada kami oleh Yii 2. Kita harus
menggunakan alat Gii, yang menyerahkan kami arsitektur siap pakai yang hanya membutuhkan
sedikit tweaking. Controller paling dibutuhkan kerja, tetapi hanya karena ini adalah pribadi, catatan-
pengguna yang dimiliki dan template diarahkan catatan publik. Ketika kita melakukan backend,
output Gii akan lebih cocok apa yang kita inginkan.
Dan akhirnya kita diubah pandangan kami, membuat aplikasi lebih intuitif. Dan segera kita
merasakan perbedaannya. Ini mulai datang bersama-sama.
Chapter Nine: Upgrade and Access Control
Kami ingin dapat mengelola konten pada aplikasi kita yang memerlukan upgrade. Jika Anda ingat,
pada PremissionHelpers::requireUpgradeTo($user_type_name) metode kami, kita menguji untuk
melihat apakah tipe user cocok dengan string menyerahkan tanda tangan, dan jika tidak,
mengarahkan mereka ke upgrade/index.'

Ini adalah sederhana untuk mengimplementasikan fitur jika Anda ingin membangun sebuah aplikasi
yang memiliki konten yang disediakan untuk anggota yang membayar. Tapi kita tidak bisa
menunjukkan ini sampai kita membangun controller upgrade dan file view terkait, jadi mari kita
melakukan itu sekarang.

Arahkan browser ker


http://www.yiibuild.com/index.php?r=gii

Mari kita menempatkan kontroler baru kami di frontend karena pengguna frontend kami akan
menjadi orang-orang yang membutuhkan untuk meng-upgrade. Jadi dalam Controller ID, ketik:
frontend/controllers/upgrade

Pastikan bidang-bidang berikut ditetapkan jika mereka tidak terisi otomatis:

Action Ids: index


Controller Namespace: frontend\controllers

Seharusnya terlihat seperti ini:

Hal ini tidak hanya akan membuat controller, tetapi juga folder tampilan yang sesuai dan berkas.
Dalam hal ini kami hanya memiliki satu tindakan yang kita ingin membuat, yang indeks. Anda dapat
melakukan lebih dari satu tindakan dengan memisahkannya dengan koma. Dalam hal ini, tindakan
indeks akan membuat tampilan indeks, yang akan Anda gunakan untuk menawarkan pilihan
pembayaran pengguna.

Kami hanya akan mengejek halaman pilihan pembayaran, kami hanya akan menempatkan konten
sedikit pada tampilan indeks kami, itu sejauh petunjuk kami akan pergi untuk buku ini. Jika Anda
benar-benar ingin menerapkan pilihan pembayaran yang nyata, saya akan merekomendasikan
memeriksa Stripe. Untuk perusahaan kecil, solusi ini masuk akal, dan mereka memiliki banyak
dokumentasi untuk integrasi:

Stripe
Juga, ada:

PayPal
Anda mungkin ingin menawarkan kedua pilihan.

https://stripe.com/
http://www.paypal.com

Upgrade Controller
Ok, mari kita kembali ke Gii. Setelah Anda menjalankan menghasilkan pada Gii, Anda akan
mendapatkan:

UpgradeController.php

<?php
namespace frontend\controllers;
class UpgradeController extends \yii\web\Controller
{
public function actionIndex()
{
return $this->render('index');
}
}

Upgrade View
Cukup sederhana, itu hanya membuat tampilan, yang dalam views\upgrade\index.php:

<?php
/* @var $this yii\web\View */
?>
<h1>upgrade/index</h1>
<p>
You may change the content of this page by modifying
the file <code><?= __FILE__; ?></code>.
</p>

Sekali lagi, tidak ada untuk itu. Jadi karena kami hanya mengejek, kita bisa berhenti di situ. Sekarang
untuk menguji bagaimana ini bekerja, kita bisa menambahkan satu baris dalam file
ProfileController.php kami.

Require Upgrade To
Ok, sekarang kita sudah melompat kembali ke Profile Controller kami pada
frontend\controllersProfileController.php, mari kita membuat baris pertama actionUpdate:
PermissionHelpers::requireUpgradeTo('Paid');

Sehingga seluruh metode akan terlihat seperti ini:

public function actionUpdate()


{
PermissionHelpers::requireUpgradeTo('Paid');
if ($model = Profile::find()->where(['user_id' =>
Yii::$app->user->identity->id])->one()) {
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
} else {
throw new NotFoundHttpException('No Such Profile.');
}
}

Jadi kami membuat tidak ada perubahan kecuali untuk menambahkan baris pertama, yang sekarang
memberitahu controller yang pengguna harus menjadi user_type_name Paid. Pastikan Anda
menyimpan perubahan, maka Anda dapat menguji ini jika Anda login dengan pengguna yang ada
yang hanya memiliki user_type default Free.

Tip
Anda harus mendaftarkan beberapa pengguna melalui aplikasi dan kemudian
bermain-main dengan pengaturan user_type_id mereka di PhpMyAdmin, sehingga
Anda dapat mencoba skenario yang berbeda.

Sekarang bahwa Anda memiliki pengguna tes yang adalah Free user_type, Anda dapat mencoba
untuk memperbarui profil Anda, dan ketika Anda melakukannya, itu akan mengarahkan Anda ke
tampilan upgrade. Bagaimana sederhana seprerti itu?

Access Control
Sementara kita di sini di Profile controller, kita bisa bicara lebih banyak tentang kontrol akses. Salah
satu ide yang lebih tidak-begitu-obvouus akan meminta user untuk memiliki status aktif untuk
mengakses Profil kontroler. Sekarang tentu saja kita sudah menambahkan bahwa persyaratan untuk
site controller, sehingga tidak ada yang mendapat untuk login jika mereka tidak memiliki status aktif.
Tapi bagaimana jika seseorang mengerdilkan status mereka, kemudian menekan tombol kembali?
Secara teoritis mereka masih dapat mengakses segala sesuatu dan ini adalah kontrol ceroboh atas
konten.

Jadi kita akan menambahkan aturan akses yang membutuhkan status aktif. Jangan khawatir, ini akan
menjadi benar-benar sederhana karena kita sudah mengantisipasi hal ini dan membangun penolong
untuk itu. Dan juga, Yii 2 ini perilaku kelas meliputi kontrol akses, yang telah kita lihat dalam
tindakan. Sekarang kami hanya akan menambahkan sedikit lebih untuk itu:
Mengubah metode perilaku yang ada di Profile controller untuk berikut:

public function behaviors()


{
return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['index', 'view','create', 'update', 'delete'],
'rules' => [
[
'actions' => ['index', 'view','create', 'update', 'delete'],
'allow' => true,
'roles' => ['@'],
],
],
],
'access2' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['index', 'view','create', 'update', 'delete'],
'rules' => [
[
'actions' => ['index', 'view','create', 'update', 'delete'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return PermissionHelpers::requireStatus('Active');
}
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}

Jika Anda mendapatkan kesalahan pada tidak menemukan kelas VerbFilter, pastikan untuk memiliki
pernyataan menggunakan ini di bagian atas file:

use yii\filters\VerbFilter;

Ini adalah jalan kelas yang harus berubah oleh Yii 2 Kerangka sendiri selama waktu ketika saya
sedang menulis buku, jadi jika aku merindukan itu di tempat lain, yang adalah memperbaiki itu.
Ketika Anda mengembangkan aplikasi, sangat mudah untuk melewatkan pernyataan digunakan.
Kabar baiknya adalah bahwa Yii 2 akan mengeluh baik dan menunjuk tepat ke file yang hilang, Anda
hanya perlu memformat pernyataan penggunaan benar.

Laporan penggunaan lengkap harus terlihat seperti ini:

use Yii;
use frontend\models\Profile;
use frontend\models\search\ProfileSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use common\models\PermissionHelpers;
use common\models\RecordHelpers;

Saya termasuk satu untuk ProfileSearch jika anda ingin bermain-main dengan hal itu. Jangan ragu
untuk menghilangkan pernyataan penggunaan yang tidak perlu ke controller.

Bagaimanapun, kembali ke behaviors. Anda dapat melihat bahwa kami menambahkan array lain
berlabel 'access2':

'access2' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['index', 'view','create', 'update', 'delete'],
'rules' => [
[
'actions' => ['index', 'view','create', 'update', 'delete'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return PermissionHelpers::requireStatus('Active');
}
],
],
],

Sekarang kunci dari array, access2, hanya string dan Anda dapat menyebutnya apa pun yang Anda
inginkan. Jadi dapat melihat apa yang kita lakukan di sini. Kami disalin array akses dan
menambahkan elemen 'matchCallback', yang merupakan callable php yang mencari benar atau
salah. Untungnya, kami memiliki metode PermissionHelpers siap pakai yang mengembalikan benar
atau salah, dalam hal ini, memeriksa untuk melihat apakah pengguna saat ini memiliki status aktif.
Jika tidak, tidak memungkinkan akses, dan karena kami telah menetapkan aturan untuk semua
tindakan, mereka tidak bisa mengakses apa pun yang kontrol Profile Controller. Itu semua dilakukan
dengan sangat sederhana.

Sekarang saya telah membuat cara ini karena saya ingin menunjukkan bahwa Anda dapat beberapa
lapisan aturan akses. Namun dalam kenyataannya, sejak matchCallback berlaku untuk semua
tindakan, seperti halnya aturan lain, Anda bisa hanya menambahkan matchCallback ke array
pertama, bukan menciptakan access2.

Anda dapat juga array sarang di bawah aturan ketika Anda memiliki aturan yang hanya berlaku
untuk tindakan tertentu, misalnya:

return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['index', 'view','create', 'update', 'delete'],
'rules' => [
[
'actions' =>['create', 'update', 'delete'],
'allow' => true,
'roles' => ['@'],
],
],
'rules' => [
[
'actions' => ['index', 'view','create', 'update', 'delete'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return PermissionHelpers::requireStatus('Active');
}
],
],
],
],

Kelas kontrol akses akan beralih untuk setiap set aturan. Jadi ini adalah metode yang sangat fleksibel
dan mudah digunakan kontrol akses.

Anda dapat melihat bahwa ketika kita hanya ingin membatasi akses, kita dapat menggunakan
perilaku. Ketika kita perlu membatasi berdasarkan kondisi dan mengarahkan atau melakukan
tindakan lain, kita dapat membangun pembantu yang akan membuat kode controller kami sangat
bersih.

Mari kita kembali sekarang untuk controller upgrade. Kali ini kita akan menggunakan versi yang lebih
singkat dari behaviors, untuk kode bersih:

public function behaviors()


{
return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['index'],
'rules' => [
[
'actions' => ['index'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return PermissionHelpers::requireStatus('Active');
}
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}

Sekarang kita harus menambahkan beberapa pernyataan penggunaan, ketika itu selesai maka akan
terlihat seperti ini:

use Yii;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use common\models\PermissionHelpers;
use common\models\RecordHelpers;
use frontend\models\Profile;

Passing A Variable From the Controller


Salah satu perubahan kecil lainnya saya akan membuat ke controller Upgrade bahwa aku akan
menambahkan sebuah variabel untuk lolos ke tampilan. Saya akan melakukan ini di actionIndex:

public function actionIndex()


{
$name = Yii::$app->user->identity->username;
return $this->render('index',['name' => $name]);
}

Sehingga Anda dapat melihat saya sudah cukup menetapkan $name untuk username dari pengguna
saat ini. Aku melakukan ini untuk menunjukkan kepada Anda bagaimana mudahnya untuk
memindahkan variabel dan objek ke tampilan di render metode. Anda hanya menambahkan array
dengan nama elemen dan variabel sebagai nilai, seperti:
return $this->render('index',['name' => $name]);

Jika Anda memiliki lebih dari satu objek atau variabel, Anda dapat memisahkan mereka dengan
koma di arrray yang sama.

Jadi sekarang kita memiliki nama pengguna tersedia bagi kita, mari kita mengujinya dalam
pandangan. Ganti index.php dengan:

<?php
/* @var $this yii\web\View */
?>
<h1>Hey "<?php echo $name; ?>," This Requires Upgrade</h1>
<p>
You can get the access you want by upgrading, but <?php echo $name; ?>,
that's not all. You get to go everywhere, isn't that cool?
</p>

Ini hanya konyol menyenangkan, tapi Anda mendapatkan titik. Jadi itu hanya sebuah variabel
sederhana, mari kita coba suatu objek:

public function actionIndex()


{
$name = Profile::find()->where(['user_id' =>
Yii::$app->user->identity->id])->one();
return $this->render('index',['name' => $name]);
}
Di sini kita menetapkan $name ke sebuah contoh dari Profil, dimana user_id adalah pengguna saat
ini. Untuk mendapatkan ini untuk bekerja, kita harus menambahkan pernyataan gunakan untuk
mengakses Profil:
use frontend\models\Profile;

Kemudian dalam pandangan kami, kami dapat mengubahnya ke:

<?php
/* @var $this yii\web\View */
?>
<h1>Hey "<?php echo $name->first_name; ?>," This Requires Upgrade</h1>
<p>
You can get the access you want by upgrading, but
<?php echo $name->first_name; ?> , that's not all.
You get to go everywhere, isn't that cool?
</p>

Jadi sekarang kita telah dipersonalisasi output ke nama pertama pengguna. Anda dapat memiliki
semua jenis menyenangkan dengan ini, tapi intinya adalah bahwa hal itu sangat sederhana untuk
membawa obyek dan mengaksesnya. Pastikan Anda login ketika Anda mencoba ini atau itu tidak
akan berhasil.

Kemudian, ketika kita kode backend, kami akan kembali objek memegang daftar pengguna dan
profil, menggunakan Yii 2 built-in iterator dan widget.

Summary

Dalam bab ini, kami mengambil sedikit kontrol lebih besar atas aplikasi kita. Kami menciptakan
controller meng-upgrade dan melihat dan aturan kemudian diberlakukan untuk membawa
pengguna ke halaman jika mereka tidak memenuhi tipe user minimum diperbolehkan untuk akses.
Kami melakukan ini dengan menambahkan metode PermissionsHelper, requireUpgradeTo (Paid)
untuk metode update pada profile controller.

Kami juga menambahkan persyaratan bagi pengguna untuk memiliki status aktif. Ini mengencangkan
keamanan dan akses dan melakukan ini dengan menambahkan persyaratan matchCallback dengan
aturan akses dalam metode perilaku. Ini adalah perubahan yang sangat sederhana yang tidak
mengasapi atau membingungkan kode, sebagian karena fakta yang kami ekstrak keluar logika untuk
pembantu kami.
Akhirnya, kami bermain-main dengan bergerak variabel dan objek dari controller untuk melihat,
untuk memberikan kita gambaran tentang mudahnya untuk bekerja dengan data yang dapat diakses
oleh kita.

Butuh beberapa saat bagi kita untuk mendapatkan ke titik di mana kita bisa memanfaatkan model
kami membangun dan bersenang-senang sedikit dengan itu, tapi setidaknya sekarang Anda harus
mulai mendapatkan rasa apa pembangunan di Yii 2 adalah seperti.

Chapter Ten: Homepage Social Widgets


Implementing Homepage Social Widgets
Kami akan menghiasi Home page hanya sedikit. Kami ingin menambahkan beberapa widget sosial
dan beberapa hal kecil yang membumbui template. Kita tidak bisa melakukan terlalu banyak karena
ini hanya dimaksudkan untuk menjadi titik awal untuk aplikasi lain.

Index
Membuka frontend\views\site\index.php. Kami akan mulai dengan menambahkan beberapa
penggunaan pernyataan:

use \yii\bootstrap\Modal;
use kartik\social\FacebookPlugin;
use \yii\bootstrap\Collapse;
use \yii\bootstrap\Alert;
use yii\helpers\Html;

Mereka pergi di atas file di bawah tag Php pembukaan.

Jika Anda belum diimpor perpanjangan sosial Kartik, yang perlu kita lakukan sekarang. Memeriksa
berikut dalam file composer.json Anda:

"minimum-stability": "stable",
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": "*",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*",
"kartik-v/yii2-social": "dev-master"
},

Anda bisa melihatnya pada baris terakhir. Update run komposer dari baris perintah, seperti yang
telah kita lakukan berkali-kali sebelumnya.
Yang harus mengimpor ekstensi, jika Anda tidak memilikinya sudah. Anda dapat memeriksa di
bawah direktori vendor Anda untuk folder bernama Kartik-v, yang merupakan folder untuk ekstensi.

Tip
Anda dapat menemukan banyak ekstensi yang berguna oleh Kartik di situs nya,
Krajee.com. Dia adalah pengembang superstar. Pada tulisan ini, Kartik memiliki 28
extensions/goodies yang mencakup segala sesuatu dari widget sosial kita gunakan di
sini untuk ekstensi GridView dan banyak lagi. Jika Anda menggunakan ekstensi nya,
bersikap baik dan menyumbangkan jika Anda bisa. Sumbangan menjaga dia bekerja
pada hal-hal baru untuk menambah kerangka dan yang membantu setiap orang.

Facebook Widget
Berikutnya, mari kita kembali ke tampilan situs berkas Index.php dan mengubah judul untuk:
$this->title = 'Yii 2 Build';

Menemukan div pertama dan menggantinya dengan:

<div class="site-index">
<div class="jumbotron">
<?php if (Yii::$app->user->isGuest) {
echo Html::a('Get Started Today', ['site/signup'],
['class' => 'btn btn-lg btn-success']);}; ?>
</p>
<h1>Yii 2 Build</h1>
<p class="lead">Use this Yii 2 Template to start Projects.</p>
<br/>
<?php echo FacebookPlugin::widget(['type'=>FacebookPlugin::LIKE,
'settings' => []]); ?>
</div>

Sekarang jika Anda menyimpan itu dan memukul refresh, Anda akan mendapatkan error berikut:
Invalid Configuration yii\base\InvalidConfigException
The Facebook 'appId' has not been set.

Facebook App Setup


Jadi apa yang perlu kita lakukan adalah membuat aplikasi Facebook kita, baik dalam Yii 2 konfigurasi
dan dengan mendirikan sebuah aplikasi Facebook yang sebenarnya.

Perhatikan bahwa Anda akan memerlukan sebuah akun Facebook yang sebenarnya untuk mengikuti.
Jika Anda tidak memiliki satu dan tidak atau tidak bisa mendapatkan satu, maka Anda akan harus
melewatkan pelajaran ini dan menghapus semua widget sosial dari proyek.

Aku akan melanjutkan, dengan asumsi bahwa Anda memiliki akun Facebook. Jadi mulai dengan pergi
ke akun facebook Anda dan log in. Di bagian bawah halaman, menemukan pengembang
menghubungkan.

Kemudian ikuti langkah demi langkah untuk menyiapkan sebuah aplikasi. Saya akan memberikan
banyak screenshot di sini untuk referensi, tetapi harap diingat bahwa hal-hal berubah dari waktu ke
waktu, dan mungkin tidak terlihat sama. Bagaimanapun, itu cukup intuitif, sehingga Anda harus
dapat mencari tahu.

Pergi ke facebook dan menemukan pengaturan Anda link dari bawah panah sepanjang jalan kanan:

Setelah Anda berada pada halaman pengaturan Anda, Anda bisa mendapatkan untuk footer dan
pengembang menghubungkan:

atau Anda hanya bisa pergi ke:

https://developers.facebook.com/apps

Pilih add new app:


pilih website sebagai platform dan kemudian memilih nama untuk aplikasi:

Pilih kategori dan konfirmasi:

Anda mendapatkan layar mulai cepat:


Di bagian bawah layar mulai cepat, mengisi url situs Anda. Harap dicatat bahwa saya menggunakan
Yii2build.com dan Anda tidak akan dapat menggunakannya. Dalam pelaksanaan contoh yang kita
lihat nanti, pastikan Anda menggunakan domain Anda dan tidak Yii2build.com. Domain Anda tidak
perlu menjadi situs hidup, jadi lanjutkan dan masukkan domain Anda:

Kami mendapatkan setup SDK selesai (tapi tidak kami lakukan, klik pada Skip to Developer
Dashboard Link di bawah Berikutnya Langkah).
Yang akan membawa Anda ke Dashboard, di mana Anda klik pada pengaturan:
Jelas, saya tergores keluar id app saya. Anda akan muncul di sana. Dalam rangka untuk menyalin app
rahasia, pilih tombol acara.

Anda perlu menyalin id aplikasi dan rahasia aplikasi ke daerah yang sesuai di konfigurasi seperti yang
saya jelaskan di bawah.

// the global settings for the facebook plugins widget


'facebook' => [
'appId' => 'your id',
'secret' => your 'secret',
],

Kami belum menambahkan bahwa belum, tapi kami akan dalam sekejap. Juga, ingat untuk
memberikan alamat email yang bekerja di dalam halaman pengaturan Facebook, jika aplikasi tidak
akan bekerja.

Facebook Configuration
Ok, untuk menyiapkan pengaturan konfigurasi umum kami untuk mengenali modul sosial Kartik,
yang akan memungkinkan kita untuk menggunakan widget sosialnya. Jika Anda ingat, kami
termasuk:
"kartik-v/yii2-social": "dev-master",

dalam file composer.json kami. Sekarang kita perlu config memberitahu bahwa itu ada. Asli
common\config\main.php adalah:

<?php
return [
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
],
];

Jika Anda tidak melihat itu, pastikan Anda berada di file kanan. Yii2 memiliki beberapa file bernama
main.php di config. Anda perlu satu yang ada di folder common. Anda perlu mengubah ini untuk:

<?php
return [
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'extensions' => require(__DIR__ . '/../../vendor/yiisoft/extensions.php'),
'modules' => [
'social' => [
// the module class
'class' => 'kartik\social\Module',
// the global settings for the disqus widget
'disqus' => [
'settings' => ['shortname' => 'DISQUS_SHORTNAME'] // default settings
],
// the global settings for the facebook plugins widget
'facebook' => [
'appId' => 'your id',
'secret' => your 'secret',
],
// the global settings for the google plugins widget
'google' => [
'clientId' => 'GOOGLE_API_CLIENT_ID',
'pageId' => 'GOOGLE_PLUS_PAGE_ID',
'profileId' => 'GOOGLE_PLUS_PROFILE_ID',
],
// the global settings for the google analytic plugin widget
'googleAnalytics' => [
'id' => 'TRACKING_ID',
'domain' => 'TRACKING_DOMAIN',
],
// the global settings for the twitter plugin widget
'twitter' => [
'screenName' => 'TWITTER_SCREEN_NAME'
],
],
// your other modules
],
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
],
];
Ambil Anda Facebook appid dan rahasia Anda dan menyalinnya ke dalam:

// the global settings for the facebook plugins widget


'facebook' => [
'appId' => 'your id',
'secret' => your 'secret',
],

Harap dicatat bahwa ketika Anda melihat widget facebook diimplementasikan dalam contoh saya,
saya menggunakan Yii2Build.com sebagai domain saya. Jelas Anda akan menggunakan contoh
domain Anda sendiri.

Extensions
Hanya sebuah catatan tentang bagaimana modul sosial Kartik ini dirujuk dalam konfigurasi. Di bawah
vendor\yiisoft adalah file bernama extensions.php dan ini memegang alias untuk modul:

'kartik-v/yii2-social' =>
array (
'name' => 'kartik-v/yii2-social',
'version' => '9999999-dev',
'alias' =>
array (
'@kartik' => $vendorDir . '/kartik-v/yii2-social',
),
),

Anda dapat melihat kartik-v/yii2-sosial adalah nama yang sama seperti yang telah di composer.json
ketika kita termasuk di sana. Komposer otomatis masuk ke dalam ekstensi file untuk kita. Juga
perhatikan array untuk alias '@kartik'=>$vendorDir. '/kartik-v/yii2-sosial, yang memungkinkan untuk
baris ini di config:

return [
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'extensions' => require(__DIR__ . '/../../vendor/yiisoft/extensions.php'),
'modules' => [
'social' => [
// the module class
'class' => 'kartik\social\Module',

termasuk jalan vendor untuk referensi, tapi itu tidak baru, kita tidak menambahkan bahwa, itu sudah
ada. Kami kirim ke menggunakan ekstensi di jalan yang ditentukan dalam konfigurasi dan itu adalah
di mana ia menemukan alias untuk menghubungkan semuanya.

Jadi pada dasarnya, ia mengatakan untuk modul sosial, menggunakan kelas kartik\socialModule.
Tidak ada folder kartik, tapi kartik adalah alias untuk $vendorDir. '/kartik-v/yii2-sosial, yang bila
dikombinasikan dengan \socialModule, menyediakan lokasi kelas.

Widget yang sebenarnya bernama FacebookPlugin dan yang bernama spasi di bagian atas file:
use kartik\social\FacebookPlugin;

Alias digunakan dalam ekstensi bekerja di namespace juga. Jadi itu adalah bagaimana Yii tahu di
mana untuk menemukan segala sesuatu.
HTML Helper
Ok, pindah kembali ke file situs index.php. Mari kita membuat catatan dari fakta bahwa saya
membuat tombol Get Started Today tergantung pada yang log out, tidak perlu menampilkannya
jika login, karena link ke formulir pendaftaran. Juga, saya menggunakan kelas HTML yang
diidentifikasi di Gunakan pernyataan kami:
use yii\helpers\Html;

Kemudian saya menggunakan metode kelas Html untuk memformat link:

<p>
<?php
if (Yii::$app->user->isGuest){
echo Html::a('Get Started Today', ['site/signup'],
['class' => 'btn btn-lg btn-success']);
}
?>
</p>

3 parameter untuk sebuah metode, yang pertama adalah teks link, Get Started Today.' Yang
berikutnya adalah controller/action, 'site/signup' dalam kasus ini. Dan kemudian kita mendapatkan
kelas untuk css, yang, seperti yang kita lihat dalam kode, adalah sebuah tombol.

Beberapa hal yang perlu diperhatikan. Metode yang cukup cerdas. Ia tahu bahwa jika Anda berada di
sebuah file profil view.php, Anda hanya dapat menyerahkannya tindakan yang Anda inginkan,
misalnya, update, dan itu akan mengetahui kehendak rute Anda untuk tindakan pembaruan yang
benar. Juga, perhatikan bahwa Anda dapat menambahkan, dipisahkan dengan tanda koma,
parameter pilihan dalam array yang untuk menyerahkan mendapatkan variabel, misalnya:
[update, id => $model->id],

Ok, bergerak ke bawah halaman, menghapus kode ini:

<div class="body-content">
<div class="row">
<div class="col-lg-4">
<h2>Heading</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
do eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip
ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur.</p>
<p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">
Yii Documentation &raquo;</a></p>
</div>
<div class="col-lg-4">
<h2>Heading</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
do eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip
ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur.</p>
<p><a class="btn btn-default" href="http://www.yiiframework.com/forum/">
Yii Forum &raquo;</a></p>
</div>
<div class="col-lg-4">
<h2>Heading</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
do eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip
ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur.</p>
<p><a class="btn btn-default" href="http://www.yiiframework.com/extensions/">
Yii Extensions &raquo;</a></p>
</div>
</div>
</div>
</div>

Menggantinya dengan:

<?php
echo Collapse::widget([
'items' => [
[
'label' => 'Top Features' ,
'content' => FacebookPlugin::widget([
'type'=>FacebookPlugin::SHARE,
'settings' => ['href'=>'http://www.yii2build.com','width'=>'350']
]),
// open its content by default
//'contentOptions' => ['class' => 'in']
],
// another group item
[
'label' => 'Top Resources',
'content' => FacebookPlugin::widget([
'type'=>FacebookPlugin::SHARE,
'settings' => ['href'=>'http://www.yii2build.com','width'=>'350']
]),
// 'contentOptions' => [],
// 'options' => [],
],
]
]);
Modal::begin([
'header' => '<h2>Latest Comments</h2>',
'toggleButton' => ['label' => 'comments'],
]);
echo FacebookPlugin::widget([
'type'=>FacebookPlugin::COMMENT,
'settings' => ['href'=>'http://www.yii2build.com','width'=>'350']
]);
Modal::end();
?>
<br/>
<br/>
<?Php
echo Alert::widget([
'options' => [
'class' => 'alert-info',
],
'body' => 'Launch your project like a rocket...',
]);
?>
<div class="body-content">
<div class="row">
<div class="col-lg-4">
<h2>Free</h2>
<p>
<?php
if (!Yii::$app->user->isGuest) {
echo Yii::$app->user->identity->username . ' is doing cool stuff. ';
}
?>
Starting with this free, open source Yii 2 template and it will save you
a lot of time. You can deliver projects to the customer quickly, with
a lot of boilerplate already taken care of for you, so you can concentrate
on the complicated stuff.</p>
<p>
<a class="btn btn-default" href="http://www.yiiframework.com/doc/">
Yii Documentation &raquo;</a>
</p>
<?php
echo FacebookPlugin::widget([
'type'=>FacebookPlugin::LIKE,
'settings' => []
]);
?>
</div>
<div class="col-lg-4">
<h2>Advantages</h2>
<p>
Ease of use is a huge advantage. We've simplifiled RBAC and given you Free/Paid
user type out of the box. The Social plugins are so quick and easy to install,
you will love it!
</p>
<p>
<a class="btn btn-default" href="http://www.yiiframework.com/forum/">
Yii Forum &raquo;</a>
</p>
<?php
echo FacebookPlugin::widget([
'type'=>FacebookPlugin::COMMENT,
'settings' => ['href'=>'http://www.yii2build.com','width'=>'350']
]);
?>
</div>
<div class="col-lg-4">
<h2>Code Quick, Code Right!</h2>
<p>
Leverage the power of the awesome Yii 2 framework with this enhanced template.
Based Yii 2's advanced template, you get a full frontend and backend
implementation that features rich UI for backend management.
</p>
<p>
<a class="btn btn-default" href="http://www.yiiframework.com/extensions/">
Yii Extensions &raquo;</a>
</p>
</div>
</div>
</div>
</div>

Hanya pengingat, dan ini bukan bagian dari kode atau halaman, jangan lupa untuk menyimpan. Juga,
pastikan Anda menggunakan domain Anda dalam widget sosial, tidak Yii2build.com.

Collapse Widget
Anda dapat melihat dalam kode di atas yang saya direferensikan widget runtuh, sehingga Anda harus
menempatkan pernyataan penggunaan di bagian atas file:
use \yii\bootstrap\Collapse;

Yang memungkinkan Anda untuk referensi widget langsung melalui panggilan statis:
echo Collapse::widget

Widget kode cukup sederhana untuk mengikuti:

<?php
echo Collapse::widget([
'items' => [
[
'label' => 'Top Features' ,
'content' => FacebookPlugin::widget([
'type'=>FacebookPlugin::SHARE,
'settings' => ['href'=>'http://www.yii2build.com','width'=>'350']
]),
// open its content by default
//'contentOptions' => ['class' => 'in']
],
// another group item
[
'label' => 'Top Resources',
'content' => FacebookPlugin::widget([
'type'=>FacebookPlugin::SHARE,
'settings' => ['href'=>'http://www.yii2build.com','width'=>'350']
]),
// 'contentOptions' => [],
// 'options' => [],
],
]
]);

Kami memberikan item label, Top Features' dan Top Resources dan kemudian untuk konten kami
pasang di FacebookPlugin::widget untuk berbagi. Pilihan lain adalah komentar.

Modal Widget
Setelah itu kita menggunakan modal dengan tombol untuk menahan komentar facebook, kode lagi
sangat mudah untuk memahami:

Modal::begin([
'header' => '<h2>Latest Comments</h2>',
'toggleButton' => ['label' => 'comments'],
]);
echo FacebookPlugin::widget([
'type'=>FacebookPlugin::COMMENT,
'settings' => ['href'=>'http://www.yii2build.com','width'=>'350']
]);
Modal::end();

Alert Widget
Lalu aku hanya ingin bermain-main dengan widget peringatan, jadi saya termasuk:

<?Php
echo Alert::widget([
'options' => [
'class' => 'alert-info',
],
'body' => 'Launch your project like a rocket...',
]);
?>

Mungkin tidak bagaimana kita akan benar-benar menggunakan peringatan, itu akan terikat dengan
suatu tindakan, tetapi termasuk seperti ini memberi kita gambaran tentang apa yang tampak seperti
itu.

Kemudian hal terakhir yang kita lakukan pada index.php adalah baris ini di pertama <p>

<p>
<?php
if (!Yii::$app->user->isGuest) {
echo Yii::$app->user->identity->username . ' is doing cool stuff. ';
}
?>
Hanya sedikit perbedaan lain untuk menguji sedang login atau keluar dan memastikan itu
mendapatkan nama pengguna yang tepat. Dan itu untuk template awal kita untuk halaman indeks.

Font-Awesome
Yii 2 memiliki seperangkat agak rumit metode untuk menangani aset seperti bootstrap, jquery, dll,
dan sejujurnya, saya tidak mengerti mengapa mereka membuat seperti itu. Aku tidak akan
menutupinya banyak dalam buku ini, tapi kami akan mencoba-coba di dalamnya sejauh yang kita
ingin memiliki akses ke font-mengagumkan, ikon css perpustakaan populer.

Ok, jadi inilah yang kita butuhkan untuk membuat karya ini.

Pertama kita akan menarik font-mengagumkan melalui komposer, tambahkan berikut ke file
composer.json Anda:

"minimum-stability": "stable",
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": "*",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*",
"kartik-v/yii2-social": "dev-master",
"fortawesome/font-awesome": "4.2.0"
},

Sekarang jika Anda melihat dekat, itu fortawesome, yang tidak salah ketik. Pergi ke depan dan
menjalankan update komposer dan ini akan menarik dalam untuk Anda.

Asset Bundle
Maka Anda perlu menambahkan file berikut, di dua lokasi, frontend\assets dan backend\assets,
dengan ruang nama yang sesuai. Nama file fontAwesomeAsset.php. Berikut adalah seluruh file:

<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace frontend\assets;
use yii\web\AssetBundle;
/**
* @author Joao Marques<joao@jjmf.com>
*/
class FontAwesomeAsset extends AssetBundle
{
# sourcePath points to the composer package.
public $sourcePath = '@vendor/fortawesome/font-awesome';
# CSS file to be loaded.
public $css = [
'css/font-awesome.min.css',
];
/**
* Sets the publishOptions property.
* Needed because it's necessary to
*concatenate
* the namespace value.
*/
public function init()
{
$this->publishOptions = [
'forceCopy' => YII_DEBUG,
'beforeCopy' => __NAMESPACE__ .
'\FontAwesomeAsset::filterFolders'
];
parent::init();
}
/**
* Filters the published files and folders.
* It's not necessary publish all files and folders
* from the font-awesome package
* Just the CSS and FONTS folder.
* @param string $from
* @param string $to
* @return bool true to publish to file/folder.
*/
public static function filterFolders($from, $to)
{
$validFilesAndFolders = [
'css',
'fonts',
'font-awesome.css',
'font-awesome.min.css',
'FontAwesome.otf',
'fontawesome-webfont.eot',
'fontawesome-webfont.svg',
'fontawesome-webfont.ttf',
'fontawesome-webfont.woff',
];
$pathItems = array_reverse(explode(DIRECTORY_SEPARATOR, $from));
if (in_array($pathItems[0], $validFilesAndFolders)) return true;
else return false;
}
}

Hanya menyalin versi kedua untuk backend\assets dan mengatur namespace itu copy ke:
namespace backend\assets;
Jadi ini adalah bundel aset. Saya harus mencatat bahwa saya mendapat ini dari forum Yii 2, penulis
berkas ini tercantum di dekat bagian atas file. Dia melakukan pekerjaan yang baik berkomentar
kode:

http://www.yiiframework.com/forum/index.php/topic/57902-using-fontawesome/

Anda juga dapat memeriksa lebih lanjut tentang subjek ini dari panduan Yii 2:

http://www.yiiframework.com/doc-2.0/guide-structure-assets.html

Add Font-Awesome to Layout


Di frontend\views\layout\main.php, menambahkan pernyataan penggunaan berikut di atas:
use frontend\assets\FontAwesomeAsset;

Dan kemudian di bawah itu, dekat daftar panggilan lain pada panggilan tambahan untuk mendaftar,
seperti:

AppAsset::register($this);
FontAwesomeAsset::register($this);

Dan yang harus melakukannya, kita harus sekarang memiliki akses ke font yang mengagumkan-. Jadi
mari kita menguji ini dengan memasukkan berikut:
<i class="fa fa-plug"></i>

Kita akan menempatkan bahwa di dua tempat:

Dalam main.php, div pertama, brand label:


'brandLabel' => 'Yii 2 Build <i class="fa fa-plug"></i>',

Kemudian mari kita pergi ke frontend\views\site\index.php dan menambahkannya dalam pertama


<h1> tag seperti:
<h1>Yii 2 Build <i class="fa fa-plug"></i></h1>

Yang akan melakukannya. Sekarang Anda harus memiliki halaman depan yang terlihat seperti ini:

http://www.yiiframework.com/forum/index.php/topic/57902-using-fontawesome/
http://www.yiiframework.com/doc-2.0/guide-structure-assets.html

Summary
Dalam bab ini, kita dikonfigurasi aplikasi Facebook dan diinstal Kartik widget sosial ekstensi kami
sehingga kami bisa memanfaatkannya. Dengan kemudahan penggunaan komposer, menginstal
ekstensi mudah. Ekstensi Kartik ini sangat berguna, dan sebagai pengingat, Anda dapat memeriksa
banyak ekstensi yang besar lainnya di:

http://www.krajee.com
Kami dimasukkan widget sosial di dalam widget runtuhnya untuk bersenang-senang sedikit dekorasi
halaman rumah. Anda bisa mendapatkan widget lebih bootstrap digunakan untuk proyek-proyek
Anda di:

http://www.yiiframework.com/doc-2.0/guide-widget-bootstrap.html
Karena kita sudah membawa perpanjangan jui untuk DatePicker, kita memiliki akses ke semua
widget yang terdaftar di:

http://www.yiiframework.com/doc-2.0/guide-widget-jui.html
Yii 2 mendukung sejumlah bagus Jquery dan Bootstrap widget seperti kolaps dan modal. Buku ini
tidak benar-benar tentang pembangunan front end, jadi kami tidak pergi terlalu dalam, tapi
setidaknya Anda mendapat sampel untuk bermain dengan.

Akhirnya, kita menambahkan aset aplikasi untuk font-mengagumkan, sehingga Anda dapat
menambahkan beberapa mendesis untuk presentasi, tanpa terlalu banyak usaha. Anda dapat
menemukan banyak ikon yang indah untuk menambah presentasi Anda di:

Font-Awesome
http://www.krajee.com
http://www.yiiframework.com/doc-2.0/guide-widget-bootstrap.html
http://www.yiiframework.com/doc-2.0/guide-widget-jui.html
http://fortawesome.github.io/Font-Awesome/
Chapter Eleven: Backend Creation
Ok, kita sudah siap untuk pindah ke menciptakan admin area backend kami. Mari kita mulai dengan
menggunakan Gii untuk membuat controller dan pandangan CRUD untuk semua model kami.
Sekarang Anda mungkin bertanya-tanya jika kita hanya dapat menggunakan controller frontend dan
pandangan bahwa kita telah membuat, namun, kami tidak bisa.

Backend beroperasi secara berbeda dari frontend, itulah sebabnya kami telah membuat bagian
terpisah dari struktur aplikasi untuk itu. Saya akan menunjukkan perbedaan seperti yang kita pergi,
tapi untuk saat ini, mari kita membuat controller dan crud untuk masing-masing model berikut:

Profile
Role
Status
User
UserType

Url untuk Gii adalah:


http://backend.yiibuild.com/?r=gii

User model namespace adalah sebagai berikut:

Jika gambar di atas tidak jelas, sampel terlihat seperti ini:

Model Class: common\models\user


Search Model Class: backend\models\search\UserSearch
Controller Class: backend\controllers\UserController
Kami referensi common\models\user, karena itu adalah di mana model pengguna kami tinggal, tapi
kami menciptakan semua file lainnya ke dalam backend. Anda dapat melihat bahwa kita juga perlu
menyediakan namespace untuk model pencarian.

Yii2 menyediakan kelas terpisah untuk parameter pencarian dan aku benar-benar senang mereka
melakukan ini. Ini memisahkan keluar banyak kode dari model dasar, yang membuatnya lebih
mudah untuk mengikuti. Anda akan melihat cara kerjanya nanti.

Untuk memastikan Anda memiliki ruang nama yang tepat dan lokasi file yang dihasilkan, saya akan
daftar semua model yang tersisa yang Anda butuhkan untuk menghasilkan CRUD dari, dengan ruang
nama tertentu.

Profile:
Model Class: frontend\models\profile
Search Model Class: backend\models\search\ProfileSearch
Controller Class: backend\controllers\ProfilerController

User:
Model Class: common\models\user
Search Model Class: backend\models\search\UserSearch
Controller Class: backend\controllers\UserController

Role:
Model Class: backend\models\role
Search Model Class: backend\models\search\RoleSearch
Controller Class: backend\controllers\RoleController

Status:
Model Class: backend\models\status
Search Model Class: backend\models\search\StatusSearch
Controller Class: backend\controllers\StatusController

UserType:
Model Class: backend\models\usertype
Search Model Class: backend\models\search\UserTypeSearch
Controller Class: backend\controllers\UserTypeController

Ok, setelah Anda menghasilkan file baru, saya sarankan menyimpan repositori Anda di Git. Anda
harus melakukan ini untuk masing-masing model, itu akan membuat lebih mudah untuk melangkah
mundur, harus yang menjadi perlu. Anda juga dapat menimpa mudah dengan Gii, hal sebagian besar
baik, kecuali jika Anda melakukannya dengan kesalahan, tetapi tidak memberitahu Anda jika Anda
akan menimpa dan memberikan Anda pilihan untuk tidak.

Karena proses pembuatan CRUD adalah persis sama untuk masing-masing model yang tercantum di
atas, kita tidak akan pergi melalui masing-masing di sini. Pada titik ini, kita hanya akan menganggap
telah Anda buat file seperti yang kita bergerak dari sini.

Ok, Anda dapat memeriksa hasil individual dengan mengetikkan url, misalnya:
backend.yiibuild.com/index.php?r=user

Ini akan memanggil action index dan asumsi Anda memiliki setidaknya satu catatan di sana, itu akan
menampilkan catatan. Jelas, Anda harus login ke backend.yii2build.com dan pengguna log in harus
memiliki role_id yang cocok role_value dari 20, karena kita memberikan nilai yang ke role_name =
Admin, dan itulah apa yang kita diperlukan ketika kita menciptakan terpisah masuk untuk admin.

Halaman indeks pengguna juga memiliki link untuk melihat dan update pada hak grid, sehingga Anda
dapat memeriksa untuk melihat apakah ini bekerja juga. Kemudian cobalah url yang sama di atas
dengan model yang berbeda yang Anda buat untuk memastikan itu semua bekerja.

Jika Anda mendapatkan kesalahan, periksa lokasi file Anda dan memeriksa setiap file untuk ruang
nama. Misalnya, di ProfileController.php:

namespace backend\controllers;
use Yii;
use frontend\models\Profile;
use backend\models\search\ProfileSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

Anda dapat melihat itu menggunakan frontend\models untuk model, tapi backend\models\search
model pencarian.

Sementara itu mungkin untuk menduplikasi model menjadi lebih dari satu lokasi, itu pasti tidak
dianjurkan, itu mengalahkan tujuan memiliki folder umum dan melanggar prinsip KERING (jangan
ulangi sendiri). Saya menggunakan frontend\models untuk Profil, tapi bisa menggunakan
common\models. Aku hanya memilih mantan karena alur kerja. Tapi Anda bisa melihat betapa
mudahnya untuk referensi folder yang benar melalui namespace ketika Anda sedang menciptakan
controller dan views.

Kita akan membuat beberapa perubahan pada tampilan file dan untuk model pencarian, tetapi
pengendali sebagian besar akan dibiarkan apa adanya. Itu karena pengendali dan pandangan yang
Gii menciptakan meminjamkan diri ke pendekatan backend, yang merupakan salah satu log-in
pengguna yang dapat mencari daftar pengguna, memperbarui semua catatan, dll dari kotak
pengendali memungkinkan untuk ini, sehingga kabar baik bahwa generasi auto-kode benar-benar
membantu dan besar waktu-saver.

Jadi hanya dengan mengendalikan akses ke area admin dengan menegakkan nilai minimum untuk
role_id catatan pengguna, hanya pengguna admin-level dapat mengakses controller backend. Kami
juga akan menunjukkan bagaimana mudahnya untuk menambahkan peran di atas admin yang dapat
mengubah catatan yang admin tidak bisa. Dalam template kita, pengguna dengan akses Admin-level
dapat menggunakan backend UI untuk mengubah catatan pengguna.

Kami tentu saja akan membatasi bahwa agak, misalnya, admin akan tidak dapat mengubah
password pengguna, mereka bahkan tidak akan melihatnya. Kami akan membuat beberapa
perubahan di backend UI untuk membuat bergerak di sekitar catatan terkait lebih mudah, misalnya,
kita akan ingin memiliki akses ke nilai role_id pengguna dan kemampuan untuk mengubahnya,
sehingga kami dapat memberikan hak istimewa tambahan untuk pengguna.
Sebelum kita mengubah pandangan individu file, mari kita membuat beberapa perubahan ke
backend\views\layout\main.php. Kami akan menambahkan sejumlah link untuk membuatnya
mudah bagi kita untuk menavigasi melalui pandangan yang berbeda.

Main.php
Pergi ke backend\views\layout\main.php

Ubah main.php menjadi:

<?php
use backend\assets\AppAsset;
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use common\models\ValueHelpers;
use backend\assets\FontAwesomeAsset;
/**
* @var \yii\web\View $this
* @var string $content
*/
AppAsset::register($this);
FontAwesomeAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
<meta charset="<?= Yii::$app->charset ?>"/>
<meta name="viewport"
content="width=device-width,
initial-scale=1">
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class="wrap">
<?php
$is_admin = ValueHelpers::getRoleValue('Admin');
if (!Yii::$app->user->isGuest){
NavBar::begin([
'brandLabel' => 'Yii 2 Build <i class="fa fa-plug"></i> Admin',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
} else {
NavBar::begin([
'brandLabel' => 'Yii 2 Build <i class="fa fa-plug"></i>',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
$menuItems = [
['label' => 'Home', 'url' => ['/site/index']],
];
if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >= $is_admin) {
$menuItems[] = ['label' => 'Users', 'url' => ['user/index']];
$menuItems[] = ['label' => 'Profiles', 'url' => ['profile/index']];
$menuItems[] = ['label' => 'Roles', 'url' => ['/role/index']];
$menuItems[] = ['label' => 'User Types', 'url' => ['/user-type/index']];
$menuItems[] = ['label' => 'Statuses', 'url' => ['/status/index']];
}
if (Yii::$app->user->isGuest) {
$menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
} else {
$menuItems[] = ['label' =>
'Logout (' . Yii::$app->user->identity->username .')' ,
'url' => ['/site/logout']];
}
\
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => $menuItems,
]);
NavBar::end();
?>
<div class="container">
<?= Breadcrumbs::widget([
'links' => isset($this->params['breadcrumbs']) ?
$this->params['breadcrumbs'] : [],
])?>
<?= $content ?>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-left">&copy; Yii 2 Build <?= date('Y') ?></p>
<p class="pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

Anda akan perhatikan Saya telah menggunakan banyak spasi untuk membuat kode lebih mudah
dibaca. Perlu diingat, pembacaan dipengaruhi dengan menjadi dalam bentuk buku.
Kami juga menambahkan pernyataan penggunaan:
use common\models\ValueHelpers;

Kami melakukan itu karena kita akan menggunakan ValueHelpers::getRoleValue('Admin'); untuk


menambahkan lapisan tambahan keamanan.

Anda dapat melihat bahwa bukan hanya menambahkan link ke pandangan yang berbeda, kami
menyembunyikan link jika entah bagaimana pengguna yang sudah ke halaman ini, namun tidak
memiliki akses admin-level:

if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >= $is_admin) {
$menuItems[] = ['label' => 'Users', 'url' => ['user/index']];
}

Variabel $is_admin memegang nilai:


ValueHelpers::getRoleValue('Admin');

Alasan mengapa kita mengambil langkah ekstra menyiapkan variabel $is_admin adalah bahwa
getRoleValue() melakukan query, dan meskipun itu adalah salah satu cepat, itu tidak akan masuk
akal untuk melakukan query setiap kali kita perlu nilai ini. Dengan ValueHelper, hanya
mengembalikan nilai yang kita cari, jadi kita perlu juga membandingkan bahwa nilai untuk pengguna
saat ini role_id. Kita dapat mengakses role_id pengguna saat ini oleh:
Yii::$app->user->identity->role_id

Logika di balik ini adalah jika tidak tamu dan pengguna saat ini telah role_id

lebih besar dari atau sama dengan admin_value, menampilkan link. Ini adalah cara yang sangat
sederhana untuk mengontrol akses ke link.

if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >= $is_admin) {
$menuItems[] = ['label' => 'Users', 'url' => ['user/index']];
$menuItems[] = ['label' => 'Profiles', 'url' => ['profile/index']];
$menuItems[] = ['label' => 'Roles', 'url' => ['/role/index']];
$menuItems[] = ['label' => 'User Types', 'url' => ['/user-type/index']];
$menuItems[] = ['label' => 'Statuses', 'url' => ['/status/index']];
}

Kami menggunakan array $MenuItems menahan url karena kami bekerja di widget NavBar.

Catatan, kami melewatkan lebih blok mana kami menambahkan jika pernyataan untuk melihat
apakah pengguna sedang login atau tidak, kemudian menunjukkan mereka baik:
'brandLabel' => 'Yii 2 Build Admin',

Atau, jika mereka tidak login:


'brandLabel' => 'Yii 2 Build',

Saya hanya melakukan itu karena meskipun itu hanya kosmetik, saya bahkan tidak suka mengakui
kata 'admin' untuk pengguna yang belum login.
Updating Backend Views
Untuk melengkapi fungsi dasar kami backend, kita perlu memperbarui bentuk tampilan dan
pandangan jaringan. Dalam kasus bentuk, seperti yang kami lakukan dalam pandangan frontend, kita
perlu menambahkan opsi dropdown dan menghapus field yang tidak diinginkan.

Perubahan GridView, yang merupakan nama dari widget utama dalam Index.php, yang sedikit lebih
dalam. Kita akan mengubah kolom yang ditampilkan, serta menambahkan kolom dari model yang
terkait, sehingga, misalnya, daftar pengguna memiliki link ke pengguna profil. Pada grid pengguna,
kita harus menampilkan nama peran pengguna, dll Ini adalah hal-hal kecil, yang akan membuat UI
lebih berguna dan lebih mudah untuk dipahami.

Backend\views\profile_form.php
Mari kita mulai dengan yang paling mudah pertama. Kita hanya akan menyalin
frontend\views\profile_form.php ke backend\views\profile_form.php.

Jadi sekarang kita memiliki datepicker jui dan daftar drop-down untuk gender dalam bentuk, yang
persis apa yang kita inginkan.

Backend\views\profile\view.php
Selanjutnya, mari kita mengubah view.php untuk backend\views\profile\view.php. Berikut ini adalah
keluar dari kotak:

<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
/* @var $this yii\web\View */
/* @var $model frontend\models\Profile */
$this->title = $model->id;
$this->params['breadcrumbs'][] = ['label' => 'Profiles', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="profile-view">
<h1><?= Html::encode($this->title) ?></h1>
<p>
<?= Html::a('Update', ['update', 'id' => $model->id],
['class' => 'btn btn-primary']) ?>
<?= Html::a('Delete', ['delete', 'id' => $model->id],
['class' => 'btn btn-danger',
'data' => [
'confirm' => 'Are you sure you want to delete this item?',
'method' => 'post',
],
]) ?>
</p>
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'user_id',
'first_name:ntext',
'last_name:ntext',
'birthdate',
'gender_id',
'created_at',
'updated_at',
],
]) ?>
</div>

Mari kita mengubah ini menjadi:

<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
use common\models\PermissionHelpers;
/**
* @var yii\web\View $this
* @var frontend\models\Profile $model
*/
$this->title = $model->user->username;
$show_this_nav = PermissionHelpers::requireMinimumRole('SuperUser');
$this->params['breadcrumbs'][] = ['label' => 'Profiles', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="profile-view">
<h1>Profile: <?= Html::encode($this->title) ?></h1>
<p>
<?php if (!Yii::$app->user->isGuest && $show_this_nav) {
echo Html::a('Update', ['update', 'id' => $model->id],
['class' => 'btn btn-primary']);}?>
<?php if (!Yii::$app->user->isGuest && $show_this_nav) {
echo Html::a('Delete', ['delete', 'id' => $model->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('app', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]);}?>
</p>
<?= DetailView::widget([
'model' => $model,
'attributes' => [
['attribute'=>'userLink', 'format'=>'raw'],
'first_name',
'last_name',
'birthdate',
'gender.gender_name',
'created_at',
'updated_at',
'id',
],
])?>
</div>

Ok, jadi beberapa perubahan. Kami termasuk di atas:


use common\models\PermissionHelpers;

Tidak ada salahnya untuk menjaga konsistensi dalam membungkus nav di jika pernyataan yang
memeriksa untuk melihat apakah pengguna memiliki izin untuk melakukan tindakan, sebelum
menunjukkan link.

Jadi untuk menunjukkan ini sepenuhnya, kita akan membutuhkan peran lebih tinggi dari admin
untuk memperbarui atau menghapus profil. Mari kita menyebutnya SuperUser.

Pergi ke depan dan membuat user dalam aplikasi dan melalui PhpMyAdmin, masukkan rekor peran
SuperUser dan menetapkan pengguna baru yang menghargai. Jangan lupa itu menjadi nilai yang
lebih tinggi dari 20, yang adalah apa yang kami berikan Admin. Mari kita gunakan 30 dalam tabel
peran untuk role_value misalnya.

Kemudian, kami juga akan memodifikasi controller kita kemudian untuk tidak mengizinkan siapa pun
tanpa akses admin untuk melihat halaman ini dan saya suka tidak menunjukkan link jika tidak
tersedia untuk pengguna, sehingga kita memiliki behaviors yang konsisten antara nav dan access
rules pada controller.

Ok, bergerak sepanjang melalui perubahan, kami mengubah judul untuk:


$this->title = $model->user->username;

Di bawah itu, kami menambahkan panggilan bagi pengguna untuk setidaknya SuperUser peran
untuk melihat link update:
$show_this_nav = PermissionHelpers::requireMinimumRole('SuperUser');

Perubahan berikutnya adalah pada tag <h1>:


<h1>Profile: <?= Html::encode($this->title) ?></h1>

Jadi sekarang ini akan menampilkan nama pengguna, bukan nomor id profil, jauh lebih user friendly.

Kemudian kami menambahkan link kami untuk memperbarui dan menghapus:

<p>
<?php if (!Yii::$app->user->isGuest && $show_this_nav) {
echo Html::a('Update', ['update', 'id' => $model->id],
['class' => 'btn btn-primary']);}?>
<?php if (!Yii::$app->user->isGuest && $show_this_nav) {
echo Html::a('Delete', ['delete', 'id' => $model->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('app', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]);}?>
</p>

Perhatikan bahwa tidak seperti ketika kita menggunakan ValueHelpers menyerukan nilai admin,
metode PermissionHelpers sudah membandingkan role_id pengguna saat ini dengan nilai
SuperUser, jadi kita tidak perlu menyebutnya.

Dan akhirnya, kami mengubah DetailView::widget. Kami mengubah format atribut pertama menjadi:
['attribute'=>'userLink', 'format'=>'raw'],

App kita tahu apa yang kita maksud karena kita menambahkan metode getUserLink ke Profil Model
dan menciptakan label:
'userLink' => Yii::t('app', 'User'),

untuk label atribut kami common\modelsUser.php.

Metode pada model:

public function getUserLink()


{
$url = Url::to(['user/view', 'id'=>$this->UserId]);
$options = []; //
return Html::a($this->getUserName(), $url, $options);
}

Metode ini mengembalikan link ke pengguna tampilan halaman yang kita inginkan. Saya
menunjukkan label dan metode di sini karena ini mungkin di mana dalam alur kerja Anda, Anda akan
menciptakan mereka, karena ini adalah di mana Anda akan melihat bahwa Anda membutuhkannya.
Kami jelas dibangun ini di muka, sehingga mereka sudah di tempat. Di masa depan, jika Anda dapat
mengantisipasi kebutuhan untuk jenis-jenis metode, Anda dapat membuat mereka di muka seperti
yang kita lakukan, sebagai bagian dari sekelompok metode boilerplate bahwa Anda selalu
menambahkan model, ketika Anda membuat model. Keputusan alur kerja Anda, namun, sebaiknya
diserahkan kepada Anda.

Perubahan besar lainnya adalah hubungan lazy loading:


'gender.gender_name',

Yang hanya mengatakan itu kembali atribut gender_name dari model Gender, sehingga kita
mendapatkan 'male' bukan '1', yang sekali lagi, jauh lebih ramah kepada pengguna. Kami memiliki
akses ke ini karena pada Profil model, kita telah metode berikut:

public function getGender()


{
return $this->hasOne(Gender::className(), ['id' => 'gender_id']);
}

Anda mungkin bertanya-tanya pada saat ini apa yang kita maksud dengan hubungan lazy loading.
Sebuah query lazy loading akan melakukan query DB untuk setiap baris dari hasil, yang sangat tidak
efisien. Sebuah 1000 hasil akan membutuhkan 1.001 query (juga dikenal sebagai n + 1 masalah).
Ini ok untuk melakukan loading malas ketika hanya ada satu hasil, tetapi Anda harus berhati-hati
tentang hal itu. Kami akan menunjukkan versi eager loading query ketika kita melakukan halaman
Indeks.

Backend\views\user\view.php
Pindah ke halaman backend\views\user\view.php, mari kita mengubahnya sebagai berikut:

<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
use common\models\PermissionHelpers;
/* @var $this yii\web\View */
/* @var $model common\models\user */
$this->title = $model->username;
$show_this_nav = PermissionHelpers::requireMinimumRole('SuperUser');
$this->params['breadcrumbs'][] = ['label' => 'Users', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="user-view">
<h1><?= Html::encode($this->title) ?></h1>
<p>
<?php if (!Yii::$app->user->isGuest && $show_this_nav) {
echo Html::a('Update', ['update', 'id' => $model->id],
['class' => 'btn btn-primary']);}?>
<?php if (!Yii::$app->user->isGuest && $show_this_nav) {
echo Html::a('Delete', ['delete', 'id' => $model->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('app', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]);}?>
</p>
<?= DetailView::widget([
'model' => $model,
'attributes' => [
['attribute'=>'profileLink', 'format'=>'raw'],
//'username',
//'auth_key',
//'password_hash',
//'password_reset_token',
'email:email',
'roleName',
'statusName',
// lazyload 'status.status_name',
'created_at',
'updated_at',
'id',
],
]) ?>
</div>
Laporan penggunaan yang persis sama dengan tampilan halaman profil. Sedikit perubahan untuk
$title, karena kita ingin menampilkan nama pengguna, ini merupakan atribut dari model saat ini:
$this->title = $model->username;

Sisanya adalah sama kecuali untuk DetailView::widget:

<?= DetailView::widget([
'model' => $model,
'attributes' => [
['attribute'=>'profileLink', 'format'=>'raw'],
//'username',
//'auth_key',
//'password_hash',
//'password_reset_token',
'email:email',
'roleName',
'statusName',
// lazyload 'status.status_name',
'created_at',
'updated_at',
'id',
],
]) ?>

Kami menyingkirkan bidang yang tidak diinginkan menampilkan dengan komentar mereka. Kita bisa
memotong mereka sepenuhnya, tapi saya ingin meninggalkan ini di untuk tujuan debug, jika saya
merasa perlu untuk mengingat mereka.

Jadi jelas atribut pertama kami adalah link ke profil, yang karena metode kami ditempatkan pada
model pengguna di awal, memungkinkan kita untuk referensi mereka sebagai profileLink. Karena ini
adalah identik dengan apa yang kami lakukan sebelumnya di Profil tampilan, saya tidak akan
menjelaskan yang lebih lanjut, tetapi Anda dapat melihat metode pada model pengguna untuk
menyegarkan pengetahuan Anda.

Catatan pada atribut email, kita menggunakan 'email:email' dan ini membentuk sebuah mailto link
pada alamat karena menampilkan dalam tampilan, fitur berguna yang bagus.

Kita melihat 'RoleName' dan 'statusName' yang dibawa melalui hubungan lagi didefinisikan pada
user model.

Ketika Anda memeriksa semua ini dalam browser Anda pada proyek Anda, perhatikan bagaimana
mudahnya untuk berpindah dari pengguna ke profil pandangan dengan memiliki barang-barang
terkait. Ini adalah praktek UI dan pengguna akhir yang baik akan menghargai itu.

Backend\views\user_form
Mari kita mendapatkan _form untuk tampilan pengguna diperbarui untuk memiliki dropdown.
Mengganti file yang ada dengan berikut:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/**
* @var yii\web\View $this
* @var common\models\User $model
* @var yii\widgets\ActiveForm $form
*/
?>
<div class="user-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'status_id')->dropDownList($model->statusList,
[ 'prompt' => 'Please Choose One' ]);?>
<?= $form->field($model, 'role_id')->dropDownList($model->roleList,
[ 'prompt' => 'Please Choose One' ]);?>
<?= $form->field($model, 'user_type_id')->dropDownList($model->userTypeList,
[ 'prompt' => 'Please Choose One' ]);?>
<?= $form->field($model, 'username')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'email')->textInput(['maxlength' => 255]) ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update',
['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

Ini adalah penggunaan sederhana dari widget ActiveForm, yang telah kita lihat sebelumnya ketika
kami melihat tampilan file pertama kami. Anda harus digunakan untuk format ini sekarang.
Perhatikan bahwa saya menggunakan 2 baris bukan satu untuk menghindari kesalahan
wordwrapping yang terjadi ketika buku ini mencoba untuk menyesuaikan wordwrap dalam kode.

Perhatikan penggunaan penolong kelas Html pada tombol submit. Sebuah pernyataan terner bagus
menentukan apakah catatan baru atau perlu diperbarui.

Satu hal lain untuk menunjukkan pada ini. Kami tidak perlu id tindakan pada formulir. Karena Yii 2 ini
kerangka logika, ia tahu apa model dan tindakan untuk mengasosiasikan formulir ini dengan,
berdasarkan lokasi dari file dan model diteruskan ke tampilan.

Hanya ketika formulir Anda lebih rumit yang Anda butuhkan untuk membuat model bentuk terpisah
saat itulah dibutuhkan sebuah id pada formulir, sehingga controller tahu model mana yang akan
digunakan. Kami melihat contoh ini dari situs controller, di mana ada banyak model bentuk yang
digunakan untuk hal-hal seperti contact, requestPasswordReset, dll

Deeper Changes to Backend


Anda mungkin memperhatikan bahwa kita mencolok dihindari mengubah tampilan indeks untuk
backend\views\profile dan backend\views\user. Ini karena kita ingin melakukan perubahan utama
widget GridView. Perubahan ini sedikit lebih dalam karena mereka akan melibatkan memodifikasi
model pencarian dan perubahan pada konfigurasi GridView.

Backend\views\user\index.php
Jadi mari kita mengganti file di backend\views\user\index.php dengan:

<?php
use yii\helpers\Html;
use yii\grid\GridView;
use \yii\bootstrap\Collapse;
/* @var $this yii\web\View */
/* @var $searchModel backend\models\search\UserSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$this->title = 'Users';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="user-index">
<h1><?= Html::encode($this->title) ?></h1>
<?php echo Collapse::widget([
'items' => [
// equivalent to the above
[
'label' => 'Search',
'content' => $this->render('_search', ['model' => $searchModel]) ,
// open its content by default
//'contentOptions' => ['class' => 'in']
],
]
]);
?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
//'id',
['attribute'=>'userIdLink', 'format'=>'raw'],
['attribute'=>'userLink', 'format'=>'raw'],
['attribute'=>'profileLink', 'format'=>'raw'],
'email:email',
'roleName',
'userTypeName',
'statusName',
'created_at',
['class' => 'yii\grid\ActionColumn'],
// 'updated_at',
],
]); ?>
</div>

Jadi jelas, dalam laporan penggunaan, kami termasuk:


use \yii\bootstrap\Collapse;

Ini mari kita menggunakan widget runtuh, yang kita gunakan untuk mengadakan membuat
pernyataan, yang membawa dalam bentuk parsial untuk pencarian. Efek bersih adalah bahwa hal itu
membersihkan halaman. Dalam pandangan ini, ketika Anda Gunaka mouse pencarian kata, ternyata
menjadi link. Klik, dan form pencarian turun ke bawah. Karena kita sudah dibahas widget runtuhnya
dalam bab sebelumnya, kita tidak akan pergi lagi.

Dalam widget GridView, kami meninggalkan beberapa atribut komentar untuk referensi. Anda dapat
melihat kami menambahkan userIdLink, userLink, ProflieLink, email:email, RoleName,
userTypeName, dan statusName. Ini adalah label yang kami berikan metode pada model Pengguna
atribut metode. Dalam kasus userIdLink, userLink, dan profileLink, kami memiliki format tertentu
yang kita harus menggunakan kembali link. Format email:email menciptakan link mailto, berguna
jika Anda ingin email pengguna.

Backend\views\profile\index.php
Mari kita melakukan sesuatu yang mirip untuk Profil, sementara kita berada di dalamnya. Paste
berikut ini ke backend\views\profile\index.php:

<?php
use yii\helpers\Html;
use yii\grid\GridView;
use \yii\bootstrap\Collapse;
/* @var $this yii\web\View */
/* @var $searchModel backend\models\search\ProfileSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$this->title = 'Profiles';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="profile-index">
<h1><?= Html::encode($this->title) ?></h1>
<?php echo Collapse::widget([
'items' => [
// equivalent to the above
[
'label' => 'Search',
'content' => $this->render('_search', ['model' => $searchModel]) ,
// open its content by default
//'contentOptions' => ['class' => 'in']
],
]
]); ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
//'id',
['attribute'=>'profileIdLink', 'format'=>'raw'],
['attribute'=>'userLink', 'format'=>'raw'],
'first_name',
'last_name',
'birthdate',
'genderName',
['class' => 'yii\grid\ActionColumn'],
// 'created_at',
// 'updated_at',
// 'user_id',
],
]); ?>
</div>
Widget GridView mirip dengan yang ada di tampilan indeks pengguna, tetapi dengan kolom kurang.

Ketika saya melakukan ini dalam alur kerja, saya melihat kita bisa menghubungkan atribut id ke
tampilan profil update, yang akan memberi kita cara cepat untuk memperbarui profil. Jadi saya
menambahkan metode berikut untuk model profil:

public function getProfileIdLink()


{
$url = Url::to(['profile/update', 'id'=>$this->id]);
$options = [];
return Html::a($this->id, $url, $options);
}

Juga ditambahkan pada model profil, label atribut berikut:


'profileIdLink' => Yii::t('app', 'Profile'),

Lalu akhirnya, saya komentar id dan 'profileIdLink' ke widget di backend\views\profile\index:


['attribute'=>'profileIdLink', 'format'=>'raw'],

Tapi sebagian besar ini jelas dilakukan sebelumnya, ketika kita menciptakan model. Setidaknya
sekarang Anda tahu mengapa kami melakukannya.

Sementara ini membuat kita link kami, kami tidak memiliki kemampuan semacam. Sejak penyortiran
adalah sesuatu yang kita inginkan, kita akan melakukan perubahan itu, tapi kami akan menunggu
untuk menambahkan bahwa karena kita harus membuat perubahan lain untuk model pencarian
pada waktu yang sama.

Backend\views\profile\_search.php
Sekarang mari kita pembaruan backend\views\profile\ _search.php. Mengganti seluruh isi file
dengan berikut:

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use frontend\models\Profile;
/**
* @var yii\web\View $this
* @var backend\models\search\ProfileSearch $model
* @var yii\widgets\ActiveForm $form
*/
?>
<div class="profile-search">
<?php $form = ActiveForm::begin([
'action' => ['index'],
'method' => 'get',
]); ?>
<?= $form->field($model, 'first_name') ?>
<?= $form->field($model, 'last_name') ?>
<?= $form->field($model, 'birthdate') ?>
<?= $form->field($model, 'gender_id')->dropDownList(Profile::getgenderList(),
[ 'prompt' => 'Please Choose One' ]);?>
<?php // echo $form->field($model, 'created_at') ?>
<?php // echo $form->field($model, 'updated_at') ?>
<?php // echo $form->field($model, 'user_id') ?>
<div class="form-group">
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
<?= Html::resetButton('Reset', ['class' => 'btn btn-default']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

Backend\views\user\_search.php
Ok, jadi sekarang kita beralih ke bekerja pada _search tampilan file untuk pengguna dan
backend\models\search\UserSearch.php. File UserSearch.php menyediakan model untuk
_search.php di backend\views\user\search.php, yang itu sendiri diberikan dalam
backend\views\user\index.php.

Pada dasarnya, itu adalah bentuk pencarian di bagian atas file indeks.

Mari kita mulai dengan mengganti isi _search.php dengan berikut:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use common\models\User;
/* @var $this yii\web\View */
/* @var $model backend\models\search\UserSearch */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="user-search">
<?php $form = ActiveForm::begin([
'action' => ['index'],
'method' => 'get',
]); ?>
<?= $form->field($model, 'id') ?>
<?= $form->field($model, 'username') ?>
<?php echo $form->field($model, 'email') ?>
<?= $form->field($model, 'role_id')->dropDownList(User::getroleList(),
[ 'prompt' => 'Please Choose One' ]);?>
<?= $form->field($model, 'user_type_id')->dropDownList(User::getuserTypeList(),
[ 'prompt' => 'Please Choose One' ]);?>
<?= $form->field($model, 'status_id')->dropDownList($model->statusList,
[ 'prompt' => 'Please Choose One' ]);?>
<div class="form-group">
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
<?= Html::resetButton('Reset', ['class' => 'btn btn-default']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

Satu hal yang mungkin perhatikan adalah bahwa di ActiveForm kami :: memulai metode, kita daftar
aksi dan metode. Alasan kami melakukan ini adalah bahwa kita berharap data dinamis dari
pengguna. Mereka akan mengirim mendapatkan variabel bersama untuk controller, jadi kita perlu
menentukan 'mendapatkan' sebagai metode. Ini adalah bagaimana tangan Gii kepada kami.
Dan Anda dapat melihat kami telah hampir tidak berubah file lain, kecuali untuk membuat daftar
dropdown dari metode pada model pengguna.

Sekarang jika Anda mencoba ini di browser, karya besar, tetapi Anda akan melihat bahwa dropdown
untuk userType menunjukkan pilihan, tetapi tidak menyaring hasil. Juga, kita perlu memastikan
bahwa kita ingin memuat hasil kami.

Eager loading, jika Anda ingat, adalah bagaimana kita menghindari n + 1 masalah, di mana
permintaan dibuat untuk setiap baris dari hasil. Dalam sebuah database di mana ada sejumlah besar
hasil, n + 1 masalah dapat membuat halaman tidak berguna karena akan mengambil selamanya, jika
pernah, kembali hasil.

Kami mendapatkan sekitar bahwa dengan eager loading. Kami akan melakukan ini ketika kita
memodifikasi model UserSearch.

Anda juga akan melihat bahwa kita mendapatkan Role name, bukan role_id. Hal ini membawa
melalui hubungan kita buat pada model pengguna. Tapi masalahnya adalah ini terlalu malas dimuat,
jadi kita harus mengubah model UserSearch kami untuk menjelaskan ini juga.

User Search
Model UserSearch merupakan perpanjangan dari User model, dalam hal ini User, bahwa controller
digunakan untuk menginstruksikan tentang cara untuk query model.

Metode utama adalah pencarian ($params), jadi mari kita lihat bahwa:

public function search($params)


{
$query = user::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
if (!($this->load($params) && $this->validate())) {
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
'role_id' => $this->role_id,
'status_id' => $this->status_id,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
]);
$query->andFilterWhere(['like', 'username', $this->username])
->andFilterWhere(['like', 'auth_key', $this->auth_key])
->andFilterWhere(['like', 'password_hash', $this->password_hash])
->andFilterWhere(['like', 'password_reset_token', $this->password_reset_token])
->andFilterWhere(['like', 'email', $this->email]);
return $dataProvider;
}
}

$params sedang diserahkan oleh formulir. Hal ini terjadi melalui UserController, yang dimulai
tindakan indeks sebagai berikut:
public function actionIndex()
{
$searchModel = new UserSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

Untuk menampilkan hasil, yang kita sebut sebuah contoh dari model, dalam hal ini baru
UserSearch();, kemudian menetapkan variabel $dataProvider sebagai contoh dari model, dengan
metode pencarian menyerahkan parameter permintaan melalui Yii:$app->request- >queryParams.
$dataProvider akan digunakan oleh pandangan widget untuk menampilkan hasil.

Yang penting untuk dicatat adalah bahwa ketika tindakan Indeks disebut, itu akan mencari
parameter dari bentuk dan menjalankan metode pencarian, bahkan jika tidak ada parameter
pencarian. Tanpa pencarian parameter, itu hanya mengembalikan semua catatan dari DB.

Jadi sekarang mari kita lihat metode pencarian secara rinci karena itu penting untuk mengetahui
bagaimana ini bekerja. Metode pencarian pada model UserSearch, dimulai dengan menetapkan
$query untuk User::find metode. Catatan: Anda mungkin melihat kasus yang lebih rendah u pada
pengguna ketika datang dari Gii, mungkin salah ketik dari Gii, tapi tetap, Anda akan melihatnya huruf
besar dalam kode saya berikan nanti.

Bagaimanapun, kembali ke metode pencarian di UserSearch. Setelah mengatur query untuk model
contoh, kita membuat sebuah instance dari kelas Yii ActiveDataProvider, menyerahkan query dalam
array konfigurasi.

$dataProvider = new ActiveDataProvider([


'query' => $query,
]);

ActiveDataProvider menciptakan iterator kuat dari hasil objek, dalam hal ini pengguna kasus, di
mana kita menemukan semua hasil, karena $query semula dijadwalkan untuk User::find();.

Setelah kita instantiate contoh ActiveDataProvider, kami memeriksa untuk melihat apakah kita
menambahkan parameter pencarian apapun melalui formulir, dan jika tidak, mengembalikan hasil
tanpa filter dari $query, yang seperti kita telah menyatakan, akan mengembalikan semua pengguna.

if (!($this->load($params) && $this->validate())) {


return $dataProvider;
}

Jika ada $params tangan dalam dari bentuk, maka kita mengevaluasi palsu, yang berarti kita belum
kembali $dataProvider, dan kami pindah ke blok berikutnya dan kemudian memanggil metode
andFilterWhere() pada Model pengguna, untuk menyaring parameter.

$query->andFilterWhere([
'id' => $this->id,
'role_id' => $this->role_id,
'status_id' => $this->status_id,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
]);

Berikutnya kita melihat panggilan lain untuk metode yang sama untuk menutupi like sebagai
parameter:
$query->andFilterWhere(['like', 'username', $this->username])
->andFilterWhere(['like', 'auth_key', $this->auth_key])
->andFilterWhere(['like', 'password_hash', $this->password_hash])
->andFilterWhere(['like', 'password_reset_token',
$this->password_reset_token])
->andFilterWhere(['like', 'email', $this->email]);

Anda dapat melihat bagaimana panggilan metode dirantai bersama-sama berturut-turut, dengan
titik koma pada baris terakhir. Lalu akhirnya, kita kembali $dataprovider:
return $dataProvider;

Jadi itulah dari versi kotak. Tapi kita perlu versi yang lebih kuat dari ini. Kita harus mendapatkan data
terkait dari Roles, UserType, dll dan kita perlu eager loading, jadi apa yang kita butuhkan adalah
sedikit lebih kompleks. Menggantikan model UserSearch tua dengan berikut:

<?php
namespace backend\models\search;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use common\models\User;
/**
* UserSearch represents the model behind the
*search form about `common\models\user`.
*/
class UserSearch extends User
{
/**
* attributes
*
* @var mixed
*/
public $roleName;
public $userTypeName;
public $user_type_name;
public $user_type_id;
public $statusName;
public $profileId;
/**
* @inheritdoc
*/
public function rules()
{
return [
[['id', 'role_id', 'status_id', 'user_type_id'], 'integer'],
[['username', 'email', 'created_at', 'updated_at', 'roleName',
'statusName','userTypeName', 'profileId',
'user_type_name'], 'safe'],
];
}
/**
* @inheritdoc
*/
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
/**
* Creates data provider instance with search query applied
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search($params)
{
$query = User::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
/**
* Setup your sorting attributes
* Note: This is setup before the $this->load($params)
* statement below
*/
$dataProvider->setSort([
'attributes' => [
'id',
'userIdLink' => [
'asc' => ['user.id' => SORT_ASC],
'desc' => ['user.id' => SORT_DESC],
'label' => 'User'
],
'userLink' => [
'asc' => ['user.username' => SORT_ASC],
'desc' => ['user.username' => SORT_DESC],
'label' => 'User'
],
'profileLink' => [
'asc' => ['profile.id' => SORT_ASC],
'desc' => ['profile.id' => SORT_DESC],
'label' => 'Profile'
],
'roleName' => [
'asc' => ['role.role_name' => SORT_ASC],
'desc' => ['role.role_name' => SORT_DESC],
'label' => 'Role'
],
'statusName' => [
'asc' => ['status.status_name' => SORT_ASC],
'desc' => ['status.status_name' => SORT_DESC],
'label' => 'Status'
],
'userTypeName' => [
'asc' => ['user_type.user_type_name' => SORT_ASC],
'desc' => ['user_type.user_type_name' => SORT_DESC],
'label' => 'User Type'
],
'created_at' => [
'asc' => ['created_at' => SORT_ASC],
'desc' => ['created_at' => SORT_DESC],
'label' => 'Created At'
],
'email' => [
'asc' => ['email' => SORT_ASC],
'desc' => ['email' => SORT_DESC],
'label' => 'Email'
],
]
]);
if (!($this->load($params) && $this->validate())) {
$query->joinWith(['role'])
->joinWith(['status'])
->joinWith(['profile'])
->joinWith(['userType']);
return $dataProvider;
}
$this->addSearchParameter($query, 'user.id');
$this->addSearchParameter($query, 'username', true);
$this->addSearchParameter($query, 'email', true);
$this->addSearchParameter($query, 'role_id');
$this->addSearchParameter($query, 'status_id');
$this->addSearchParameter($query, 'user_type_id');
$this->addSearchParameter($query, 'created_at');
$this->addSearchParameter($query, 'updated_at');
// filter by role
$query->joinWith(['role' => function ($q) {
$q->where('role.role_name LIKE "%' . $this->roleName . '%"');
}])
// filter by status
->joinWith(['status' => function ($q) {
$q->where('status.status_name LIKE "%' . $this->statusName . '%"');
}])
// filter by user type
->joinWith(['userType' => function ($q) {
$q->where('user_type.user_type_name LIKE "%' . $this->userTypeName . '%"');
}]);
return $dataProvider;
}
protected function addSearchParameter($query, $attribute, $partialMatch = false)
{
if (($pos = strrpos($attribute, '.')) !== false) {
$modelAttribute = substr($attribute, $pos + 1);
} else {
$modelAttribute = $attribute;
}
$value = $this->$modelAttribute;
if (trim($value) === '') {
return;
}
/*
* The following line is additionally added for right aliasing
* of columns so filtering happen correctly in the self join
*/
$attribute = "user.$attribute";
if ($partialMatch) {
$query->andWhere(['like', $attribute, $value]);
} else {
$query->andWhere([$attribute => $value]);
}
}
}

Ok, mari kita menangani binatang ini. Sepertinya banyak, tapi itu tidak buruk setelah Anda
memecahnya. Juga, saya harus mencatat bahwa saya belajar ini dengan mengikuti tutorial di wiki
oleh Kartik, penulis yang sama yang menulis widget sosial yang kita gunakan pada halaman rumah
aplikasi kita. Aku refactored hanya sedikit untuk banding kosmetik, dan kita mungkin tidak
mendapatkan banyak kejelasan dari itu, tapi setidaknya aku mencoba.

Hal pertama yang harus diperhatikan adalah bahwa kelas UserSearch meluas Pengguna, dan kami
memastikan untuk memasukkan dalam daftar kami atribut atribut-atribut yang direferensikan oleh
metode pada model, RoleName misalnya, karena kita tahu kita akan menggunakan daftar dropdown
untuk kembali nama peran. Jika ini tidak secara eksplisit tercantum sebagai atribut, istirahat bentuk
dan halaman tidak render. Jadi jika Anda menjalankan ke dalam jenis masalah, pastikan Anda
memiliki daftar lengkap dari atribut yang dibutuhkan. Hal ini tidak selalu jelas karena model induk
Pengguna seharusnya tahu semua atributnya dari infleksi suatu tempat di kelas dasar.

Apa yang saya temukan, menempatkan ini bersama-sama, adalah bahwa saya perlu menyatakan
atribut $user_type_id dan $user_type_name. Aku hanya tidak yakin mengapa. Saya menggunakan
atribut ini dalam klausul mana, jadi mungkin itu adalah sumber masalah, mungkin tidak dapat
menggunakan model orang tua di lokasi itu untuk mengidentifikasi atribut. Hal ini tentu saja, hanya
menebak.

Ketika Anda bekerja dengan kerangka besar seperti Yii 2, Anda kadang-kadang akan menjalankan
melawan hal-hal yang Anda tidak benar-benar mengerti. Ini ok, itu terjadi pada semua orang, saya
pasti bisa membuktikan bahwa secara pribadi. Yang penting adalah bahwa kita mencoba untuk
belajar sebanyak yang kita bisa sambil jalan karena ketika datang untuk menggunakan kerangka
kerja, pengetahuan adalah kekuatan.

Ok, di samping adalah aturan yang digunakan oleh validasi. Array pertama memberitahu kita yang
atribut yang bulat saja. Array kedua memberitahu yang atribut aman. Kita perlu aturan ini karena
metode setAttributes di class \yi\baseModel, yang mengabaikan atribut jika atribut tidak memiliki
setidaknya satu aturan validasi dan tidak ditandai aman dengan aturan yang aman. Jadi, ketika isi
$_POST dikirim ke metode, hanya nilai-nilai yang diterima akan diizinkan di.
Pokoknya, Gii termasuk array yang aman dalam aturan yang auto-generates, jadi saya telah terus
array ini, dan memastikan bahwa itu berisi atribut saat ini, yang selain yang pada model orangtua.
Sekali lagi saya harus menggunakan trial and error untuk memastikan aku memiliki apa yang saya
butuhkan.

Berikutnya kita memiliki metode skenario:

public function scenarios()


{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}

Metode ini memungkinkan Anda untuk memotong skenario orangtua, yang akan memungkinkan
Anda membuat skenario sendiri. Kami tidak akan menggunakan ini, jadi kami hanya akan
meninggalkannya di tempat., Karena ini adalah bagaimana Gii memberikannya kepada kita.

Berikutnya kita akan memiliki metode attributeLabels, tapi kita tidak perlu satu karena kita mewarisi
semua label atribut yang kita butuhkan dari model orang tua dan kami belum menambahkan
sesuatu yang baru yang akan membutuhkan satu.

Ok, mari kita lanjutkan pada metode pencarian:

public function search($params)


{
$query = User::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);

Ini adalah persis seperti kode Gii menghasilkan bagi kita, jadi tidak ada perubahan di sana. Kami
membuat sebuah instance dari Pengguna dengan metode find, yang akan mengembalikan semua
hasil. Kemudian kita membuat sebuah instance dari ActiveDataProvider dan menyuntikkan model
pengguna melalui $query. Jadi sekarang $dataProvider dimuat dengan model User dan semua
catatan itu. Kemudian, kita akan menggunakan controller untuk melewati $dataProvider ini ke
tampilan, di mana widget GridView dapat menggunakannya.

Ok, kembali ke model UserSearch dan metode pencarian.

Berikutnya kita mengambil metode setSort dari $dataProvider dan konfigurasikan agar kolom kita
ingin menjadi sortable di Grid akan memiliki perilaku yang kita inginkan:

$dataProvider->setSort([
'attributes' => [
'id',
'userIdLink' => [
'asc' => ['user.id' => SORT_ASC],
'desc' => ['user.id' => SORT_DESC],
'label' => 'ID'
],
'userLink' => [
'asc' => ['user.username' => SORT_ASC],
'desc' => ['user.username' => SORT_DESC],
'label' => 'User'
],
'profileLink' => [
'asc' => ['profile.id' => SORT_ASC],
'desc' => ['profile.id' => SORT_DESC],
'label' => 'Profile'
],
'roleName' => [
'asc' => ['role.role_name' => SORT_ASC],
'desc' => ['role.role_name' => SORT_DESC],
'label' => 'Role'
],
'statusName' => [
'asc' => ['status.status_name' => SORT_ASC],
'desc' => ['status.status_name' => SORT_DESC],
'label' => 'Status'
],
'userTypeName' => [
'asc' => ['user_type.user_type_name' => SORT_ASC],
'desc' => ['user_type.user_type_name' => SORT_DESC],
'label' => 'User Type'
],
'created_at' => [
'asc' => ['created_at' => SORT_ASC],
'desc' => ['created_at' => SORT_DESC],
'label' => 'Created At'
],
'email' => [
'asc' => ['email' => SORT_ASC],
'desc' => ['email' => SORT_DESC],
'label' => 'Email'
],
]
]);

Ini adalah bersih dan mudah dimengerti.

Maka kita mendapatkan sebuah pernyataan jika:

if (!($this->load($params) && $this->validate())) {


$query->joinWith(['role'])
->joinWith(['status'])
->joinWith(['profile'])
->joinWith(['userType']);
return $dataProvider;
}

Mari kita lihat jika:


if (!($this->load($params) && $this->validate()))

Kami melihat ini sebelumnya ketika kita melihat versi Gii memberi kami. Satu ini beroperasi dengan
cara yang sama. Apa yang tertulis adalah memuat parameter dan menjalankan metode validasi,
kemudian mengevaluasi benar atau salah. Ini ! dapat membingungkan, jadi saya akan menjelaskan
sepenuhnya.

Jika pernyataan bernilai true, hanya ada sejumlah kecil kode yang mengikuti pernyataan kembali. Hal
ini sangat mudah dibaca. Hanya untuk menjadi jelas, tidak ada parameter akan mengevaluasi benar,
maka Anda akan mengeksekusi blok kecil kode dengan pernyataan kembali.

Jika jika pernyataan mengevaluasi palsu, dan ada parameter yang diserahkan dari bentuk pencarian,
dan kami pindah ke blok berikutnya kode untuk mengikuti.

Ok, jadi mari kita berurusan dengan kondisi pertama benar:

Jika tidak ada parameter mengevaluasi benar dari jika pernyataan, menambahkan hubungan melalui
metode joinWith (untuk eager loading) dan kembali model dengan hubungan itu, disimpan dalam
$dataProvider, karena $query sudah disuntikkan ke $dataProvider. Controller akan melewati
$dataProvider untuk tampilan.

{
$query->joinWith(['role'])
->joinWith(['status'])
->joinWith(['profile'])
->joinWith(['userType']);
return $dataProvider;
}

Jika Anda perhatikan dengan teliti, Anda melihat bahwa jenis user memiliki modal 'T', yang berkaitan
dengan bagaimana model hubungan bernama. Jika Anda nama yang salah atau jika tidak ada
metode get untuk hubungan pada model pengguna, Anda akan mendapatkan error. Konvensi
penamaan memberikan huruf kapital untuk kata kedua dalam nama model ketika ada lebih dari satu
kata dalam model.

$query adalah turunan dari model User dan dikonfigurasi menjadi $dataProvider, sehingga bahkan
jika kita menyerahkan tanpa parameter, kita masih bisa menghasilkan tanpa filter. Jadi sekali lagi,
menjadi sangat jelas, jika tidak ada parameter untuk pencarian, kita kembali semua catatan
pengguna.

Catatan kami telah dirantai bersama model pengguna dengan 4 model lain, peran, status, profil, dan
jenis user, sehingga kami dapat beban bersemangat hasil kami, yang berarti kita akan tidak perlu
melakukan query terpisah untuk setiap baris dari hasil. Ini bergabung memungkinkan kita
sinkronisasi Pengguna dengan profil yang sesuai, role, dll

Eager loading adalah kebalikan dari beban malas, dan untuk catatan set besar, seperti catatan dalam
Model Pengguna misalnya, ini adalah lebih karena menempatkan mengurangi ketegangan pada DB.

Sekarang mari kita lihat semakin lama, kemungkinan lebih kompleks jika pernyataan. Jika if (!$This-
>load($params) && $this->validate())) pernyataan mengevaluasi palsu, ini berarti kita memiliki
parameter untuk pencarian, dan kami pindah ke blok berikutnya kode, di mana kita menggunakan
metode bernama addSearchParameter untuk menambahkan kondisi ke query:

$this->addSearchParameter($query, 'user.id');
$this->addSearchParameter($query, 'username', true);
$this->addSearchParameter($query, 'email', true);
$this->addSearchParameter($query, 'role_id');
$this->addSearchParameter($query, 'status_id');
$this->addSearchParameter($query, 'user_type_id');
$this->addSearchParameter($query, 'created_at');
$this->addSearchParameter($query, 'updated_at');

Anda dapat melihat kita menjalankan satu contoh dari metode untuk setiap atribut, dan 'id', kita
tentukan model untuk menghindari ambiguation. Jadi mari kita lihat metode addSearchParameter
untuk mendapatkan ide yang lebih baik dari apa yang terjadi:

protected function addSearchParameter($query, $attribute, $partialMatch = false)


{
if (($pos = strrpos($attribute, '.')) !== false) {
$modelAttribute = substr($attribute, $pos + 1);
} else {
$modelAttribute = $attribute;
}
$value = $this->$modelAttribute;
if (trim($value) === ' ') {
return;
}
/*
* The following line is additionally added for right aliasing
* of columns so filtering happen correctly in the self join
*/
$attribute = "user.$attribute";
if ($partialMatch) {
$query->andWhere(['like', $attribute, $value]);
} else {
$query->andWhere([$attribute => $value]);
}
}

Bagian pertama menentukan apakah ada '.' Dalam atribut. Saya menambahkan spasi untuk
membuatnya lebih mudah untuk membaca:

if (($pos = strrpos($attribute, '.')) !== false) {


$modelAttribute = substr($attribute, $pos + 1);
} else {
$modelAttribute = $attribute;
}

Jika memiliki sebuah '. ', Maka metode posisi atribut untuk parameter pencarian dengan benar,
sehingga tahu apa model dan apa atribut.

Dalam kasus atribut pertama kami menyerahkan, ada periode, user.id. Jadi ini memberitahu
parameter yang kita inginkan id dari model pengguna, yang menghilangkan masalah ambiguation,
karena tabel peran misalnya, juga memiliki kolom id. Ini adalah hal yang rumit dan tidak akan
bekerja dengan baik jika kita tidak melakukannya persis seperti ini.

Apakah itu memiliki sebuah '. 'Atau tidak, itu set $atribut $modelAttribute.

Baris berikutnya:
$value = $this->$modelAttribute;
Menetapkan nilai dari atribut. Hanya pengingat cepat tentang bagaimana ini bekerja.

Atribut diserahkan ke metode ini sebagai string ke $ atribut variabel, di mana ia diformat untuk
memperhitungkan apakah atau tidak ada periode.

Dalam kedua kasus, apakah atau tidak memiliki suatu masa atau tidak, variabel dinamai $
modelAttribute. Tapi ini masih merupakan string yang diserahkan melalui $ atribut. Jadi ketika kita
memanggil $this->$modelAttribute, kita memasukkan variabel mana string biasanya akan pergi.
Variabel $value mengambil hasil ekspresi ini, jenis apa pun itu, string, integer, bool.

Sebagai contoh, jika kita membaca $value = $this->name, itu akan menjadi lebih intuitif bagi kita
untuk mengharapkan $value memiliki username yang sebenarnya, yang merupakan string.
Sebaliknya kita punya $value = $this->$modelAttribute, yang besar karena kita dapat
menggunakannya untuk semua atribut dan itu akan berlalu format yang benar untuk variabel $value.

$this adalah mengacu ke sebuah contoh dari UserSearch, yang seperti kita tahu, meluas Pengguna,
sehingga $this dapat memiliki atribut bernama nama atau apapun yang lain kita berikan saat kita
disebut metode.

Sekarang Anda mungkin bertanya pada diri sendiri, jika Anda menggunakan string, misalnya,
bagaimana cara mengetahui nilai tertentu untuk kembali? Ini adalah teaser otak nyata bagi saya,
tidak begitu jelas dari menatap kode. Jawabannya adalah bahwa hal itu telah diperoleh nilai dari
bentuk:
if (!($this->load($params) && $this->validate()))

Ingat bahwa tidak! Pernyataan hanya mengevaluasi benar, memaksa pernyataan kembali, jika tidak
ada parameter. Jika ada parameter, itu berhasil menjalankan beban dan memvalidasi metode,
sehingga pada saat kita menggunakan nama field ini untuk mengatur permintaan kami dalam
metode addSearchParemter, model, $this yang ramah ini, sudah memiliki nilai-nilai yang kita
butuhkan.

Ah, begitu sederhana sekali kita melihat cara kerjanya. Saya tidak tahu apakah Anda berjuang di
atasnya seperti yang saya lakukan, tapi untuk kedua kepentingan kita, aku senang aku akhirnya
berhasil. Juga perhatikan, jika parameter tidak dapat memuat karena kegagalan validasi, ia akan
menampilkan bentuk dengan kesalahan. Namun tindakan ini berlangsung dalam controller, tidak
model.

Bagaimanapun, kembali ke metode addSearchParameter. Kami belum selesai itu:

Selanjutnya jika kosong:

if (trim($value) === ' ') {


return;
}

Dalam hal ini, itulah cara lain untuk mengatakan melakukan apa-apa, sehingga Anda tidak berakhir
dengan sekelompok kosong di mana laporan pada query. Sekali lagi harus jelas, jika lapangan
kosong, tidak akan ditambahkan sebagai parameter pencarian.

Jika tidak:

/*
* The following line is additionally added for right aliasing
* of columns so filtering happen correctly in the self join
*/
$attribute = "user.$attribute";

Komentar di atas garis menjelaskan bagian dari itu. Kami menetapkan nama tabel di depan atribut
untuk menghindari masalah ambigu. Karena metode ini berjalan satu atribut pada suatu waktu, kita
dapat dengan aman berasumsi bahwa $attribute memegang string yang kita maksudkan.

Ok, pada $partialMatch. Nilai default diatur ke false. Jadi pernyataan if ($partialMatch) akan
memeriksa untuk melihat apakah itu benar. Satu-satunya cara itu bisa benar adalah jika diserahkan
dengan cara itu. Jika Anda memeriksa daftar panggilan ke metode addSearchParmeter, Anda dapat
melihat bahwa username dan email yang diatur ke benar.

Pertandingan parsial yang berguna, terutama pada string, di mana pengguna tidak ingin atau
kadang-kadang bahkan tahu bagaimana untuk mengetik dalam pertandingan penuh.

Lagi pula, jika $partialMatch benar, maka menggunakan operator seperti dalam metode andWhere
(yang telah diwarisi dari tempat lain dalam rangka) untuk menambahkan pertandingan parsial untuk
mencari di:

if ($partialMatch) {
$query->andWhere(['like', $attribute, $value]);
}

Lain, menggunakan metode andWhere untuk menyerahkan atribut dan nilainya untuk query:
$query->andWhere([$attribute => $value]);

Ok, jadi atribut ditambahkan. Sekarang kita kembali ke tempat kami tinggalkan dalam metode
pencarian dan kami datang untuk bergabung yang akan memungkinkan kita untuk menyaring. Anda
dapat melihat bahwa untuk setiap satu, kita menambahkan penutupan, fungsi anonim, yang
mengikat di mana metode untuk model yang bergabung:

// filter by role
$query->joinWith(['role' => function ($q) {
$q->where('role.role_name LIKE "%' . $this->roleName . '%"');
}])
// filter by status
->joinWith(['status' => function ($q) {
$q->where('status.status_name LIKE "%' . $this->statusName . '%"');
}])
// filter by user type
->joinWith(['userType' => function ($q) {
$q->where('user_type.user_type_name LIKE "%' . $this->userTypeName . '%"');
}]);

Perhatikan bahwa kita metode the->joinWith, tapi kami memiliki komentar di antara, hati-hati, titik
koma penutupan hanya datang di akhir. Juga, perhatikan sintaks tanda kutip bersarang, berhati-hati
untuk mendapatkan yang benar. Sekali lagi, kita tahu model sudah memiliki nilai-nilai masukan dari
form, jadi ketika Anda melihat. $this->statusName, misalnya, menggunakan nilai yang datang dari
formulir.

Dan alhamdulillah itu berakhir. Aku lelah. Belajar pemrograman adalah menyenangkan, tetapi juga
kerja keras.
Kita perlu membuat perubahan mirip dengan ProfileSearch.php dan kita perlu memastikan kita
menambahkan semacam ini untuk profileIdLink:

'profileIdLink' => [
'asc' => ['profile.id' => SORT_ASC],
'desc' => ['Profile.id' => SORT_DESC],
'label' => 'ID'
],

Mari kita lihat file ProfileSearch.php dan menggantinya dengan:

<?php
namespace backend\models\search;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use frontend\models\Profile;
class ProfileSearch extends Profile
{
public $genderName;
public $gender_id;
public $userId;
public function rules()
{
return [
[['id', 'gender_id'], 'integer'],
[['first_name', 'last_name', 'birthdate', 'genderName','userId'], 'safe'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'gender_id' => 'Gender',
];
}
public function search($params)
{
$query = Profile::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->setSort([
'attributes' => [
'id',
'first_name',
'last_name',
'birthdate',
'genderName' => [
'asc' => ['gender.gender_name' => SORT_ASC],
'desc' => ['gender.gender_name' => SORT_DESC],
'label' => 'Gender'
],
'profileIdLink' => [
'asc' => ['profile.id' => SORT_ASC],
'desc' => ['Profile.id' => SORT_DESC],
'label' => 'ID'
],
'userLink' => [
'asc' => ['user.username' => SORT_ASC],
'desc' => ['user.username' => SORT_DESC],
'label' => 'User'
],
]
]);
if (!($this->load($params) && $this->validate())) {
$query->joinWith(['gender'])
->joinWith(['user']);
return $dataProvider;
}
$this->addSearchParameter($query, 'profile.id');
$this->addSearchParameter($query, 'first_name', true);
$this->addSearchParameter($query, 'last_name', true);
$this->addSearchParameter($query, 'birthdate');
$this->addSearchParameter($query, 'gender_id');
$this->addSearchParameter($query, 'created_at');
$this->addSearchParameter($query, 'updated_at');
$this->addSearchParameter($query, 'user_id');
// filter by gender name
$query->joinWith(['gender' => function ($q) {
$q->where('gender.gender_name LIKE "%' . $this->genderName . '%"');
}])
// filter by profile
->joinWith(['user' => function ($q) {
$q->where('user.id LIKE "%' . $this->userId . '%"');
}]);
return $dataProvider;
}
protected function addSearchParameter($query, $attribute, $partialMatch = false)
{
if (($pos = strrpos($attribute, '.')) !== false) {
$modelAttribute = substr($attribute, $pos + 1);
} else {
$modelAttribute = $attribute;
}
$value = $this->$modelAttribute;
if (trim($value) === '') {
return;
}
/*
* The following line is additionally added for right aliasing
* of columns so filtering happen correctly in the self join
*/
$attribute = "profile.$attribute";
if ($partialMatch) {
$query->andWhere(['like', $attribute, $value]);
} else {
$query->andWhere([$attribute => $value]);
}
}
}

Jadi sekarang, kita bisa kolom semacam di id ketika kita di backend\views\profile\index.php. Dan
dengan itu, kita harus memiliki segala sesuatu yang kita butuhkan untuk ProfileSearch.

Admin UI
Mari kita membuat perubahan ke backend\views\site\index. Kami ingin navigasi untuk membuat
tugas-tugas admin kita lebih mudah, jadi mari kita mengganti file lama dengan:

<?php
use yii\helpers\Html;
use common\models\ValueHelpers;
/**
* @var yii\web\View $this
*/
$this->title = 'Admin Yii 2 Build';
$is_admin = ValueHelpers::getRoleValue('Admin');
?>
<div class="site-index">
<div class="jumbotron">
<h1>Welcome to Admin!</h1>
<p class="lead">
Now you can manage users, roles, and more with
our easy tools.
</p>
<p>
<?php
if (!Yii::$app->user->isGuest
&&
Yii::$app->user->identity->role_id >=
$is_admin) {
echo Html::a('Manage Users', ['user/index'],
['class' => 'btn btn-lg btn-success']);
}
?>
</p>
</div>
<div class="body-content">
<div class="row">
<div class="col-lg-4">
<h2>Users</h2>
<p>
This is the place to manage users. You can edit status and roles from here.
The UI is easy to use and intuitive, just click the link below to get started.
</p>
<p>
<?php
if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >= $is_admin) {
echo Html::a('Manage Users', ['user/index'],
['class' => 'btn btn-default']);
}
?>
</p>
</div>
<div class="col-lg-4">
<h2>Roles</h2>
<p>
This is where you manage Roles. You can decide who is admin and w\
ho is not. You can
add a new role if you like, just click the link below to get started.
</p>
<p>
<?php
if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >= $is_admin) {
echo Html::a('Manage Roles', ['role/index'],
['class' => 'btn btn-default']);
}
?>
</p>
</div>
<div class="col-lg-4">
<h2>Profiles</h2>
<p>
Need to review Profiles? This is the place to get it done.
These are easy to manage via UI. Just click the link below to manage profiles.
</p>
<p>
<?php
if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >= $is_admin) {
echo Html::a('Manage Profiles', ['profile/index'],
['class' => 'btn btn-default']);
}
?>
</p>
</div>
</div>
<div class="row">
<div class="col-lg-4">
<h2>User Types</h2>
<p>
This is the place to manage user types. You can edit user
types from here. The UI is easy to use and intuitive, just
click the link below to get started.
</p>
<p>
<?php
if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >= $is_admin) {
echo Html::a('Manage User Types', ['user-type/index'],
['class' => 'btn btn-default']);
}
?>
</p>
</div>
<div class="col-lg-4">
<h2>Statuses</h2>
<p>
This is where you manage Statuses. You can add or delete.
You can add a new status if you like, just click the link
below to get started.
</p>
<p>
<?php
if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >= $is_admin) {
echo Html::a('Manage Statuses', ['status/index'],
['class' => 'btn btn-default']);
}
?>
</p>
</div>
<div class="col-lg-4">
<h2>Placeholder</h2>
<p>
Need to review Profiles? This is the place to get it done.
These are easy to manage via UI. Just click the link below
to manage profiles.
</p>
<p>
<?php
if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >= $is_admin) {
echo Html::a('Manage Profiles', ['profile/index'],
['class' => 'btn btn-default']);
}
?>
</p>
</div>
</div>
</div>
</div>
Kami membawa beberapa class untuk membantu kami:

use yii\helpers\Html;
use common\models\ValueHelpers;

Kelas pembantu mari kita memformat url dengan berikut:


echo Html::a('Manage Roles', ['role/index'], ['class' => 'btn btn-default']);

Seperti yang kami lakukan di bab terakhir, kita menggunakan metode Html class.

Karena kita ingin konsisten, kami telah dibungkus setiap link dalam pernyataan Jika kami, untuk
menguji apakah pengguna sebenarnya admin atau lebih besar:

if (!Yii::$app->user->isGuest
&& Yii::$app->user->identity->role_id >=$is_admin) {
echo Html::a('Manage Profiles', ['profile/index'],
['class' => 'btn btn-default']);
}

Seperti yang kita lakukan dengan halaman sebelumnya, kita menetapkan variabel $is_admin dekat
bagian atas file di bawah variabel judul:
$is_admin = ValueHelpers::getRoleValue('Admin');

Seperti yang Anda ingat, kita melakukannya dengan cara ini karena kami hanya ingin satu query
untuk menemukan nilai Admin, yang merupakan lebih efisien penggunaan sumber daya.

Ini bukan solusi keamanan lengkap karena jika seseorang telah entah bagaimana login ke backend
tanpa peran dari Admin atau lebih besar, mereka masih bisa mengetik di url, jadi kita harus
menambahkan logika ke controller juga.

Controller Behaviors
Kami akan melakukannya sekarang, melalui metode perilaku pada
backend\controllers\SiteController.php. Seperti yang telah kita tampilkan dalam bab sebelumnya, Yii
2 menyediakan parameter matchCallback pada aturan di Access:Control dan bekerja sempurna
untuk tujuan kita. Mari kita menggantikan metode perilaku yang ada dengan berikut:

public function behaviors()


{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['index'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return PermissionHelpers::requireMinimumRole('Admin')
&& PermissionHelpers::requireStatus('Active');
}
],
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['get','post'],
],
],
];
}

Jangan lupa untuk menambahkan pernyataan penggunaan di bagian atas file:


use common\models\PermissionHelpers;

Match Callback
Kami menambahkan aturan matchCallback untuk menutupi kondisi di mana perubahan statusnya
pengguna atau akses tingkat setelah mereka login. Jika Anda harus mengahapus salah satu tingkat
akses, Anda tidak ingin mereka memiliki akses residu bahwa mereka seharusnya tidak megakses.

Kita perlu membuat perubahan pengendali kami yang lain juga, dan kami akan menjelaskan aturan
secara rinci setelah perubahan dilakukan. Pengendali backend untuk User, UserType, Status, Profile,
dan Role yang sedikit berbeda dari contoh sebelumnya dan memerlukan kode ditambahkan dengan
metode behaviors berikut:

public function behaviors()


{
return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['index', 'view','create', 'update', 'delete'],
'rules' => [
[
'actions' => ['index', 'view',],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return PermissionHelpers::requireMinimumRole('Admin')
&& PermissionHelpers::requireStatus('Active');
}
],
[
'actions' => [ 'update', 'delete'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return PermissionHelpers::requireMinimumRole('SuperUser')
&& PermissionHelpers::requireStatus('Active');
}
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}

Pastikan bahwa metode perilaku di tempat untuk masing-masing kontroler yang disebutkan di atas.
Untuk matchCallback, kami menyediakan kondisi:

'matchCallback' => function ($rule, $action) {


return PermissionHelpers::requireMinimumRole('Admin')
&& PermissionHelpers::requireStatus('Active');

jika itu bernilai false, kita tidak cocok dan kami mendapatkan respon "Anda tidak memiliki izin untuk
melihat halaman ini". Ini adalah penggunaan kembali lain dari metode PermisssionHelpers, yang
berarti kita mendapatkan beberapa penggunaan kembali kode yang baik dari itu. Fakta bahwa kita
membuat fungsi public static berarti kita dapat menyebutnya mana saja kita membutuhkannya,
selama kita meliputi:
use common\models\PermissionHelpers;

Jadi dengan metode pengontrol kami di tempat, kita memiliki jumlah yang layak keamanan untuk
menghentikan seseorang yang tidak memliki akses proses admin. Seperti yang kita pikir itu melalui,
kami terealisasi diperlukan untuk memeriksa status juga. Bagaimana jika status seseorang
diturunkan saat sesi terbuka? Mereka masih akan memiliki akses ke metode pengendali karena
statusnya hanya diperiksa ketika mereka login. Hal ini penting di frontend juga. Jadi, misalnya, jika
Anda membangun sebuah situs misalnya, di mana pengguna bisa membatalkan account mereka,
Anda tidak akan ingin mereka untuk berkeliling ke daerah-daerah dari situs yang diperlukan status
aktif.

Perhatikan bahwa kita memeriksa untuk melihat apakah pengguna status_id adalah sama dengan
nilai status aktif. Pastikan Anda menggunakan operator yang tepat, yang merupakan ==, dan tidak =,
yang hanya akan memberikan nilai dan tidak menguji untuk itu, karena itu kesalahan pemrograman
umum.

Kami seharusnya mengubah perilaku dalam frontend dalam bab sebelumnya, jadi jika Anda belum
silakan kembali dan melakukannya sekarang.

Ok, akhirnya kita memiliki bekerja kembali akhir kami. Sekarang kita dapat memeriksa halaman
index baru kami untuk admin ketika kita login:
Summary

Nah, itu saja. Anda sekarang memiliki template diperpanjang dibuat dari template advanced Yii 2 ini.
Kita membahas banyak tanah dengan buku ini, cukup untuk membuat Anda bangun dan berjalan,
yang tujuan kami. Anda harus dapat menggunakan template dari buku ini untuk memulai proyek
Anda sendiri.

Buku ini adalah buku pemula, jadi ini benar-benar hanya awal untuk Anda dalam perjalanan Anda
dengan Yii 2. Untuk melanjutkan perjalanan, Anda harus berkonsultasi panduan dan forum untuk
informasi lebih lanjut tentang cara menggunakan framework.

Jika Anda menyukai buku ini, silahkan merekomendasikan hal ini kepada teman-teman. Anda dapat
mengunjungi blog saya dan meninggalkan umpan balik dan komentar juga, mereka sangat dihargai.

Terima kasih untuk mengambil perjalanan ini dengan saya. Saya berharap untuk melihat Anda
segera.
About The Author
Bill Keck telah mengembangkan aplikasi web sejak tahun 1999. Pada tahun 2005, ia diundang untuk
berbicara di kampus Google di Mountain View karena kertas putih pribadi ia menulis. Saat ini ia
adalah CEO dari SERRF Corp, sebuah perusahaan yang memanfaatkan Yii secara luas dalam produk-
produknya. Dia sangat percaya pada kerangka Yii 2 dan berkonsultasi dengan pengembang tentang
cara untuk mengambil keuntungan dari semua efisiensi dalam pembangunan penawaran Yii 2.

Anda mungkin juga menyukai