Bagian Berita

Pada bagian terakhir, kita mempelajari beberapa konsep dasar dari framework dengan menulis sebuah class yang meliputi halaman statis. Kita membersihkan URI dengan menambahkan rule routing kustom. Sekarang saatnya untuk mengenal konten dinamis dan mulai menggunakan database.

Menyiapkan Model Anda

Alih-alih menulis operasi database di controller, query seharusnya ditempatkan dalam model, sehingga mereka dapat dengan mudah digunakan kembali nanti. Model adalah tempat di mana Anda mengambil, menambahkan, dan memperbarui informasi Anda di database atau menyimpan data lainnya. Mereka mewakili data Anda.

Buka direktori application/models/ dan buat file baru yang bernama News_model.php dan tambahkan kode berikut. Pastikan Anda sudah menkonfigurasi database Anda dengan benar seperti yang dijelaskan disini.

<?php
class News_model extends CI_Model
{

        public function __construct()
        {
                $this->load->database();
        }
}

Kode ini terlihat mirip dengan kode controller yang digunakan sebelumnya. Kode diatas menciptakan model baru dengan memperluas CI_Model dan memuat library database. Ini akan membuat class database yang tersedia melalui objek $this->db.

Sebelum melakukan query ke database, skema database harus dibuat terlebih dahulu. Hubungkan ke database Anda dan jalankan perintah SQL di bawah ini (MySQL). Yang juga akan menambahkan beberapa record.

CREATE TABLE news (
        id int(11) NOT NULL AUTO_INCREMENT,
        title varchar(128) NOT NULL,
        slug varchar(128) NOT NULL,
        text text NOT NULL,
        PRIMARY KEY (id),
        KEY slug (slug)
);

Sekarang database dan model telah diatur, Anda akan memerlukan method untuk mendapatkan semua posting kita dari database. Untuk melakukan hal ini, database abstraction layer yang disertakan dengan CodeIgniter - Query Builder - digunakan. Hal ini memungkinkan Anda untuk menulis ‘query‘ sekali dan membuat mereka bekerja pada semua sistem database didukung. Tambahkan kode berikut untuk model Anda.

public function get_news($slug = FALSE)
{
        if ($slug === FALSE) {
                $query = $this->db->get('news');
                return $query->result_array();
        }

        $query = $this->db->get_where('news', array('slug' => $slug));
        return $query->row_array();
}

Dengan kode ini Anda dapat melakukan dua query yang berbeda. Anda bisa mendapatkan semua record berita, atau mendapatkan sebuah berita dengan slug. Anda mungkin melihat bahwa variabel $slug tidak dibersihkan sebelum menjalankan query. Query Builder melakukannya untuk anda.

Menampilkan Berita

Sekarang query sudah ditulis, model harus terikat dengan view yang akan menampilkan berita kepada pengguna. Hal ini dapat dilakukan di controller Pages yang kita buat sebelumnya, tapi demi kejelasan, controller News baru telah didefinisikan. Buat controller baru di application/controllers/News.php.

<?php
class News extends CI_Controller
{

        public function __construct()
        {
                parent::__construct();
                $this->load->model('news_model');
                $this->load->helper('url_helper');
        }

        public function index()
        {
                $data['news'] = $this->news_model->get_news();
        }

        public function view($slug = NULL)
        {
                $data['news_item'] = $this->news_model->get_news($slug);
        }
}

Melihat kode diatas, Anda dapat melihat beberapa kesamaan dengan file yang kita buat sebelumnya. Pertama, method __construct(): itu memanggil konstruktor class induknya (CI_Controller) dan memuat model, sehingga dapat digunakan di semua method di dalam controller ini. Hal ini juga memuat collection dari fungsi URL Helper, karena kita akan menggunakan salah satu dari mereka dalam view nanti.

Berikutnya, ada dua method untuk melihat semua berita dan satu berita untuk berita tertentu. Anda dapat melihat bahwa variabel $slug dilewatkan ke method model dalam method kedua. Model ini menggunakan slug untuk mengidentifikasi berita yang dikembalikan.

Sekarang data tersebut diambil oleh controller melalui model kami, tapi belum ada yang ditampilkan. Hal berikutnya yang harus dilakukan adalah mengoper (passing) data ini ke view.

public function index()
{
        $data['news'] = $this->news_model->get_news();
        $data['title'] = 'News archive';

        $this->load->view('templates/header', $data);
        $this->load->view('news/index', $data);
        $this->load->view('templates/footer');
}

Kode di atas berfungsi untuk mendapat semua record berita dari model dan assign ke sebuah variabel. Nilai untuk judul juga di-assign ke elemen $data['title'] dan semua data akan dioper ke view. Anda sekarang perlu untuk membuat view untuk memuat berita. Buat application/views/news/index.php dan tambahkan potongan kode berikut.

<h2><?php echo $title; ?></h2>

<?php foreach ($news as $news_item): ?>

        <h3><?php echo $news_item['title']; ?></h3>
        <div class="main">
                <?php echo $news_item['text']; ?>
        </div>
        <p><a href="<?php echo site_url('news/'.$news_item['slug']); ?>">View article</a></p>

<?php endforeach; ?>

Di sini, setiap item berita diulang dan ditampilkan kepada pengguna. Anda dapat melihat kita menulis template kita di PHP yang dicampur dengan HTML. Jika Anda memilih untuk menggunakan template language, Anda dapat menggunakan CodeIgniter class Template Parser atau parser pihak ketiga.

Halaman ikhtisar berita sekarang selesai, tetapi halaman untuk menampilkan berita individu masih belum. Model yang dibuat sebelumnya dibuat sedemikian rupa agar mudah digunakan untuk fungsi ini. Anda hanya perlu menambahkan beberapa kode untuk controller dan membuat view baru. Kembali ke controller News dan perbaiki method view() seperti berikut:

public function view($slug = NULL)
{
        $data['news_item'] = $this->news_model->get_news($slug);

        if (empty($data['news_item']))
        {
                show_404();
        }

        $data['title'] = $data['news_item']['title'];

        $this->load->view('templates/header', $data);
        $this->load->view('news/view', $data);
        $this->load->view('templates/footer');
}

Alih-alih memanggil method get_news() tanpa parameter, variabel $slug dioper, sehingga akan mengembalikan item berita tertentu. Satu-satunya hal yang tersisa untuk dilakukan adalah membuat view yang sesuai di application/views/news/view.php. Masukan kode berikut dalam file ini.

<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];

Routing

Karena rule routing wildcard yang kita buat sebelumnya, Anda perlu route ekstra untuk melihat controller yang baru saja Anda buat. Modifikasi file routing (application/config/routes.php) sehingga terlihat sebagai berikut. Hal ini untuk memastikan permintaan mencapai controller News bukannya langsung ke controller Pages. Route URI baris pertama dengan slug ke method view() dalam controller News.

$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

Arahkan browser Anda ke root dokumen Anda, diikuti dengan index.php/news dan lihat halaman berita Anda.