() translation by (you can also view the original English article)
Saya telah melihat beberapa tutorial pengantar untuk Codeigniter, dan berharap untuk menunjukkan sesuatu yang sedikit lebih advanced. Tutorial ini akan menunjukkan kepada Anda bagaimana untuk membuat aplikasi web yang powerful untuk hosting gambar, menggunakan fleksibilitas Codeigniter. Tutorial ini harus mengajar Anda tentang MVC coding philosophu, integral untuk memproduksi serviceable aplikasi.
Langkah 1: Setup
Sebelum kita pergi ke dekat kode, kita perlu melakukan beberapa setup. Jalankan editor favorit database Anda (saya akan menggunakan SQLBuddy) dan membuat database baru yang disebut 'uploadr'. Dalam hal ini, membuat dua tabel: 'users' dan 'files'. Mengatur users untuk memiliki sebuah kolom primary-key, auto-increment 'id', bersama dengan dua kolom varchar: 'password' dan 'username'. Tabel files kebutuhan lain kolom 'id' (lagi primay-key dan auto-increment), serta kolom 'owner' integer, dan kolom 'name' varchar.



Karena tutorial ini dipusatkan pada belajar pemrograman Codeigniter dan tentang MVC, kita akan melupakan semua styling stuff (seperti CSS, photoshop). Untuk tujuan ini, saya telah membuat custom Codeigniter memasang untuk Anda, dengan semua file yang dibuat, dan views (kebanyakan) HTML-d dan CSS-d. Dua hal yang Anda akan perlu untuk mengubah adalah pengaturan konfigurasi dan database. Saya bahkan termasuk prangko "Beta", sehingga akan merasa lebih seperti web-startup!



