آموزش CodeIgniter - جلسه پنجم: نمایش اخبار از دیتابیس
در چند جلسهی قبلی سری آموزش فریمورک CodeIgniter در زومیت هدف ما آشنا کردن شما با ساختار و روش برنامهنویسی MVC در این فریمورک بوده است. این بخش و جلسهیآینده نیز همین هدف را دنبال میکنند. در این مطلب قصد داریم روش نمایش اخباری که در بانک اطلاعاتی ذخیره شدهاند را به صورت داینامیک و با استفاده از CodeIgniter به شما آموزش دهیم.
پیش از هر چیز زمپ را اجرا و دو سرور مایاسکیوال و آپاچی را در حال فعال قرار دهید. در پوشهی htdocs این نرمافزار یک پوشهی جدید به نام codi-dynamic ساخته و فایلهای اصلی فریمورک CodeIgniter را در آن کپی کنید. یک بانک اطلاعاتی جدید در phpmyadmin ایجاد کرده و نام آن را cd بگذرید. سپس همانند روشی که در جلسات قبل توضیح داده بودیم، تنظیمات مربوط به این بانک اطلاعاتی را در فریمورک وارد کرده و در واقع CodeIgniter را نصب و پیکربندی کنید.
ایجاد مدل
همانطور که در جلسات قبل هم اشاره شد، به جای اینکه دستورات مربوط به ارتباط با بانکهای اطلاعاتی مستقیما در کنترلرها بنویسیم، باید از مدلها برای این منظور استفاده کنیم. بدین طریق میتوان در آینده نیز مجددا از مدلهای ایجاد شده بهره برد. در مدلها میتوانیم دستورات مربوط به دریافت، ثبت، بروزرسانی و حذف اطلاعات از بانکهای اطلاعاتی مختلف را بنویسیم. سپس دادههای مورد نظر توسط مدلهای ما آمادهی استفاده خواهند بود.
در پوشهی application/models فریمورک، یک فایل جدید به نام News_model.php ایجاد کرده و کدهای زیر را در آن قرار دهید. پیش از این اطیمنان حاصل کنید که تنظیمات مربوط به بانک اطلاعاتی را همانطور که در جلسات قبل توضیح داده بودیم، انجام دادهاید و فریمورک نصب شده باشد.
phpclass News_model extends CI_Model { public function __construct() { $this->load->database(); }}
پیش از این نیز کدی مشابه با کد بالا را در کنترلر به کار برده بودیم. این کد یک مدل جدید ایجاد کرده و خواص مدل اصلی CodeIgniter یعنی CI_Model را به ارث میبرد. سپس در تابع کانستراکتور، کتابخانهی کار با بانک اطلاعاتی (که database نام دارد) را بارگذاری کردهایم. در نتیجه از این پس در این مدل میتوان با استفاده از دستور this->db object کلاس دیتابیس را آمادهی استفاده قرار داد.
پیش از اینکه کوئریهای لازم را بنویسیم، ابتدا کد زیر را در بخش SQL بانک اطلاعاتی MySQL که قبلا ایجاد کردهاید (بانک دادهی cd) وارد کنید تا جدول پیشفرض اخبار ایجاد شود. سپس چند رکورد از طریق phpmyadmin در این جدول وارد کنید. این جدول شامل فیلدهای id (برای نگهداری شناسهی منحصر به فرد هر خبر)، title (برای نگهداری عنوان خبرها)، slug (برای نگهداری نامک هر خبر که در url نمایان میشود)، text (برای نگهداری متن خبر) است.
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));
حال که جدول اخبار را هم ایجاد کردیم، میتوانیم متدهای لازم برای دریافت خبرهای ثبت شده در آن را بنویسیم. بدین منظور باید از کوئریساز داخلی Codeigniter استفاده کنیم. اینکار باعث میشود تا کوئریهایی بسیار کوچک و ساده نوشته و نتیجهی کار نیز دقیقا همانی باشد که مد نظر شماست. در جلسات آینده با تمام دستورات کتابخانهی دیتابیس آشنا خواهید شد.
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 آن همانی باشد که ما تعیین میکنیم. در نتیجه میتوان با این دو کوئری، تمام خبرها یا یک خبر خاص را نشان داد. لازم به ذکر است استفاده از slug به دلیل منحصر به فرد بودن این فیلد برای هر رکورد یا هر خبر ثبت شده در جدول است. البته میتوانستیم از آیدی نیز برای نمایش یک خبر خاص استفاده کنیم.
نمایش اخبار
حال که کوئریهای مورد نیاز را هم نوشتهایم، باید رکوردهای بدست آمده از بانک اطلاعاتی توسط مدل را در فایلهای ویو به نمایش بگذاریم. اما برای انجام اینکار باید ابتدا یک کنترلر مخصوص ایجاد کنیم. در مسیر application/controllers یک فایل جدید به نام News.php ایجاد کرده و کد زیر را در آن قرار دهید.
phpclass 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); }}
با نگاهی به کد بالا احتمالا متوجه این موضوع شدهاید که کدهای نوشته شده در جلسات قبل به این کدها شباهت دارند. ابتدا تابع کانستراکتور را ایجاد کردهایم. در این تابع مدل ایجاد شده در مرحلهی قبل و نیز هلپر URL را بارگذاری کردهایم. این تابع به محض فراخوانی کنترلر اجرا خواهد شد و در این شرایط مدل مورد نیاز ما نیز به همین دلیل آمادهی استفاده خواهد بود. URL Helper نیز فراخوانی شده چراکه بعدا از قابلیتهای آن استفاده خواهیم کرد.
پس از کانستراکتور دو متد دیگر ایجاد کردهایم که یکی برای نمایش تمام خبرها (index) و دیگری برای نمایش یک خبر خاص (view) بکار گرفته میشود. در تابع view همانطور که مشاهده میکنید یک آرگومان ورودی دریافت میشود که آن را slug$ نامیدهایم. در تابع یا متد index دادههایی که با استفاده از مدل خود از بانک اطلاعاتی بیرون کشیدهایم را در یکی از اعضای آرایه data$ یعنی news قرار دادهایم. همین کار را برای تابع view با کمی تغییر انجام دادهایم و اینبار اطلاعاتی که مربوط به یک خبر خاص است را در عضوی به نام news_item از آرایهی data$ قرار دادهایم.
اما تا اینجای کار نیز چیزی به نمایش در نمیآید چراکه باید اطلاعات دریافت شده را به فایلهای نما یا view ارسال کنیم. بدین منظور چند خط دیگر به توابع بالا اضافه میکنیم. شما نیز کدهای زیر را به تابع index کنترلر خود اضافه کنید.
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');}
خطوط جدید اضافه شده، اطلاعات دریافت شده از بانک اطلاعاتی را به فایلهای نما یا ویو ارسال میکنند. در واقع کد بالا تمام رکوردهای ثبت شده در جدول را با استفاده از مدل از بانک اطلاعاتی دریافت کرده و آن را در متغیر ذخیره کرده است. مقدار عنوان یا title هر خبر در عضوی به نام title در آرایهی data$ قرار خواهد گرفت و به همین طریق تمام فیلدها برای هر رکورد در آرایهی data$ ذخیره خواهند شد. سپس این دادهها به فایلهای ویو مورد نظر ما ارسال شدهاند. در مسیر application/views/news یک فایل به نام index.php بسیازید و کد زیر را در آن قرار دهید.
<h2>php echo $title; ?> foreach ($news as $news_item): ?> echo $news_item['title']; ?> class="main"> echo $news_item['text']; ?>
href=
"
echo
site_url
(
'news/'
.
$news_item
[
'slug'
]);
?>
"
>
endforeach
;
?>
کد بالا اطلاعات ارسال شده از کنترلر را در یک فایل ویو رندر کرده و نهایتا آن را به کاربر نمایش خواهد داد. شما میتوانید در فایلهای ویو از ترکیب کدهای HTML و PHP استفاده کنید. علاوه بر این میتوانید از Template Parser فریمورک استفاده کرده یا حتی از کلاسهای مربوط به قالب شخص ثالث بدین منظور بهره ببرید.
صفحهی کلی خبرها که تمام رکوردها را نمایش میدهد هم اکنون آماده شده اما صفحهای که برای نمایش یک خبر خاص به کار میرود هنوز ایجاد نشده و باید آن را نیز بسازیم. مدلی که پیشتر ایجاد کردیم باعث میشود تا انجام این عمل برای ما آسانتر شود. شما باید چند کد ساده به متد view در کنترلر خود اضافه کنید. متد 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$ را نیز به آن ارسال کردهایم تا فقط رکوردی که slug آن برابر مقدار متغییر یاد شده است، از بانک اطلاعاتی ما دریافت شود. تنها مرحلهی باقی مانده برای نمایش اخبار به صورت جداگانه، ایجاد فایل ویو آن است. در مسیر application/views/news یک فایل جدید به نام view.php ایجاد کرده و کد زیر را در آن قرار دهید.
phpecho ''.$news_item['title'].'';echo $news_item['text'];
کد بالا اطلاعات ارسال شده از کنترلر را در فایل ویو رندر کرده و آن را به کاربر نمایش خواهد داد.
مسیردهی
برای ایجاد دسترسی به متدهای کنترلر ایجاد شده باید مسیردهی آن را نیز به درستی انجام دهید. فایل application/config/routes.php را باز کرده و کد آن را به صورت زیر ویرایش کنید. اینکار باعث میشود تا اطمینان حاصل کنید که کنترلر اخبار شما به درستی همان کاری را انجام دهد که از آن انتطار دارید. در این مورد نیز به مرور بیشتر توضیح میدهیم و اگر دستورات و مراحل اینکار برای شما کمی گنگ است اصلا نگران نباشید چراکه رفته رفته با تمام آنها به طور کامل آشنا خواهید شد.
$route['news/(:any)'] = 'news/view/$1';$route['news'] = 'news';$route['(:any)'] = 'pages/view/$1';$route['default_controller'] = 'pages/view';
مرورگر خود را باز کرده و به آدرس http://127.0.0.1/codi-dynamic/index.php/news مراجعه کنید. در این حالت صفحهی اخبار خود را مشاهده خواهید کرد.
نظر شما در این مورد چیست؟ لطفا سوالات و دیدگاه خود را با ما و سایر کاربران زومیت به اشتراک بگذارید.
نظرات