بخش اخبار

مجتبی پاکزاد کدایگنایتر 3.1.9 در حال تکمیل رایگان

در بخش قبل، با نوشتن یک کلاس که دربردارنده صفحات استاتیک بود، بعضی از مفاهیم پایه ای فریمورک را آموختیم. با افزودن قوانین مسیریابی خاص، URLهای تمیزتری تولید کردیم. اکنون زمان معرفی محتوای داینامیک و شروع استفاده از دیتابیس است.

ساخت و آماده سازی مدل

به جای مستقیما نوشتن عملیات دیتابیس در کنترلر، کوئری ها باید در یک مدل قرار گیرند، بنابراین آنها به راحتی در آینده استفاده خواهند شد. مدل ها مکانی هستند که اطلاعات را به دیتابیس یا سایر مکان های ذخیره داده وارد می کنید، از آن می خوانید و آپدیت می کنید. آنها مانند نماینده شما در ارتباط با داده ها هستند.

دایرکتوری application/models/ را باز کنید و یک فایل جدید با نام News_model.php در آن ایجاد کنید و کد زیر را به آن اضافه کنید. مطمئن شوید که دیتابیس خود را به خوبی کانفیگ کرده اید. (با ترجمه صفحه مربوطه لینک آن در این قسمت قرار داده خواهد شد.)

<?php
class News_model extends CI_Model {

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

این کد شبیه کد کنترلر است که قبلا استفاده کردیم. با مشتق شدن از CI_Model یک مدل جدید می سازد و تمام کتابخانه دیتابیس را لود می کند. اینکار کلاس دیتابیس را از طریق آبجکت $this->db قابل دسترسی می کند.

قبل از کوئری زدن به دیتابیس، یک اِسکمای (طرح) دیتابیس باید ایجاد کنیم. برای اینکار به دیتابیس خود کانکت شوید و کامند اس کیو ال زیر (MySQL) را اجرا کنید. همچنین تعدادی رکورد به این تیبل وارد کنید.

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)
);

حالا که دیتابیس و یک مدل ساخته شده است، باید یک متد برای آن تعریف کنید تا همه پست‌ها را از دیتابیس دریافت کند. برای انجام این کار، از DBAL اینکلود شده در کدایگنایتر -کوئری بیلدر - استفاده می‌شود. که امکان این را به وجود می‌آورد که کوئری‌های خود را یک‌بار بنویسید و آن‌ها را در تمام سیستم‌های دیتابیس پیشتیبانی شده توسط کدایگنایتر قابل استفاده کنید. کدهای زیر را به مدل خود اضافه کنید.

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();
}

با استفاده از این کد می‌توانید دو کوئری مختلف را اجرا کنید. می‌توانید همه رکوردهای اخبار یا فقط رکورد مربوط به یک آیتم خبری با اسلاگ خاص را دریافت کنید. احتمالا متوجه شده‌اید که از فیلتری برای حذف کاراکترهای غیرمجاز از متغییر $slug استفاده نمی‌شود؛ زیرا کوئری بیلدرها این کار را برای شما انجام می‌دهند.

نمایش اخبار

اکنون که کوئری‌ها نوشته شده‌اند، مدل باید با ویوهایی که قصد نمایش آیتم‌های خبری به کاربر را دارند مرتبط شود. این کار را می‌توان در کنترلر Pages که قبلا ساختیم انجام دهیم، اما به جهت اینکه مطلب واضح‌تر و روشن‌تر بیان شود، یک کنترلر جدید با نام News تعریف می‌کنیم. کنترلر جدید 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);
        }
}

اگر به کد دقت کنید، شباهت‌هایی بین فایل‌هایی که قبلا ایجاد کرده‌ایم خواهید یافت. ابتدا، متد __construct(): این متد constructor کلاس والدش (CI_Controller) را فراخوانی می‌کند و مدل را لود می‌کند، بنابراین می‌تواند در تمام متدهای دیگر در کنترلر استفاده شود. همچنین فانکشن‌های هلپر URL را به این دلیل لود می‌کند که در ویو از آن‌ها استفاده خواهیم کرد.

در ادامه دو متد دیگر وجود دارد که کار آن‌ها نمایش همه آیتم‌های خبری و یک آیتم خبری با یک اسلاگ خاص است. می‌توانید مشاهده کنید که متغییر $slug در متد دوم به مدل پاس داده شده است. مدل از این اسلاگ برای شناسایی آیتم‌های خبری استفاده می‌کند که باید برگرداند.

اکنون داده‌ها توسط کنترلر و از طریق مدل دریافت می‌شود، اما هنوز هیچ چیزی نمایش داده نمی‌شود. کار بعدی که باید انجام دهید ارسال این داده‌ها به ویو است.

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');
}

کد بالا تمام رکوردهای خبری را از مدل می‌گیرد و آن‌ها را به یک متغییر اختصاص می‌دهد. مقدار عنوان نیز به عنصر $data['title'] نسبت داده می‌شود و تمام داده‌ها به ویوها ارسال می‌شود. حالا باید یک ویو برای رندر آیتم‌های خبری بسازید. را بسازید و تکه کد بعدی را به آن اضافه کنید.

<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; ?>

در اینجا، هر آیتم خبری توسط حلقه foreach به کاربر نمایش داده می‌شود. مشاهده می‌کنید که تمپلت را از ترکیب PHP با HTML نوشتیم. اگر ترجیح می‌دهید که از یک موتور قالب استفاده کنید، می‌توانید از کلاس تمپلت پارسر کدایگنایتر یا از یک تمپلت پارسر به اصطلاح third party استفاده کنید.

صفحه مربوط به اخبار تکمیل شده است، اما یک صفحه برای نمایش هر آیتم خبری نیز نیاز داریم. مدلی که قبلا ایجاد شده است به راحتی برای این عملکرد قابل استفاده است. فقط باید کدی را به کنترلر اضافه کنید و یک ویو جدید بسازید. به کنترلر News برگردید و متد view() را با کد زیر آپدیت کنید:

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');
}

به جای فراخوانی متد get_news() بدون پارامتر، متغییر $slug ارسال می‌شود، بنابراین یک آیتم خبری خاص را برمی‌گرداند. تنها چیزی که باقی‌مانده، ساخت ویوی مربوطه در application/views/news/view.php است. کد زیر را در این فایل قرار دهید:

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

مسیریابی

به دلیل قوانین مسیریابی که قبلا تعریف کردید، به یک قانون جدید نیاز دارید تا کنترلری که به تازگی ساخته‌اید را مشاهده کنید. فایل مربوط به مسیریابی (application/config/routes.php) را ویرایش کنید تا شبیه کد زیر شود. این کار باعث می‌شود مطمئن شوید که ریکوئست‌های مربوط به اخبار به جای اینکه مستقیم به کنترلر Pages بروند، به کنترلر News ارجاع داده شوند. اولین خط URL مسیریابی با یک اسلاگ به متد view() در کنترلر News مربوط است.

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

آدرس مربوط به صفحه را که نسبت به روت (Root) سایت شما index.php/news است را در مرورگر خود تایپ کنید و با زدن دکمه Enter صفحه اخبار را مشاهده کنید.

منبع
News section