Langkah 2: pendaftaran
Sekarang ke daging pertama! Membuka 'login.php' controller dan membuat fungsi disebut 'register'. Ini akan mengontrol proses pendaftaran. Pertama, kita perlu memeriksa apakah permintaan POST telah dikirim ke server. Dalam kasus ini, ini akan berarti seseorang yang mencoba untuk mendaftar. Kita dapat melakukan ini dengan memeriksa apakah $_POST ['username'] di set.. Jika ya, maka kita tahu ada yang sudah mencoba untuk mendaftar, dan bisa masuk ke dalam DB.
1 |
|
2 |
function register() |
3 |
{
|
4 |
if(isset($_POST['username'])){ |
5 |
|
6 |
// User has tried registering, insert them into database.
|
7 |
|
8 |
$username = $_POST['username']; |
9 |
$password = $_POST['password']; |
10 |
|
11 |
$this->users->register($username, $password); |
12 |
|
13 |
redirect('login'); |
14 |
|
15 |
}
|
16 |
else{ |
17 |
//User has not tried registering, bring up registration information.
|
18 |
$this->load->view('register'); |
19 |
}
|
20 |
}
|
Jika pengguna belum mencoba mendaftar, itu mendeteksi ini dan secara otomatis mengirimkan mereka ke 'register' view bahwa aku telah dikodekan untuk Anda. Anda akan melihat baris:
1 |
$this->users->register($username,$password); |
Ini memanggil fungsi 'register' dalam model 'User'. Pada saat ini tidak akan bekerja, karena kita belum dimuat model. Kita melakukan ini dengan cara yang sama sebagai loading view, tetapi karena kita akan menggunakan model ini secara ekstensif sepanjang kelas ini, kami akan muat di fungsi constructor (fungsi dengan nama yang sama sebagai kelas), sehingga selalu dimuat dan tersedia :
1 |
function Login() |
2 |
{
|
3 |
parent::Controller(); |
4 |
$this->load->model('users'); |
5 |
}
|
Anda mungkin tertarik pada fungsi pendaftaran berisi apa. Yah, hanya menggunakan beberapa CI active record, yang memungkinkan untuk manipulasi DB. Keuntungan besar menggunakan Codeigniter dibangun di fungsi active recod (selain fakta bahwa mereka sedang bagus dan sederhana) adalah bahwa mereka database agnostik: Anda dapat dengan mudah beralih database yang masuk dan keluar berbeda jenis (misalnya mySQL, SQLite) dalam DB config file tanpa mempengaruhi aplikasi. Dalam kasus pendaftaran kami, kami menambahkan sebuah entri ke table users . Membuat fungsi ini di 'users.php' Model:
1 |
function register($username, $password) |
2 |
{
|
3 |
$new_user = array ( |
4 |
'username'=>$username, |
5 |
'password'=>$password |
6 |
);
|
7 |
|
8 |
$this->db->insert('users', $new_user); |
9 |
|
10 |
return true; |
11 |
}
|
Satu-satunya hal yang harus diingat dalam view pendaftaran adalah fungsi site_url() dan base_url(). Ini masing-masing memberikan URL situs Anda dengan dan tanpa index.php/ akhiran. Keuntungan terbesar mereka adalah bahwa Anda dapat mengubah struktur URL situs Anda tanpa harus pergi melalui semua link: ini hanya membutuhkan waktu satu perubahan dalam config file.
Setelah ini semua setup, kita bisa mencoba mendaftarkan account. Fungsi dalam controller kami harus mengarahkan kita ke halaman login lagi setelah akun dibuat.
Langkah 3: Login
Sekarang bahwa kita memiliki beberapa pengguna yang mengatur, kita membutuhkan cara yang benar-benar membiarkan mereka ke situs. Untuk ini, kita akan menggunakan Codeigniter di session kelas. Meskipun hal ini benar-benar menggunakan cookie, ia bekerja dalam cara yang sangat mirip dengan sesi PHP normal, hanya dengan lebih banyak pilihan (saya sarankan Anda memeriksa userguide).
Untuk mulai dengan, kita perlu membuat fungsi tombol login saat ini menunjukkan, 'go'. Fungsi ini akan perlu untuk mengumpulkan informasi yang disampaikan bentuk, dan kemudian memeriksa terhadap DB menggunakan model. Jika semua sudah benar, itu akan mulai session, dan mengarahkan pengguna ke file mereka. Jika mereka salah ketik informasi mereka, mereka akan diarahkan ke halaman login.
1 |
function go() |
2 |
{
|
3 |
|
4 |
$username = $_POST['username']; |
5 |
$password = $_POST['password']; |
6 |
|
7 |
//Returns userid if successful, false if unsuccessful
|
8 |
$results = $this->users->login($username,$password); |
9 |
|
10 |
if ($results==false) redirect('login'); |
11 |
else
|
12 |
{
|
13 |
$this->session->set_userdata(array('userid'=>$results)); |
14 |
redirect('profile'); |
15 |
}
|
16 |
|
17 |
}
|
Bagian dari fungsi ini harus sangat akrab bagi Anda dari daftar fungsi: mengumpulkan $username dan $password, sebelum mengirimkan mereka ke model (waktu ini ' login'). Setelah ini namun, perbedaan mulai terjadi.
Ia kemudian memeriksa untuk melihat jika login gagal; Jika tidak, maka user diarahkan kembali ke halaman login. Namun, jika login berhasil maka script membuat session, setting 'userid' untuk id user. Semua yang kita butuhkan sekarang untuk login script untuk bekerja adalah model. Tambahkan fungsi ini model 'users' yang kita digunakan sebelumnya:
1 |
function login($username, $password) |
2 |
{
|
3 |
|
4 |
$query = $this->db->get_where('users', array('username'=>$username, 'password'=>$password)); |
5 |
|
6 |
if ($query->num_rows()==0) return false; |
7 |
else{ |
8 |
$result = $query->result(); |
9 |
$first_row = $result[0]; |
10 |
$userid = $first_row->id; |
11 |
|
12 |
return $userid; |
13 |
}
|
14 |
|
15 |
}
|
Cepat Ikhtisar: pertama, itu query database mencari setiap users dengan username dan password yang sama. Jika tidak menemukan apapun, maka jumlah baris akan 0, dan fungsi mengembalikan false. Jika seseorang itu ditemukan, kemudian menggunakan salah satu fungsi catatan CI aktif untuk load itu sebagai objek. Objek ini datang sebagai array DB baris, masing-masing berisi sebuah objek dengan informasi baris. Karena kami ingin pertama dan hanya baris, kita ambil itu dari $result, dan kemudian kembali id dari itu.
Kita akan perlu untuk memeriksa apakah user masuk sementara pada halaman profil. Untuk melakukan ini, kita hanya memasukkan dua baris kode ke konstruktor controller profil. Ini akan memeriksa bahwa session berisi userid. Terakhir, file yang perlu ditambahkan ke database. Jika tidak, maka semua baik, dan itu akan berubah menjadi sebuah variabel public. Sementara kami sedang mengubah konstruktor, kami akan memuat dua model yang kami perlukan untuk halaman profil:
1 |
function Profile() |
2 |
{
|
3 |
parent::Controller(); |
4 |
|
5 |
$this->load->model('users'); |
6 |
$this->load->model('files'); |
7 |
|
8 |
$this->userid = $this->session->userdata('userid'); |
9 |
if (!isset($this->userid) or $this->userid=='') redirect('login'); |
10 |
}
|
Hal terakhir yang perlu kita lakukan adalah membuat logout. Hal ini dicapai dengan setting userid menjadi kosong untuk menghapusnya. Semua itu membutuhkan adalah salah satu fungsi sederhana:
1 |
function logout() |
2 |
{
|
3 |
$this->session->set_userdata(array('userid'=>'')); |
4 |
redirect('login'); |
5 |
}
|
Langkah 4: Melihat dan meng-upload file
kemudian, kami hanya login untuk pertama kalinya. Apa yang akan kami disambut dengan?



