امروز : یکشنبه, 14 آذر 1395
اموزش CodeIgniter جلسه پنجم نمایش اخبار از دیتابیس
3/50 امتیاز از 12 رای
 گجت  |     |   12

در چند جلسه ی قبلی سری آموزش فریم ورک CodeIgniter در هدف ما آشنا کردن شما با ساختار و روش برنامه نویسی MVC در این فریم ورک بوده است. این بخش و جلسه یآینده نیز همین هدف را دنبال می کنند. در این مطلب قصد داریم روش نمایش اخباری که در بانک اطلاعاتی ذخیره شده اند را به صورت داینامیک و با استفاده از CodeIgniter به شما آموزش دهیم.

پیش از هر چیز زمپ را اجرا و دو سرور مای اس کیو ال و آپاچی را در حال فعال قرار دهید. در پوشه ی htdocs این نرم افزار یک پوشه ی جدید به نام codi-dynamic ساخته و فایل های اصلی فریم ورک CodeIgniter را در آن کپی کنید. یک بانک اطلاعاتی جدید در phpmyadmin ایجاد کرده و نام آن را cd بگذرید. سپس همانند روشی که در جلسات قبل توضیح داده بودیم، تنظیمات مربوط به این بانک اطلاعاتی را در فریم ورک وارد کرده و در واقع CodeIgniter را نصب و پیکربندی کنید.

ایجاد مدل

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

در پوشه ی application/models فریم ورک، یک فایل جدید به نام News_model.php ایجاد کرده و کدهای زیر را در آن قرار دهید. پیش از این اطیمنان حاصل کنید که تنظیمات مربوط به بانک اطلاعاتی را همانطور که در جلسات قبل توضیح داده بودیم، انجام داده اید و فریم ورک نصب شده باشد.

<?php class 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 ایجاد کرده و کد زیر را در آن قرار دهید.

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

با نگاهی به کد بالا احتمالا متوجه این موضوع شده اید که کدهای نوشته شده در جلسات قبل به این کد ها شباهت دارند. ابتدا تابع کانستراکتور را ایجاد کرده ایم. در این تابع مدل ایجاد شده در مرحله ی قبل و نیز هلپر 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; ?></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; ?> 

کد بالا اطلاعات ارسال شده از کنترلر را در یک فایل ویو رندر کرده و نهایتا آن را به کاربر نمایش خواهد داد. شما می توانید در فایل های ویو از ترکیب کد های 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 ایجاد کرده و کد زیر را در آن قرار دهید.

<?php echo '<h2>'.$news_item['title'].'</h2>'; 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 مراجعه کنید. در این حالت صفحه ی اخبار خود را مشاهده خواهید کرد.

نظر شما در این مورد چیست؟ لطفا سوالات و دیدگاه خود را با ما و سایر کاربران به اشتراک بگذارید.


برچسب ها :  

نظر خود را به اشتراک بگذارید