- پنجشنبه 3 خرداد 1397 ساعت 05:39
- 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 صفحه اخبار را مشاهده کنید.
سایر پستهای داکیومنت
- به کدایگنایتر خوش آمدید
- نصب
- بررسی اجمالی
- شروع به استفاده از کدایگنایتر
- کدایگنایتر در یک نگاه
- فیچرهای کدایگنایتر
- فلوچارت اپلیکیشن
- مدل ویو کنترلر
- اهداف طراحی و معماری
- خودآموز
- مشارکت در کدایگنایتر
- نوشتن مستندات کدایگنایتر در صف ترجمه
- گواهی مبدأ توسعه دهنده 1.1 در صف ترجمه
- مباحث کلی
- URLها در کدایگنایتر
- کنترلرها
- نامهای رزرو شده
- ویوها
- مدلها
- هلپرفانکشنها
- استفاده از لایبرریهای کدایگنایتر
- ساخت لایبرری
- استفاده از درایورهای کدایگنایتر
- ساخت درایور
- ساخت کلاسهای هسته سیستم
- ساخت کلاسهای کمکی
- هوکها - توسعه هسته فریمورک
- بارگذاری خودکار ریسورسها
- فانکشنهای عمومی
- فانکشنهای سازگاری
- مسیریابی URI
- هندل کردن خطاها
- کش کردن صفحات وب
- ارزیابی و تجزیه و تحلیل عملکرد اپلیکیشن
- اجرای کدایگنایتر به وسیله خط فرمان
- مدیریت چندین اپلیکیشن
- هندل کردن محیطهای چندگانه
- سینتکس جایگزین PHP برای فایلهای ویو
- Security در صف ترجمه
- راهنمای کدنویسی در PHP
- لایبرریها در صف ترجمه
- کلاس بنچمارک
- درایور کش در صف ترجمه
- Calendaring Class در صف ترجمه
- Shopping Cart Class در صف ترجمه
- Config Class در صف ترجمه
- Email Class در صف ترجمه
- Encrypt Class در صف ترجمه
- Encryption Library در صف ترجمه
- File Uploading Class در صف ترجمه
- Form Validation در صف ترجمه
- FTP Class در صف ترجمه
- Image Manipulation Class در صف ترجمه
- Image Manipulation Class در صف ترجمه
- Javascript Class در صف ترجمه
- کلاس زبان
- Loader Class در صف ترجمه
- کلاس مایگریشن
- Output Class در صف ترجمه
- Pagination Class در صف ترجمه
- Template Parser Class در صف ترجمه
- Security Class در صف ترجمه
- Session Library در صف ترجمه
- HTML Table Class در صف ترجمه
- Trackback Class در صف ترجمه
- کلاس تایپوگرافی در صف ترجمه
- Unit Testing Class در صف ترجمه
- URI Class در صف ترجمه
- User Agent Class در صف ترجمه
- XML-RPC and XML-RPC Server Classes در صف ترجمه
- کلاس انکود کردن آرشیو Zip در صف ترجمه
- رفرنس دیتابیس در صف ترجمه
- شروع سریع دیتابیس: کد نمونه
- پیکربندی دیتابیس در صف ترجمه
- Connecting to your Database در صف ترجمه
- Queries در صف ترجمه
- Generating Query Results در صف ترجمه
- Query Helper Methods در صف ترجمه
- Query Builder Class در صف ترجمه
- Transactions در صف ترجمه
- Database Metadata در صف ترجمه
- فراخوانی سفارشی فانکشن
- Database Caching Class در صف ترجمه
- Database Forge Class در صف ترجمه
- Database Utility Class در صف ترجمه
- DB Driver Reference در صف ترجمه
- هلپرفانکشنها
- هلپرفانکشن Array
- هلپرفانکشن CAPTCHA در صف ترجمه
- هلپرفانکشن Cookie
- Date Helper در صف ترجمه
- هلپرفانکشن Directory
- Download Helper در صف ترجمه
- Email Helper در صف ترجمه
- File Helper در صف ترجمه
- هلپرفانکشن Form در صف ترجمه
- HTML Helper در صف ترجمه
- Inflector Helper در صف ترجمه
- هلپرفانکشن Language
- هلپرفانکشن Number
- Path Helper در صف ترجمه
- Security Helper در صف ترجمه
- Smiley Helper در صف ترجمه
- هلپرفانکشن String
- Text Helper در صف ترجمه
- Typography Helper در صف ترجمه
- URL Helper در صف ترجمه
- XML Helper در صف ترجمه