Tidak buruk, tidak buruk, meskipun itu 'sampel file' tidak sedang dihasilkan dari database kami, itu statis. Kami akan memperbaiki segera, tapi pertama kita perlu mengubah hak akses folder 'file' sehingga Codeigniter dapat membaca dan menulis di atasnya. Saya mengubah 777 permission:

Sekarang bahwa itu keluar dari jalan, mari kita kembali ke coding! Kita perlu untuk memuat semua file users dari database, dan untuk melakukan bahwa kita akan membutuhkan...
... model! Kali ini namun, kami akan membuat itu dalam 'files.php' model, jadi kita tetap user table dan file tabel kami terpisah. Tambahkan fungsi ini:
1 |
function get($userid) |
2 |
{
|
3 |
$query = $this->db->get_where('files', array('owner'=>$userid)); |
4 |
return $query->result(); |
5 |
}
|
Ini sekali lagi menarik dari bagian-bagian awal dari tutorial ini, sehingga Anda harus dapat memahaminya. Pada dasarnya, ia mendapat semua baris mana pemilik = id user, dan mengembalikan mereka dalam sebuah array yang bagus dari objek. Mari kita membuat sesuatu dalam controller 'profiles' untuk antarmuka dengan itu, dan untuk menyampaikan info ke view. Mengubah fungsi index dengan ini:
1 |
function index() |
2 |
{
|
3 |
$data['files'] = $this->files->get($this->userid); |
4 |
$this->load->view('profile', $data); |
5 |
}
|
Sekali lagi, fungsi sangat sederhana. ini akan membawa result dari file model, dan dikirim ke tampilan. CodeIgniter mengirim data ke tampilan biasanya melalui array (dalam kasus ini data). Ini kemudian akan secara otomatis explode array yang menjadi banyak variabel, sehingga ketika kita pergi ke view, akan dapat mengakses hasil database melalui $file, daripada $data ['file']. Mari kita menempatkan hasil indah database ini ke view! Fokus ke 'profile.php', mengganti kode yang komentar HTML memberitahu Anda.
1 |
<?php foreach($files as $file): ?> |
2 |
|
3 |
<div class="section"> |
4 |
<span><?=$file->name?></span> |
5 |
<div style="float: right;"> |
6 |
<span><a href="<?=base_url()?>files/<?=$file->name?>">View</a></span> |
7 |
<span><a href="<?=site_url("profile/delete/".$file->id)?>">Delete</a></span> |
8 |
</div>
|
9 |
</div>
|
10 |
|
11 |
<?php endforeach; ?> |
Foreach loop load setiap baris array pada gilirannya, dan membuatnya dapat diakses melalui $file objek. Kemudian, kita menggunakan sampel "section" sebagai template, mengisi semua link dan nama dengan informasi untuk objek $file baru. Kami akan bagaimana menghapus fungsi bekerja kemudian, dan bagaimana link lihat bekerja setelah kita meng-upload sesuatu.
Jika Anda membuka dalam browser Anda sekarang, Anda tidak akan melihat apa-apa. Hal ini karena kami tidak punya file upload! Yah, kita perlu untuk memperbaiki itu, jadi kita akan perlu untuk membuat form upload. Mari kita lakukan controller pertama; Buka 'profile.php' dan menambahkan fungsi ini:
1 |
function upload() |
2 |
{
|
3 |
if(isset($_FILES['file'])){ |
4 |
$file = read_file($_FILES['file']['tmp_name']); |
5 |
$name = basename($_FILES['file']['name']); |
6 |
|
7 |
write_file('files/'.$name, $file); |
8 |
|
9 |
$this->files->add($name); |
10 |
redirect('profile'); |
11 |
}
|
12 |
|
13 |
else $this->load->view('upload'); |
14 |
}
|
Fungsi ini menambahkan beberapa hal-hal baru: terutama CI file handling. Hotel ini dimulai cukup sederhana, memeriksa untuk melihat apakah form yang telah disubmit dan mencari sebuah file. Jika file tidak ada, itu hanya menunjukkan tampilan upload (yang kami akan update berikutnya). Jika file ada, maka itu baca file sementara yang server telah menghasilkan. Direktori file sementara dapat ditemukan di $_FILES ['your_file'] ['tmp_name'], dan file yang dapat dibaca dari direktori ini oleh read_file CI. Ini memuat semua informasi file ke variabel $file.
Baris berikutnya mendapatkan nama file dari global $_FILES dengan cara yang sama untuk mendapatkan direktori sementara. Bersenjata dengan dua potong informasi, codeigniter menulis file ke folder file dalam direktori yang sama sebagai index file. Terakhir, file yang perlu ditambahkan ke database. Sekali lagi, kita akan ini dengan model, kali ini fungsi 'add' dalam 'files'. Kita akan melihat bagaimana yang bekerja dalam hitungan menit, tapi sekarang kita harus membuat form upload dalam view. Tambahkan ini di mana ' upload.php's HTML komentar memberitahu Anda:
1 |
<form enctype="multipart/form-data" action="<?=site_url('profile/upload')?>" method="post"> |
2 |
|
3 |
<div id="boxtop"></div><div id="boxmid"> |
4 |
|
5 |
<div class="section"> |
6 |
<span>File:</span> |
7 |
<input type="file" name="file" /> |
8 |
</div>
|
9 |
|
10 |
</div><div id="boxbot"></div> |
11 |
|
12 |
<div class="text" style="float: left;"><p>Before uploading, check out</p><p>the <a href=#>Terms of Service</a>.</p></div> |
13 |
<div class="text" style="float: right;"> |
14 |
|
15 |
<input type="submit" value="Upload" name="upload" class="submit" /> |
16 |
</div>
|
17 |
<br style="clear:both; height: 0px;" /> |
18 |
|
19 |
</form>
|
Menggantikan HTML saat ini dengan ini. Hal yang penting untuk dicatat di sini adalah bahwa ketika kita meng-upload file, kita menggunakan jenis input = file, yang memungkinkan kita untuk memilih file untuk di upload. Juga, kita harus menentukan enctype di tag form kami, sehingga server tahu bahwa itu adalah menerima file dan menyimpannya. Tidak terlalu menarik kepada kita coders back-end, tetapi masih penting! Mari kita memiliki sebuah cepat melihat apa yang kami buat:



Sekarang kita beralih ke sedikit akhir file upload script, model. Ini menambahkan file ke database, dengan nama dan pemilik, sehingga server tahu file mana milik siapa. Mari kita lihat; menambahkan ini ke model 'files' Anda:
1 |
function add($file) |
2 |
{
|
3 |
$this->db->insert('files', array('owner'=>$this->session->userdata('userid'),'name'=>$file )); |
4 |
}
|
Lagi memanfaatkan fungsi active record CI, kita menambahkan baris ke database dengan nama file dan pemilik. Kita mendapatkan pemilik dengan mencari id pengguna dari session data yang kami simpan sebelumnya saat logon. Semua dalam semua, fungsi sangat sederhana. Mari kita mencoba mengunggah foto yang bagus, eh?



Et, Voila!



Melihat ke folder 'files', kita melihat bahwa file yang kita upload telah muncul di sana, seolah-olah oleh sihir (Codeigniter magic!), dan kita melihat mengapa link lihat bekerja, karena ia hanya menunjuk langsung ke file dalam direktori. Dengan melakukan ini, semua yang tersisa untuk tutorial ini adalah menghapus file.
Langkah 5: Menghapus berkas
OK, terakhir sedikit. Ini tidak boleh begitu lama, karena Anda akan mampu memanfaatkan ide-ide yang Anda pelajari sebelumnya untuk memahami hal ini. Pertama kami akan menambahkan kode ini ke controller 'profiles:
1 |
function delete($id) |
2 |
{
|
3 |
//This deletes the file from the database, before returning the name of the file.
|
4 |
$name = $this->files->delete($id); |
5 |
unlink('files/'.$name); |
6 |
redirect('profile'); |
7 |
}
|
Dan kode ini untuk model 'files' kami:
1 |
function delete($fileid) |
2 |
{
|
3 |
$query = $this->db->get_where('files',array('id'=>$fileid)); |
4 |
$result = $query->result(); |
5 |
$query = $this->db->delete('files', array('id'=>$fileid)); |
6 |
return $result[0]->name; |
7 |
}
|
Controller pertama harus sangat mudah untuk memahami. Itu memanggil fungsi delete dari model file (yang kita didefinisikan pada waktu yang sama), yang menghasilkan nama file. Kemudian menggunakan fungsi PHP dasar untuk menghapus file dengan nama itu di direktori file. Pada dasarnya, ia mendapat semua baris mana pemilik = id pengguna, dan mengembalikan mereka dalam sebuah array yang bagus dari objek.
Model sedikit lebih rumit. Perlu untuk mengembalikan nama file serta menghapus itu, jadi pertama itu query database untuk mendapatkan rincian file. Itu load ke dalam variabel $result, dan kemudian melanjutkan untuk menghapus file. Kemudian kembali kolom 'name' baris pertama dari array (baris hanya query kembali), yang kemudian digunakan di controller di atas.
Mari kita mencoba untuk menghapus fungsi:



Dan klik delete...



Hore! Itu bekerja. Saya kira kita semua selesai kemudian!
Terakhir..
Menghapus file
Tentu saja, kode ini tidak dapat dijalankan pada server tanpa beberapa perbaikan yang serius. Berikut adalah beberapa masalah utama dengan itu:
- Password semua tidak terenkripsi. Ini berarti bahwa jika seseorang harus break ke dalam database Anda, mereka akan bisa mencuri semua data pengguna Anda dengan sedikit usaha. Aku yakin Anda akan setuju: tidak baik. Ini dapat dengan mudah diselesaikan dengan menambahkan beberapa hashing sederhana untuk password.
- File tidak private. Pengguna mungkin ingin memastikan bahwa file yang mereka upload hanya terlihat oleh mereka, dan bukan oleh seseorang yang hanya menebak sekelompok URL. Ini mungkin akan memerlukan lain controller untuk melayani file (yang memeriksa data session).
- Script tidak memeriksa bahwa file yang ada sebelum menulis file. Ini dapat menyebabkan konflik dengan file Anda, atau dapat berakibat dalam file data yang ditimpa. Mana: tidak baik. Ini dapat diselesaikan dengan cek DB sederhana untuk memastikan bahwa file belum diambil, dan bisa diminimalkan dengan memberikan pengguna direktori mereka sendiri dalam folder file.
- Tidak ada kesalahan yang dihasilkan. Ini tidak persis membantu pengguna menemukan apa yang mereka lakukan salah, dan meskipun ini tidak terlalu bermasalah pada seperti kecil situs dengan tindakan terbatas seperti itu, itu masih dapat ditingkatkan.
Semua dalam semua, Anda telah membuat cukup kuat sedikit aplikasi web, terutama karena jumlah kecil kode yang Anda harus menulis. Karena sifat Codeigniter's, itu cukup mudah untuk di extend, baik untuk menyelesaikan masalah di atas, dan menambah fitur baru, seperti mengubah nama file. Saya juga berharap bahwa tutorial ini mengajarkan Anda sedikit tentang menggunakan konsep-konsep MVC, dan powert yang mereka bawa: oleh hanya disesuaikan model pada aplikasi kita, kita bisa bertukar kami DB untuk teks file, XML atau apa pun, dan dengan mengubah view, kita dapat benar-benar re-tema tanpa merusak functionality. Menakjubkan!
- Berlangganan ke NETTUTS RSS Feed untuk daily web development tuts dan artikel.