رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش کدایگنایتر CodeIgniter
#1
به CodeIgniter خوش آمدید


   

کدایگنایتر یه چهارچوب توسعه نرم‌افزار بازمتن - یه جعبه‌ابزار - برای کسانی هست که با استفاده از PHP وب‌سایت میسازن. هدفش اینه که با ارائه‌ی مجموعه‌ی کاملی از کتابخانه‌ها برای کارهای رایج و همچنین یه رابط ساده و ساختار منطقی برای دسترسی به این کتابخانه‌ها، شما رو قادر به توسعه‌ی پروژه‌ها سریعتر از زمانی کنه که از پایه کدنویسی میکنین. CodeIgniter به شما اجازه میده با کاهش کدنویسی لازم برای انجام کارها، تمرکزتون رو روی منطق پروژه بگذارین. اگه قصد دارین درقالب پکیج آموزشی تصویری و بصورت فیلم و همراه‌با پروژه‌های عملی و توضیحات کامل‌تر و بیشتر، کار با فریمورک رو یاد بگیرین، میتونین از «پکیج آموزش جامع کدایگنایتر» استفاده کنید.

کدایگنایتر برای چه‌کسانی خوبه؟
کدایگنایتر برای شما مناسبه اگه:
  • یه فریمورک میخواین که حجم کمی داشته باشه
  • نیاز به پرفورمنس قابل‌قبول دارین
  • دنبال سازگاری بالا با هاستینگ‌های مختلف و استانداردی هستین که از نسخه‌ها و تنظیمات مختلف PHP استفاده میکنن
  • فریمورکی میخواین که تقریباً نیاز به هیچ تنظیم خاصی نداشته باشه
  • فریمورک موردنظر شما نیاز به دسترسی به خط فرمان نداشته باشه
  • نمیخواین فریمورک موردنظرتون برای شما قوانین دست و پا گیر وضع کنه
  • علاقمند به کتابخانه‌های یکپارچه بزرگی مثل PEAR نیستین
  • نمیخواین یه زبان جداگانه برای موتور قالب یاد بگیرین (هرچند مفسر قالب درصورت دلخواه شما موجوده)
  • از پیچیدگی پرهیز میکنید و دنبال راهکارهای ساده هستین
  • نیاز به مستندات واضح و با جزئیات کامل دارین
با ما در ادامه این تاپیک همراه باشین. قصد داریم به‌مرور تمامی مستندات رسمی CodeIgniter رو ترجمه کنیم و توی این تاپیک قرار بدیم.

فهرست مطالب (درحال تکمیل)
تشکر شده توسط: habibvafapour , meysam1366 , AmirGholami , GHM
#2
راهنمای نصب
کدایگنایتر در چهار مرحله نصب میشه:
  1. پکیج رو از حالت فشرده خارج کنید. دانلود
  2. پوشه‌ها و فایل‌های CodeIgniter رو در مسیر سرور خودتون کپی کنید (یا توی لوکال‌هاست). معمولاً فایل index.php باید در ریشه سرور وب شما باشه.
  3. فایل application/config/config.php رو با یه ویرایشگر متنی باز کنید و URL پایه رو وارد کنید:
    $config['base_url'] = 'http://localhost/ci/';
    اگه میخواین از رمزگذاری یا سشن استفاده کنید، کلید رمزنگاری رو هم مشخص کنید:
    $config['encryption_key'] = hash('SHA256', 'http://www.ncis.ir/');
  4. اگه میخواین از دیتابیس استفاده کنید، فایل application/config/database.php رو باز کنید و تنظیمات پایگاه داده‌های خودتون رو وارد کنید:
    $db['default'] = array(
        'dsn' => '',
        'hostname' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'ci',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );
اگه میخواین امنیت رو با پنهان‌کردن مسیر فایل‌های کدایگنایتر بالاتر ببرین، میتونین پوشه‌های system و application رو تغییرنام بدین به یه چیز خصوصی‌تر و بعد توی فایل index.php متغیرهای $system_path و $application_folder رو در ابتدای فایل تغییر بدین تا با اسامی جدید سازگار بشن.

برای امنیت بهتر، هر دو پوشه system و application رو باید به یه پوشه بالاتر از ریشه وب‌سرور (معمولاً public_html) منتقل کنید تا امکان دسترسی مستقیم به اونها توسط مرورگر ازبین بره. بطور پیشفرض فایل‌های htaccess. توی هر پوشه برای جلوگیری از دسترسی مستقیم قرار گرفتن ولی بازم بهتره که اونها رو از دسترسی عمومی بطور کامل خارج کنین چون ممکنه برحسب نوع سروری که دارین و تنظیماتش، فایل‌های htaccess. خونده یا اجرا نشن.

اگه میخواین فایل‌های View رو عمومی نگه‌دارین، این امکان وجود داره که اونها رو خارج از پوشه application قرار بدین. بعد از جابجایی اونها، فایل index.php رو باز کنید و متغیرهای $system_path و $application_folder و $view_folder رو با مسیر فیزیکی کامل (مثلاً /www/MyUser/system) تنظیم کنید.

یکی دیگه از کارهایی که بعد از قراردادن سایت روی سرور (محیط Production) باید انجام بدین، خارج‌کردن پروژه از حالت توسعه (Development) هست. این‌کار باعث غیرفعال‌شدن گزارش خطاهای PHP و هرگونه قابلیت دیگه که مخصوص وضعیت توسعه است میشه. توی CodeIgniter این‌کار با تنظیم‌کردن ثابت ENVIRONMENT انجام میشه که جزئیات کاملش رو در صفحه امنیت توضیح دادیم.

همش همین بود!

اگه توی کدایگنایتر تازه‌کار هستین، لطفاً قسمت شروع به کار راهنمای کاربر رو برای شروع یادگیری نحوه‌ی ساخت برنامه‌های PHP پویا مطالعه کنید. لذت ببرین!
تشکر شده توسط: meysam1366 , AmirGholami , GHM
#3
چرخه‌ی کاری برنامه
تصویر زیر نحوه‌ی گردش کار توی یه سایت که با کدایگنایتر نوشته شده رو نشون میده:

[عکس: attachment.php?aid=457]

  1. فایل index.php بعنوان کنترل‌کننده خط مقدم کار میکنه و منابع اصلی موردنیاز برای اجرای CodeIgniter رو آماده میکنه.
  2. مسیریاب درخواست HTTP رو بررسی میکنه تا تشخیص بده که باهاش چه‌کاری باید انجام بشه.
  3. اگه فایل Cache وجود داشته باشه، مستقیماً برای مرورگر ارسال میشه و عملیات عادی سیستم نادیده گرفته میشه.
  4. امنیت: قبل‌از اینکه کنترلر برنامه بارگذاری بشه، درخواست HTTP و هرگونه ورودی کاربر برای امنیت بیشتر فیلتر میشه.
  5. کنترلر اقدام به بارگذاری مدل، کتابخانه‌های هسته، کلاس‌های کمکی، سایر منابع موردنیاز برای پردازش درخواست موردنظر میکنه.
  6. خروجی View نهایی پردازش و Render میشه و برای مرورگر ارسال میشه تا دیده بشه. اگه کَش فعال باشه، ابتدا ویو کش میشه تا توی درخواست‌های بعدی بتونه مورداستفاده قرار بگیره.


فایل‌های پیوست تصاویر بندانگشتی
   
تشکر شده توسط: meysam1366 , AmirGholami , GHM
#4
مدل - ویو - کنترلر
کدایگنایتر بر پایه‌ی الگوی توسعه Model-View-Controller بنا شده. MVC یه روند توسعه نرم‌افزاری که منطق برنامه رو از ظاهر و نمایشش جدا میکنه. در عمل، به‌شما اجازه میده که صفحات وب‌سایتتون شامل حداقل اسکریپت‌نویسی ممکن باشن چون نمایش اطلاعات مستقل از اسکریپت‌های PHP خواهد بود.
  • Model بیانگر ساختار داده‌های شماست. معمولاً کلاس‌های مدل شامل توابعی هستن که به شما کمک میکنه اطلاعات رو از دیتابیس استخراج یا داخلش درج و بروزرسانی کنید.
  • View اطلاعاتی هست که به کاربر نشون داده میشه. یه ویو معمولاً یه صفحه‌ی وب خواهد شد ولی در CodeIgniter، یه ویو میتونه حتی بخشی از یه صفحه (مثل هدر یا فوتر) هم باشه. همچنین میتونه یه صفحه RSS یا هر نوع «صفحه»ی دیگه باشه.
  • Controller بعنوان یه واسطه بین مدل، ویو و هر منبع دیگه که برای پردازش درخواست HTTP و تولید صفحه وب خروجی لازمه عمل میکنه.
کدایگنایتر تقریباً میشه گفت وابستگی کمی به MVC داره چون مدل‌ها اجباری نیستن. اگه نیاز به جداسازی ندارین یا احساس میکنین مدیریت مدل‌ها نیازمند پیچیدگی بیشتر از اون چیزی میشه که نیاز دارین، میتونین اونها رو نادیده بگیرین و فقط با کمک کنترلرها و ویوها برنامه خودتون رو بسازین. کد ایگنایتر به شما اجازه میده که اسکریپت‌های شخصی خودتون رو هم به‌کار بگیرین یا حتی کتابخانه‌های هسته‌ی سیستم رو توسعه بدین که شما رو قادر به کار درمسیری میکنه که بیشتر باهاش احساس راحتی میکنید.
تشکر شده توسط: meysam1366 , GHM
#5
اهداف طراحی و معماری
هدف تیم توسعه‌ی کدایگنایتر، کسب بیشترین کارآیی، قابلیت و انعطاف‌پذیری در کمترین و سبک‌ترین پکیجِ ممکنه. برای رسیدن به این هدف، عملیات سنجش کارآیی و سرعت، بازبینی و بازنویسی کدها و ساده‌سازی رو در هر مرحله از فرایند توسعه‌ی کدایگنایتر انجام میدن و هرچیزی که هدف موردنظر رو پیش نبره، کنار میگذارن.


از دیدگاه فنی و معماری، CodeIgniter با اهداف زیر تولید شده:
  • ایجاد شئ پویا: در کدایگنایتر، عناصر برنامه بجای اینکه سراسری کار کنن، فقط در زمانی که درخواست بشن بارگذاری میشن و دستورالعمل‌هاشون اجرا میشه. هیچ فرضی توسط سیستم درخصوص اینکه چه ابزارهایی لازمه، بجز حداقل ملزوماتی که برنامه کار کنه درنظر گرفته نمیشه. بنابراین سیستم بطور پیشفرض خیلی سبکه. رویدادهایی که توسط درخواست HTTP اتفاق میفتن و کنترلرها و ویوهایی که طراحی میکنید، تصمیم میگیرن که چه‌چیزی بارگذاری بشه.
  • درجه‌ی ترکیب ضعیف: درجه‌ی ترکیب به‌معنای میزان تکیه‌ی اجزای سیستم به همدیگه است. هرچقدر عناصر برنامه کمتر به همدیگه وابسته باشن، قابلیت استفاده‌ی مجدد و انعطاف‌پذیری سیستم بالاتر میره. هدف تیم توسعه‌ی کدایگنایتر، یه سیستم غیروابسته است.
  • منفردبودن عناصر: منفردبودن به‌معنای میزان متمرکزبودن عناصر روی یه هدف مشخص و محدوده. در CodeIgniter هر کلاس و توابعش به‌میزان زیادی مستقل و خودمختار هستن که اجازه‌ی بیشترین کارآیی رو میده.
کدایگنایتر یه سیستم پویا با درجه‌ی ترکیب ضعیف و دارای عناصر منفرده که برای رسیدن به سادگی، انعطاف و کارآیی بالا با مصرف کم حافظه و پردازنده تلاش زیادی میکنه.
تشکر شده توسط: meysam1366 , AmirGholami , GHM
#6
پیشنیازهای سرور
نسخه‌ی PHP پیشنهادی ما 5.6 یا بالاتره؛ ولی حداقل نسخه‌ای که میتونه برای کدایگنایتر مورد استفاده قرار بگیره 5.3.7 هست (هرچند شدیداً توصیه میکنیم که از چنین نسخه قدیمی PHP استفاده نکنید چون مشکلات احتمالی امنیتی و کارآیی و همچنین عدم دسترسی به امکانات نسخه‌های جدید PHP در انتظار شما خواهد بود).

یه پایگاه داده‌ها برای اغلب برنامه‌های وب موردنیازه. درحال‌حاضر CodeIgniter میتونه با دیتابیس‌های زیر کار کنه:
  • MySQL نسخه 5.1 به‌بعد ازطریق افزونه‌های mysql (منسوخ‌شده) و mysqli و PDO
  • Oracle ازطریق افزونه‌های oci8 و PDO
  • PostgreSQL ازطریق افزونه‌های postgre و PDO
  • MS SQL ازطریق افزونه‌های mssql و sqlsrv (نسخه 2005 و بالاتر) و PDO
  • SQLite ازطریق افزونه‌های sqlite (نسخه‌ی 2) و sqlite3 (نسخه‌ی 3) و PDO
  • CUBRID ازطریق افزونه‌های cubrid و PDO
  • Interbase/Firebird ازطریق افزونه‌های ibase و PDO
  • ODBC ازطریق افزونه‌های odbc و PDO (باید بدونید که درحقیقت ODBC یه لایه‌ی جداسازی محسوب میشه)
تشکر شده توسط: meysam1366 , AmirGholami , GHM
#7
خودآموز
این خودآموز برای آشنایی شما با فریمورک CodeIgniter و اصول الگوی طراحی MVC ایجاد شده و به شما نحوه‌ی ایجاد یه برنامه‌ی ساده‌ی کدایگنایتر رو بصورت مرحله به مرحله نشون میده.

توی این خودآموز شما یه وب‌سایت خبری ساده میسازین. این‌کار رو با نوشتن کدهایی که میتونن صفحات ثابت رو بارگذاری کنن شروع میکنین. در مرحله‌ی بعدی یه بخش اخبار درست میکنید که آیتم‌های خبری رو از دیتابیس میخونه. درنهایت یه فرم برای ایجاد اخبار جدید در پایگاه داده‌ها میسازین.

این خودآموز روی محورهای زیر تمرکز داره:
  • مبانی پایه‌ی MVC
  • اصول مسیریابی
  • اعتبارسنجی فرم
  • انجام کوئری‌های اولیه دیتابیس با استفاده از Query Builder
این خودآموز به چند بخش تقسیم شده که هرکدوم قسمت کوچکی از کاربرد فریمورک CodeIgniter رو نشون میدن. این بخش‌ها شامل موارد زیر خواهد بود:
  • معرفی (همین بخش) که یه دید کلی از چیزی که قراره بسازیم ارائه میده
  • صفحات ثابت، که به شما یاد میده مفاهیم پایه کنترلرها، ویوها و مسیریابی چیه.
  • بخش اخبار، جایی که شما شروع به استفاده از مدل‌ها میکنید و برخی عملیات ساده‌ی پایگاه داده‌ها رو انجام میدین.
  • ایجاد خبر جدید، که شما رو با عملیات پیشرفته‌تر دیتابیس و اعتبارسنجی فرم آشنا میکنه.
  • جمع‌بندی، که به شما یکسری منبع برای مطالعه‌ی بیشتر و سایر منابع موردنیاز رو معرفی میکنه.
تشکر شده توسط: meysam1366 , AmirGholami , GHM , artablog
#8
صفحات ثابت
توی این قسمت فرض کردیم که شما کدایگنایتر رو دانلود و فریمورک رو نصب کردین. اولین چیزی که باید انجام بدین، آماده‌سازی یه کنترلر برای مدیریت این صفحات ثابته. یه کنترلر یه کلاسه که به شما کمک میکنه کارها رو انجام بدین. درواقع درحکم چسب توی برنامه شماست. برای مثال وقتی درخواستی برای این آدرس میاد:
http://example.com/news/latest/10


میتونیم تصور کنیم که یه کنترلر به‌اسم news وجود داره. متدی که داخل این کنترلر فراخوانی شده latest هست و وظیفه‌ی اون، استخراج 10 آیتم خبری و نمایش اونها در صفحه است. در اغلب موارد توی MVC آدرس‌هایی با الگوی زیر میبینید:
http://example.com/[controller-class]/[controller-method]/[arguments]

به‌مرور که الگوهای URL پیچیده‌تر میشن، این ساختار ممکنه تغییر کنه ولی فعلاً تمام چیزی که لازمه بدونیم همینه.

یه فایل در مسیر application/controllers/Pages.php با محتوای زیر بسازین:
<?php

class Pages extends CI_Controller
{

    public function view($page = 'home')
    {
    }

}

شما یه کلاس به‌اسم Pages ساختین که یه متد به‌اسم view داره و این متد یه پارامتر میگیره به‌اسم $page. این کلاس از CI_Controller مشتق شده که معناش اینه که کلاس Pages شما به متدها و فیلدهای تعریف‌شده داخل کلاس CI_Controller (فایل system/core/Controller.php) دسترسی داره.

کنترلر درحقیقت مرکز هر درخواست در وب‌اپلیکیشن شما خواهد بود. در اصطلاح فنی توی مباحث کدایگنایتر، بهش Super Object میگن. مثل هر کلاس PHP دیگه، شما داخل بدنه‌ی کنترلر خودتون بهش با $this اشاره میکنید. با کمک $this میتونین کتابخانه‌ها، ویوها و... رو بارگذاری کنید و کلاً به فریمورک دستور بدین.

حالا که اولین متد خودتون رو ساختین، وقتشه یه قالب خیلی ساده برای صفحات بسازیم. ما دو View ایجاد میکنیم (قالب صفحات) که نقش هدر و فوتر صفحه رو دارن.

هدر رو در مسیر application/views/templates/header.php با محتوای زیر بسازین:
<html>
   <head>
       <title>CodeIgniter Tutorial</title>
   </head>
   <body>
       <h1><?php echo $title; ?></h1>

این هدر شامل کد HTML پایه‌ای هست که شما میخواین قبل از بارگذاری ویوی اصلی قرار بگیره و ما یه عنوان داخلش گذاشتیم. همچنین متغیر $title رو هم نمایش میده که بعداً توی کنترلر تعریفش میکنیم. حالا یه فوتر در مسیر application/views/templates/footer.php با محتوای زیر تعریف کنید:
        <em>&copy; <?php echo date('Y') ?></em>
    </body>
</html>

اضافه‌کردن منطق به کنترلر
قبلاً یه کنترلر با متد view() ساختین. این متد یه پارامتر دریافت میکنه که اسم صفحه‌ای هست که باید بارگذاری بشه. توی این پروژه میخوایم صفحات ثابت رو در مسیر application/views/pages قرار بدیم. توی این مسیر، دو فایل به اسامی home.php و about.php بسازین. داخل این فایلها متن دلخواهتون رو بنویسید - هرچی دوست دارین - و اون رو ذخیره کنید.

برای بارگذاری این صفحات باید چک کنید که صفحات درخواست‌شده وجود داره یا نه:

public function view($page = 'home')
{
   if (!file_exists(APPPATH . 'views/pages/' . $page . '.php')) {
       // Whoops, we don't have a page for that!
       show_404();
   }

   $data['title'] = ucfirst($page); // Capitalize the first letter

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

الان وقتی صفحه‌ای وجود داشته‌باشه بارگذاری میشه و قبل و بعدش هدر و فوتر قرار میگیره و به کاربر نمایش داده میشه. اگه صفحه وجود نداشته باشه هم خطای "404 Page not found" ظاهر میشه.

اولین خط در این متد چک میکنه که صفحه واقعاً وجود داشته باشه. تابع داخلی PHP یعنی file_exists() برای بررسی این موضوع بکار رفته. تابع show_404() یه تابع داخلی کدایگنایتر هست که صفحه خطای پیشفرض رو نمایش میده.

توی فایل هدر، یه متغیر $title تعریف کردیم که برای سفارشی‌کردن عنوان صفحه ازش استفاده کردیم. مقدار این متغیر توی متد view باید تعریف بشه ولی بجای اینکه مستقیماً داخل متغیری به این اسم بگذاریم، باید به عنصر title از آرایه‌ی $data نسبت بدیم.

آخرین چیزی که باید انجام بشه، بارگذاری ویو‌ها به‌ترتیبی هست که باید نمایش داده بشن. دومین پارامتر در متد view() برای ارسال مقادیر به ویو به‌کار میره. هر مقدار داخل آرایه‌ی $data به یه متغیر همنام با اندیسش تبدیل میشه. بنابراین مقدار $data['title'] توی کنترلر به متغیر معادل $title توی ویو تبدیل میشه.

الآن اگه مسیر your-site-url/index.php/pages/view رو اجرا کنید، صفحه‌ی خطای 404 رو مشاهده خواهید کرد چون ویوی home رو ما در مسیری که توی شرط اولیه‌ی متد view در کنترلر Pages چک کردیم، نساختیم.

تولید ویوها
ابتدا یک فایل PHP در مسیر views/pages/home.php ایجاد کنید و این محتوا رو داخلش بگذارین:
<p>Welcome to CodeIgniter!</p>

مسیریابی
کنترلر الان کار میکنه! توی مرورگرتون مسیر [your-site-url]/index.php/pages/view رو باز کنید (یا همون صفحه‌ی قبلی که خطای 404 تولید کرده بود رو Refresh کنید) تا صفحه‌ی home رو ببینید. اگه بخوایم وقتی index.php/pages/view/about رو باز میکنیم، محتوای صفحه about ظاهر بشه، باید یک ویوی دیگه در مسیر views/pages/about.php با محتوای فرضی زیر بسازیم:
<p>Hello World!</p>

و وقتی این صفحه نمایش داده بشه، باز هم هدر و فوتر داخلش خواهد بود.

با استفاده از قوانین مسیریابی اختصاصی، قابلیت اختصاص هر آدرسی به هر کنترلر و متدی رو خواهید داشت و از مفهوم و قیدوبند اصلی آزاد بشین:
http://example.com/[controller-class]/[controller-method]/[arguments]

اجازه بدین اینکار رو انجام بدیم. فایل مسیریابی رو از مسیر application/config/routes.php باز کنید و این دو خط رو بهش اضافه کنید و تمام کدهای دیگه که هر عنصری به آرایه $route اضافه میکنه رو حذف کنید:
$route['default_controller'] = 'pages/view';
$route['(:any)'] = 'pages/view/$1';

CodeIgniter قوانین مسیریابی خودش رو از بالا به پایین توی این فایل میخونه و درخواست واردشده رو به اولین قانونی که مطابقت پیدا کنه نسبت میده. هر قانون یه عبارت باقاعده (سمت‌چپ) داره که به یه کنترلر و متدش که با اسلش / جدا شدن (سمت‌راست) نسبت داده میشه. وقتی یه درخواست وارد میشه، کدایگنایتر دنبال اولین مطابقت میگرده و کنترلر و متد متناسب با اون رو فراخوانی میکنه و پارامترهای متناسب رو هم براش میفرسته.

اطلاعات بیشتر رو میتونید توی مستندات مسیریابی مطالعه کنین.

در اینجا قانون دوم در $routes با هر درخواستی با کمک الگوی سراسری (:any) مطابقت پیدا میکنه و پارامتر رو به متد view() از کلاس Pages میفرسته.

حالا مسیر index.php/about رو باز کنید. آیا شما رو مستقیماً به متد view() توی کنترلر Pages برد؟ خارق‌العاده است!
تشکر شده توسط: meysam1366 , AmirGholami , GHM
#9
بخش اخبار
توی بخش قبلی ما برخی از مفاهیم پایه فریمورک رو با نوشتن یه کلاس که شامل صفحات استاتیک بود یاد گرفتیم. همچنین آدرس‌ها رو با اضافه‌کردن قوانین مسیریابی پاکسازی کردیم. حالا وقتشه که محتوای پویا رو معرفی کنیم و شروع به استفاده از یه پایگاه داده‌ها کنیم.

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

پوشه application/models رو باز کنید و یه فایل جدید به‌اسم News_model.php بسازین و این کد رو بهش اضافه کنید:
<?php

class News_model extends CI_Model
{

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

این کد شبیه به کدی که قبلاً توی کنترلر ساخته بودیم بنظر میاد. یه مدل جدید با مشتق‌شدن از کلاس CI_Model میسازه و کتابخانه دیتابیس رو بارگذاری میکنه. این‌کار باعث میشه کلاس کار با دیتابیس ازطریق شئ $this->db قابل دسترسی بشه.

قبل از اینکه از دیتابیس چیزی رو بخونیم، باید جدول موردنظرمون برای اخبار رو بسازیم. توی دیتابیس خودتون این کوئری رو اجرا کنید:
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)
);

حالا که دیتابیس رو دارین و یه جدول هم ساخته شده و مدلش هم آماده است، میتونیم متدهای لازم برای کار با دیتابیس رو بنویسیم. برای اینکار لایه خلاصه‌سازی پایگاه داده‌ها یا Database Abstraction Layer همراه کد ایگنایتر یعنی QueryBuilder بکار میره. این‌کار باعث میشه کوئری‌ها رو یکبار بنویسیم و از اونها توی تمام پایگاه‌های داده پشتیبانی‌شده که در ابتدای این تاپیک معرفی کردیم استفاده کنین. این کد رو به مدلتون اضافه کنید:
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 ازنظر امنیتی فیلتر نشده. خود Query Builder کد ایگنایتر این کار رو برای شما انجام میده.


نمایش اخبار

حالا که کوئری‌ها نوشته شدن، مدل باید با ویو‌هایی که میخوان اخبار رو نمایش بدن ترکیب بشه. این‌کار رو میتونیم توی کنترلر 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);
   }

}

با یه نگاه به کد متوجه میشین که شباهت‌های بین فایل‌هایی که ایجاد کردیم وجود داره. اول از همه به سازنده دقت‌کنید. ابتدا سازنده کلاس والد (CI_Controller) رو صدا زدیم و بعد مدل news_model رو بارگذاری کردیم تا بتونیم از اون توی تمام متدهای این کنترلر ازطریق اسمش استفاده کنیم. همچنین توابع کمکی URL رو هم بارگذاری کردیم چون بعداً میخوایم ازش توی ویو استفاده کنیم.

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

تا اینجا داده‌ها از دیتابیس باکمک مدل استخراج شدن ولی هیچ چیزی نمایش داده نشده. قدم بعدی ارسال این داده‌ها به ویوهاست. متد 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');
}

این کد تمام اطلاعات رو از دیتابیس دریافت میکنه و اونها رو به یه متغیر نسبت میده. همچنین عنوان صفحه رو به متغیر $data['title] اختصاص میده و تمام این اطلاعات برای ویوها ارسال میشه. باید یه ویوی جدید برای نمایش اخبار ایجاد کنیم. فایل 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; ?>

همونطور که مشخصه، یه حلقه برای اخبار ایجاد شده و به کاربر نشون داده میشه. در اینجا ما از ترکیب PHP و HTML برای قالبمون استفاده کردیم. اگه ترجیح میدین از یه زبان قالب استفاده کنید، میتونین به کلاس مفسر قالب CodeIgniter یا یه مفسر غیررسمی (مثل Smarty یا Twig و...) مراجعه کنید.

قسمت نمایش کلی اخبار الآن کامله ولی صفحه‌ای که هر خبر رو نمایش میده هنوز وجود نداره. مدلی که قبلاً طراحی کردیم به‌شکلی بوده که میتونه به‌راحتی برای این منظور هم مورد استفاده قرار بگیره. تنها نیاز شما اینه که یکم کد به کنترلر اضافه‌کنید و یه ویوی جدید بسازین. به کنترلر 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 با این محتواست:
<h2><?php echo $news_item['title']; ?></h2>
<p><?php echo $news_item['text']; ?></p>

مسیریابی
بخاطر وجود قانون مسیریابی عمومی و کلی که قبلاً ساختیم، باید یه مسیر جدید برای مشاهده کنترلری که جدیداً ایجاد کردیم بسازیم وگرنه همه‌ی درخواست‌ها به متد view از کنترلر Pages منتقل میشه. فایل مسیریابی application/config/routes.php رو به‌شکل زیر ویرایش کنید. این‌کار باعث میشه مطمئن بشیم که درخواستهایی که با کلمه news شروع شدن به متد متناسب با خودشون در کنترلر News هدایت میشن. خط اول آدرسی حاوی عبارت Slug رو به متد view و خط دوم آدرس news رو به متد پیشفرض یعنی index هدایت میکنه. دقت‌کنید که هرچقدر قوانین مسیریابی که مینویسیم عمومی‌تر میشن، باید اونها رو پایین‌تر بنویسیم چون درصورت مطابقت، دیگه قوانین بعد از اونها درنظر گرفته نمیشه:
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

چند خبر بصورت دستی توی دیتابیس ثبت کنید و مرورگرتون رو به مسیر index.php/news هدایت کنید تا نتیجه رو ببینید.
تشکر شده توسط: AmirGholami , GHM
#10
ساخت عناصر خبری جدید
الان میدونین چطور اطلاعات رو از دیتابیس باکمک کدایگنایتر بخونین ولی هنوز هیچ اطلاعاتی توی دیتابیس ننوشتین (بجز چیزهایی که دستی وارد کردین). توی این قسمت کنترلر و مدل news که قبلاً ساختیم رو توسعه میدیم تا این قابلیت‌ها بهش اضافه بشه.

ساخت یه فرم
برای ورود اطلاعات داخل دیتابیس نیاز به یه فرم داریم که بتونیم اطلاعات رو داخلش وارد کنیم. این یعنی لازمه یه فرم با دو فیلد بسازیم (یکی برای عنوان و یکی برای متن). فیلد slug رو از داخل عنوان توی مدل استخراج میکنیم. یه ویوی جدید در مسیر application/views/news/create.php ایجاد کنید:
<h2><?php echo $title; ?></h2>
<?php echo validation_errors(); ?>
<?php echo form_open('news/create'); ?>
    <label for="title">Title</label>
    <input type="input" name="title" /><br />
    <label for="text">Text</label>
    <textarea name="text"></textarea><br />
    <input type="submit" name="submit" value="Create news item" />
</form>

در اینجا فقط دو نکته وجود داره که تا الان باهاش آشنا نیستین که یکی تابع form_open() و اون یکی هم تابع validation_errors() هست.

تابع اول توسط توابع کمکی Form ارائه شده و قابلیت‌های اضافه مثل اضافه‌کردن فیلد مخفی محافظت دربرابر حملات CSRF رو فراهم میکنه. تابع دوم هم برای گزارش خطاهای مربوط به اعتبارسنجی عناصر فرم بکار میره.

به کنترلر news برگردین. میخوایم دو چیز بهش اضافه کنیم: چک‌کردن اینکه آیا فرم ارسال شده یا نه و آیا داده‌های ارسال‌شده، قوانین اعتبارسنجی رو با موفقیت پشت‌سر گذاشتن یا خیر. برای این‌کار از کتابخانه‌ی اعتبارسنجی فرم استفاده میکنیم.
public function create()
{
    $this->load->helper('form');
    $this->load->library('form_validation');

    $data['title'] = 'Create a news item';

    $this->form_validation->set_rules('title', 'Title', 'required');
    $this->form_validation->set_rules('text', 'Text', 'required');

    $this->load->view('templates/header', $data);
    if ($this->form_validation->run() === FALSE) {
         $this->load->view('news/create');
    } else {
         $this->news_model->set_news();
         $this->load->view('news/success');
    }
    $this->load->view('templates/footer');
}

کد بالا قابلیت‌های زیادی رو داره اضافه میکنه. اولین‌خطوط مربوط به بارگذاری توابع کمکی Form و کتابخانه‌ی اعتبارسنجی فرم میشه. بعدش قواعدی برای اعتبارسنجی فرم تعیین میشه. متد set_rules() سه پارامتر میگیره: اسم فیلد ورودی، اسمی که باید توی پیغام خطا استفاده بشه، و قانونی که باید برای اعتبارسنجی درنظر گرفته بشه. در اینجا فیلدهای title و text ازنوع required (اجباری) تعریف شدن.

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

در ادامه، یه شرط گذاشتیم که چک میکنه آیا قوانین اعتبارسنجی با موفقیت پشت‌سر گذاشته شدن یا نه. اگه اینطور نباشه فرم ظاهر میشه ولی اگه فرم ارسال شده و تمام قوانین رو با موفقیت رد کرده باشه، مدل فراخوانی میشه. در اینجا یه ویو بارگذاری میشه تا پیغام موفقیت‌آمیز بودن عملیات رو نشون بده. یه ویو در مسیر application/views/news/success.php بسازین و پیغام دلخواهتون رو داخلش بنویسین.

مدل
تنها چیزی که باقی می‌مونه، نوشتن یه متد هست که نوشتن داده‌ها رو داخل دیتابیس انجام بده. ما از کلاس Query Builder برای درج اطلاعات در دیتابیس استفاده میکنیم و همچنین از کتابخانه ورودی برای دریافت داده‌های ارسال‌شده استفاده میکنیم. فایل مدلی که قبلاً ایجاد کرده بودین رو باز و این متد رو بهش اضافه کنین:
public function set_news()
{
    $this->load->helper('url');

    $slug = url_title($this->input->post('title'), 'dash', TRUE);

    $data = array(
        'title' => $this->input->post('title'),
        'slug' => $slug,
        'text' => $this->input->post('text')
    );

    return $this->db->insert('news', $data);
}

این متد جدید وظیفه درج آیتم خبری رو داخل دیتابیس به‌عهده داره. خط سوم یه تابع جدید یعنی url_title() بکار رفته. این تابع که توسط کتابخانه‌ی کمکی URL ارائه شده، تگ‌های HTML موجود در متنی که بهش میدین رو حذف میکنه و تمام فاصله‌ها رو با خط‌تیره (-) جایگزین میکنه و مطمئن میشه که همه‌چیز با حروف کوچک نوشته شده باشه. این‌کار به شما یه متن جایگزین تروتمیز برای Slug میده که برای ساخت آدرس اینترنتی مناسبه.

خوب بریم سراغ آماده‌سازی رکوردی که قراره بعداً ثبت بشه، داخل آرایه $data. هر عنصری متناسب با ستونی که قبلاً در دیتابیس تعریف کردیم تعریف میشه. شاید متوجه یه متد جدید در اینجا یعنی post() شده باشین که از کتابخانه‌ی ورودی اومده. این متد تضمین میکنه که داده‌ها ایمن‌سازی شده باشن و جلوی حملات زشت دیگران رو میگیره. کتابخانه‌ی ورودی بصورت پیشفرض بارگذاری میشه. درنهایت متغیر $data رو توی دیتابیس درج میکنیم.

مسیریابی
قبل از شروع به درج عناصر جدید توی پروژه‌ی کدایگنایتر که ساختیم، باید یکسری قواعد جدید به config/routes.php اضافه کنیم. این خط رو به ابتدای قوانین قبلی اضافه کنین:
$route['news/create'] = 'news/create';

حالا توی مرورگرتون آدرس index.php/news/create رو باز کنید. بهتون تبریک میگم. شما اولین برنامه‌ی CodeIgniter خودتون رو ساختین! چند خبر جدید درج کنید و صفحات مختلفی که ساختین رو تست کنین.
تشکر شده توسط: AmirGholami , GHM
#11
جمع‌بندی

توی این خودآموز تمام چیزهایی که از یه سیستم مدیریت محتوای کامل انتظار دارین رو پوشش ندادیم ولی شما رو با مباحث مهمی مثل مسیریابی، نوشتن کنترلرها و مدل‌ها و... آشنا کردیم. امیدوارم که با این خودآموز، یه دید کلی درباره‌ی برخی‌از الگوهای طراحی اولیه‌ی کدایگنایتر پیدا کرده باشین.

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

هر برنامه‌نویس سطح متوسط PHP باید بتونه به‌راحتی در عرض چند روز با کدایگنایتر کار کنه. اگه هنوز هم سؤالی درباره‌ی فریمورک یا کدهای خودتون داخلش دارین، میتونین:
  1. انجمن رو بررسی کنید
  2. به چت‌روم IRC سر بزنید
  3. مستندات Wiki رو مطالعه کنید
تشکر شده توسط: AmirGholami , GHM
#12
آدرس‌های URL در کدایگنایتر
بطور پیشفرض URL ها در CodeIgniter طوری طراحی میشن که هم برای موتورهای جستجو و هم برای کاربران مناسب باشن. بجای استفاده از روش QueryString که توی سیستمهای پویا رایجه، کداینگایتر از روش قسمت‌بندی‌شده استفاده میکنه:
example.com/news/articles/my-article

نقل قول:دقت‌کنید که میشه درصورت تمایل، روش معمولی QueryString رو هم فعال کرد که در ادامه توضیح میدیم.

قسمت‌های URL
بخش‌های مختلف URL از الگوی MVC پیروی میکنن که معمولاً در قالب این ساختاره:
example.com/class/function/ID

  1. اولین قسمت معادل کلاس کنترلری هست که باید فراخوانی بشه
  2. دومین قسمت بیانگر تابعی هست که توی کنترلر باید صدا زده بشه
  3. قسمت سوم و قسمتهای اختیاری بعدی بیانگر شناسه و هر متغیری هستن که باید برای متد موردنظر از کنترلر ارسال بشه

کتابخانه URI و همچنین کلاس کمکی URL شامل توابعی هستن که کار با داده‌های URI رو راحت‌تر میکنه. به‌علاوه URLهای شما میتونن با کمک قابلیت مسیریابی URI از حالت پیشفرض خارج بشن تا انعطاف‌پذیری لازم رو بدست بیارین.

حذف فایل index.php از آدرس
بطور پیشفرض فایل index.php توی URL ها وجود داره:
example.com/index.php/news/article/my-article

اگه ماژول mod_rewrite توی وب‌سرور Apache شما فعال باشه، میتونین به‌راحتی این فایل رو با کمک یه فایل htaccess. از آدرس حذف کنید. کافیه یه فایل به این اسم توی مسیر ریشه سایتتون بسازین و این کد رو داخلش بنویسین:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,NC,QSA]

در اینجا هر درخواستی که مستقیماً به یه فایل یا پوشه‌ی فیزیکی (مثلاً فایل‌های CSS و JS و...) اشاره نکنه، به index.php ارجاع داده میشه.

نقل قول:دقت کنید که این قوانین ممکنه برحسب تنظیمات سرور شما کار نکنه. اگه چنین شرایطی پیش اومد، با پشتیبانی هاستتون تماس بگیرین.

اضافه‌کردن یه پسوند به URL ها
توی تنظیمات config/config.php میتونین یه پسوند برای آدرس‌های تولیدشده توسط کدایگنایتر مشخص کنید. برای مثال اگه یه URL اینطوری باشه:
example.com/products/views/shows

میتونین اگه بخواین یه پسوند مثل .html اضافه کنید که باعث بشه صفحه‌ی شما به‌شکل خاصی دیده بشه:
example.com/products/views/shoes.html

فعال‌کردن حالت QueryString
توی برخی مواقع ممکنه ترجیح بدین از همون روش معمولی برای آدرس‌ها استفاده کنید:
index.php?c=products&m=view&id=345

CodeIgniter از این قابلیت هم درصورت تمایل شما، پشتیبانی میکنه و میتونین برای فعال‌کردنش ازطریق فایل config/config.php اقدام کنید:
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';

اگه پارامتر enable_query_string رو با مقدار TRUE تنظیم کنید، این قابلیت فعال میشه و کنترلرها و متدهای داخلشون باکمک شناسه‌های trigger که براشون معرفی کردین قابل دسترسی میشن:
index.php?c=controller&m=method

نقل قول:نکته: اگه از QueryString استفاده میکنین، باید خودتون URLها رو بصورت دستی بسازین و نمیتونین از کلاس‌های کمکی URL (و سایر توابع کتابخانه‌ای که URL تولید میکنن، مثل برخی از کلاس‌های کمکی فرم‌ها) استفاده کنید چون این ابزارها به‌نحوی طراحی شدن که با روش قسمت‌بندی‌شده برای URL کار کنن.
تشکر شده توسط: AmirGholami , GHM
#13
کنترلرها
Controller ها قلب برنامه شما هستن چون اونها هستن که تشخیص میدن چطور باید به درخواستهای HTTP جواب داده بشه.


یه Controller چیه؟
یه کنترلر در تعریف ساده، یه فایل کلاس هست که به‌نحوی نامگذاری شده که میشه ازطریق وب مورد دسترسی قرار بگیره. برای مثال آدرس زیر رو درنظر بگیرین:
example.com/index.php/blog/

توی این مثال، کدایگنایتر سعی میکنه یه کنترلر به‌اسم Blog.php رو پیدا و اون رو بارگذاری کنه.

نقل قول:هروقت اسم یه کنترلر با اولین قسمت یه URI مطابقت داشته باشه، بارگذاری میشه.

بگذارین امتحان کنیم: Hello World!
اجازه بدین یه کنترلر ساده بسازیم که بشه در عمل ببینیمش. با ویرایشگر متنی دلخواه خودتون یه فایل به اسم application/controllers/Blog.php بسازین و این کد رو داخلش بنویسین:
<?php
class Blog extends CI_Controller
{

   public function index()
   {
       echo 'Hello World!';
   }
}

نقل قول:مهم: دقت کنید که حتماً باید Blog.php با حرف بزرگ B شروع بشه.

حالا این آدرس رو باز کنید:
example.com/index.php/blog

اگه کارها رو درست انجام داده باشین، باید پیغام Hello World! رو ببینید.

نقل قول:مهم: اسامی کلاس‌ها باید با حروف بزرگ شروع بشن.

این کد درسته:
<?php
class Blog extends CI_Controller
{
}

ولی این کد اشتباهه:
<?php
class blog extends CI_Controller
{
}

ضمناً همیشه کنترلرهای خودتون رو از کلاس CI_Controller مشتق کنید تا متدهای مفیدی که داخلش تعریف شده (مثل رندرکردن ویوها و بارگذاری عناصر برنامه مثل مدلها و...) ازش ارث برده بشه.

متدها
توی مثال بالا، اسم متد index بود. متد index همیشه بطور پیشفرض اگه قسمت دوم URI خالی باشه بارگذاری میشه. یه راه دیگه برای نمایش پیغام «سلام دنیا!» اینه:
example.com/index.php/blog/index

قسمت دوم در URI مشخص میکنه کدوم متد از کنترلر فراخوانی بشه. بگذارین این مورد رو هم امتحان کنیم. یه متد جدید به کنترلرتون اضافه کنین:
<?php
class Blog extends CI_Controller
{

   public function index()
   {
       echo 'Hello World!';
   }

   public function comments()
   {
           echo 'Look at this!';
   }
}

حالا این آدرس رو باز کنید تا نتیجه‌ی اجرای متد comments رو ببینین:
example.com/index.php/blog/comments/

ارسال قسمت‌های URI به متدها
اگه URI شما شامل بیش از دو قسمت باشه، قسمت‌های سوم به بعد بعنوان پارامتر به متد شما ارسال میشن. برای مثال فرض کنین یه URI به این‌صورت داریم:
example.com/index.php/products/shoes/sandals/123

متد شما قسمت‌های 3 و 4 (یعنی sandals و 123) رو بعنوان پارامتر دریافت میکنه:
<?php
class Products extends CI_Controller
{

   public function shoes($type, $id)
   {
       echo '<p>' . $type . '</p>';
       echo '<p>' . $id . '</p>';
   }
}

نقل قول:مهم: اگه از قابلیت مسیریابی URI استفاده میکنین، قسمت‌هایی که برای متدتون ارسال میشه، مواردی هست که توی قوانین مسیریابی مشخص کردین.

تعریف Controller پیشفرض
CodeIgniter رو میشه طوری تنظیم کرد که اگه URI ارسال نشده باشه، یه کنترلر پیشفرض رو بارگذاری کنه (مثل وقتی که URL ریشه سایتتون رو فراخوانی میکنین). برای مشخص‌کردن یه کنترلر پیشفرض، فایل تنظیمات config/routes.php رو باز کنید و این متغیر رو پیدا و تنظیم کنین:
$route['default_controller'] = 'blog';

که در اینجا blog اسم کنترلری هست که میخواین استفاده بشه. اگه الان آدرس اصلی سایت یعنی صفحه index.php رو بدون هیچ قسمت اضافه در URI فراخوانی کنین، پیغام Hello World! بصورت پیشفرض نمایش داده میشه.

برای اطلاعات بیشتر به بخش «مسیرهای رزروشده» در مستندات مسیریابی URI مراجعه کنید.

تغییر الگوی فراخوانی متدها
همونطور که گفتیم، قسمت دوم URI معمولاً برای مشخص‌کردن اینکه کدوم متد در کنترلر فراخوانی بشه بکار میره. کدایگنایتر به شما اجازه میده که این رفتار رو با کمک متد _remap تغییر بدین:
public function _remap()
{
   // Some code here
}

نقل قول:مهم: اگه کنترلر شما شامل متد _remap باشه، همیشه فراخوانی میشه و اصلاً مهم نیست که توی URI شما چه‌چیزی وجود داشته باشه. درواقع این متد رفتار عادی که باعث میشه URI تصمیم بگیره که چه متدی فراخوانی بشه رو تغییر میده و به شما اجازه میده قوانین مسیریابی دلخواه خودتون رو برای متدها بنویسید بدون اینکه لازم باشه فایل مسیریابی اصلی رو اصلاح کنید. این قابلیت برای استفاده‌ی مجدد از کنترلرتون توی پروژه‌های بعدی خیلی مفیده.

متدی که توسط URI درخواست شده (معمولاً قسمت دوم URI)، بعنوان پارامتر برای متد _remap ارسال میشه:
public function _remap($method)
{
   if ($method === 'some_method') {
       $this->$method();
   } else {
       $this->default_method();
   }
}

سایر قسمت‌های اضافه بعد از اسم متد، برای متد _remap بصورت یه آرایه بعنوان پارامتر دوم ارسال میشن که اختیاریه. این آرایه میتونه با ترکیب متد داخلی PHP یعنی call_user_func_array بکار بره تا رفتار پیشفرض CodeIgniter رو شبیه‌سازی کنه. برای مثال:
public function _remap($method, $params = array())
{
   $method = 'process_' . $method;
   if (method_exists($this, $method))
   {
       return call_user_func_array(array($this, $method), $params);
   }
   show_404();
}

پردازش خروجی
کدایگنایتر یه کلاس خروجی داره که وظیفه‌ی ارسال محتوای نهایی تولیدشده رو برای مرورگر کاربر، بعهده داره. درمورد این کلاس میتونین اطلاعات بیشتری رو توی مستندات ویوها و کلاس Output پیدا کنین. در برخی مواقع ممکنه بخواین بعد از تولید محتوای نهایی که به هر شکلی بدست اومده، یکسری کارها رو قبل از ارسال به مرورگر کاربر انجام بدین. CodeIgniter به شما اجازه میده یه متد به‌اسم _output توی کنترلرهای خودتون داشته باشین که خروجی نهایی رو دریافت میکنه و میتونه کارهای لازم رو روی اون انجام بده.

نقل قول:مهم: اگه کنترلر شما شامل متدی به‌اسم _output باشه، همیشه بجای نمایش مستقیم خروجی، این متد توسط کلاس Output فراخوانی میشه و خروجی که قرار بوده برای کلاینت ارسال بشه، به این متد تحویل داده میشه. پارامتر اول این متد شامل محتوای نهاییه.

به این مثال دقت کنین:
public function _output($output)
{
    echo $output;
}

نقل قول:نکته: دقت کنید که متد _output شما داده‌ها رو در وضعیت نهایی خودش دریافت میکنه. بنابراین قبل‌از اینکه خروجی به متد _output تحویل داده بشه، داده‌های مربوط به سنجش سرعت و کارآیی و مصرف حافظه هم نمایش داده میشن و همچنین فایل‌های Cache هم درصورتی که قابلیت کش‌کردن رو فعال کرده باشین، نوشته میشن و هدرها هم اگه از قابلیت مربوطه استفاده کرده باشین، برای مرورگر ارسال میشه. برای اینکه محتوای خروجی کنترلر شما به‌درستی کش بشه میتونین توی متد _output اینطوری بنویسید:

if ($this->output->cache_expiration > 0) {
    $this->output->_write_cache($output);
}

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

متدهای خصوصی
در برخی مواقع ممکنه بخواین یکسری متدهای کنترلر از دسترسی عمومی خارج بشه. برای رسیدن به چنین منظوری، کافیه خیلی ساده، اون متدها رو بصورت private یا protected تعریف کنین تا بعنوان یه درخواست URL مورد پردازش قرار نگیرن. برای مثال میتونین یه متد به این شکل داشته باشین:
private function _utility()
{
    // Some code
}

هر تلاشی برای دسترسی به این متد منجر به خطای 404 میشه:
example.com/index.php/blog/_utility/

نقل قول:نکته: قراردادن یه Underscore (کارکتر _) قبل از اسم متد هم جلوی فراخوانی اون رو میگیره. این یه قابلیت مربوط به نسخه‌های قدیمی کدایگنایتر هست که بخاطر حفظ سازگاری اسکریپت‌های قدیمی با نسخه‌های جدید فریمورک، همچنان باقی مونده.

سازماندهی کنترلرها در پوشه‌های فرعی
اگه دارین یه برنامه بزرگ میسازین، ممکنه بخواین یه ساختار سلسله‌مراتبی برای کنترلرهای خودتون توی پوشه‌های تودرتو ایجاد کنین. CodeIgniter به شما اجازه‌ی چنین کاری رو میده.

خیلی ساده کافیه پوشه‌های فرعی رو داخل مسیر application/controllers ایجاد کنید و کلاس‌های کنترلر خودتون رو داخلشون ذخیره کنین. وقتی از این قابلیت استفاده کنین، اولین قسمت توی URI باید پوشه رو مشخص کنه. برای مثال اگه کنترلر شما در این مسیر باشه:
application/controllers/products/Shoes.php
برای فراخوانی این کنترلر باید URI شما شبیه این باشه:
example.com/index.php/products/shoes/show/123

هرکدوم از پوشه‌های فرعی میتونن یه کنترلر پیشفرض داشته باشن که اگه URL فقط شامل اسم پوشه بود، اون کنترلر فراخوانی بشه و اسم این کنترلر باید با اسمی که توی تنظیمات config/routes.php تحت‌عنوان default_controller مشخص کردین یکسان باشه.

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

سازنده‌های کلاس
اگه بخواین از یه سازنده توی هرکدوم از کنترلرهای خودتون استفاده کنین، باید این کد رو داخل سازنده‌ی خودتون بگذارین:
parent::__construct();

علت این موضوع اینه که سازنده‌ی شما داره سازنده‌ی کلاس والد یعنی CI_Controller رو رونویسی میکنه و اگه بخواین کنترلر کدایگنایتر به‌شکل درست کار کنه باید سازنده‌ی والد رو فراخوانی کنین. برای مثال:
<?php
class Blog extends CI_Controller
{

    public function __construct()
    {
        parent::__construct();
        // Your own constructor code
    }
}

سازنده‌ها در مواقعی که میخواین یکسری مقادیر پیشفرض تنظیم‌کنین یا یکسری کارها رو وقتی که کلاس شما فراخوانی میشه و یه شئ ازش ساخته میشه، مفید هستن. سازنده‌ها نمیتونن چیزی رو بعنوان نتیجه برگردونن ولی میتونن یکسری کارها رو بصورت پیشفرض انجام بدن.

اسامی رزروشده برای متدها
از اونجا که کلاس‌های کنترلر شما از کلاس Controller پیشفرض کدایگنایتر مشتق میشن، باید دقت کنید که اسم متدهای خودتون رو مشابه متدهایی که توی اون کلاس تعریف‌شده درنظر نگیرین چون دراینصورت متدهای شما متدهای کلاس والد رو رونویسی میکنن. فهرست اسامی رزروشده برای برای دیدن یه فهرست کامل بررسی کنید.

نقل قول:مهم: شما هیچوقت نباید اسم یه متد رو همنام با کلاسش بگذارین. اگه اینکار رو انجام بدین و متد __construct توی اون کلاس وجود نداشته باشه، اونوقت متد index بعنوان سازنده‌ی کلاس فراخوانی میشه! این قابلیت بخاطر سازگاری PHP با نسخه‌ی قدیمی یعنی PHP4 توسط خود زبان PHP درنظر گرفته شده.

تمام شد!
توضیحاتی که گفتیم، بصورت خیلی خلاصه شامل تمام چیزهایی بود که باید درمورد کنترلرها میدونستین.
تشکر شده توسط: AmirGholami , GHM
#14
اسامی رزروشده
برای کمک به شما، کدایگنایتر یکسری توابع، متدها، کلاس‌ها و متغیرهایی رو در عملیات داخلی خودش تعریف کرده. بخاطر همین، بعضی از اسامی رو نمیشه توسط برنامه‌نویس بکاربرد چون قبلاً مورداستفاده قرار گرفته. در اینجا فهرستی از اسامی رزروشده رو که نمیتونین استفاده کنین مشاهده میکنید.

اسامی کنترلرها
از اونجا که کلاس‌های کنترلر از کلاس کنترلر اصلی برنامه مشتق میشن، باید مراقب باشین که اسم متدها رو مشابه متدهای کلاس اصلی بکار برین؛ درغیر اینصورت متدهای محلی شما، متدهایی که از کلاس والد به‌ارث رسیدن رو رونویسی میکنن. در اینجا فهرستی از اسامی رزروشده رو مشاهده میکنید که نباید اسم کنترلرتون رو یکی از اینها انتخاب کنید:


نقل قول:
CI_Controller
Default
index

توابع
نقل قول:
is_php()
is_really_writable()
load_class()
is_loeaded()
get_config()
config_item()
show_error()
show_404()
log_message()
set_status_header()
get_mimes()
html_escape()
remove_invisible_characters()
is_https()
function_usable()
get_instance()
_error_handler()
_exception_handler()
_stringify_attributes()

متغیرها
نقل قول:
$config
$db
$lang

ثابت‌ها
نقل قول:
ENVIRONMENT
FCPATH
SELF
BASEPATH
APPPATH
VIEWPATH
CI_VERSION
MB_ENABLED
ICONV_ENABLED
UTF8_ENABLED
FILE_READ_MODE
FILE_WRITE_MODE
DIR_READ_MODE
DIR_WRITE_MODE
FOPEN_READ
FOPEN_READ_WRITE
FOPEN_WRITE_CREATE_DESTRUCTIVE
FOPEN_READ_WRITE_CREATE_DESTRUCTIVE
FOPEN_WRITE_CREATE
FOPEN_READ_WRITE_CREATE
FOPEN_WRITE_CREATE_STRICT
FOPEN_READ_WRITE_CREATE_STRICT
SHOW_DEBUG_BACKTRACE
EXIT_SUCCESS
EXIT_ERROR
EXIT_CONFIG
EXIT_UNKNOWN_FILE
EXIT_UNKNOWN_CLASS
EXIT_UNKNOWN_METHOD
EXIT_USER_INPUT
EXIT_DATABASE
EXIT__AUTO_MIN
EXIT__AUTO_MAX
تشکر شده توسط: AmirGholami , GHM
#15
ویوها
یه View بطور ساده، یه صفحه‌ی وب یا بخشی از یه صفحه (مثل هدر، فوتر، نوار کناری و...) است. درحقیقت ویوها میتونن درصورت نیاز شما به چنین ساختار سلسله‌مراتبی خاصی، با سایر ویوها بصورت کاملاً انعطاف‌پذیر ترکیب بشن (داخل ویوهای دیگه و...).

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

با استفاده از کنترلر نمونه‌ای که توی صفحه کنترلر ساختین، اجازه بدین یه ویو بهش اضافه کنیم.

ایجاد یک ویو
با استفاده از ویرایشگر متنی خودتون، یه فایل به‌اسم application/views/blogview.php بسازین و این کد رو داخلش بنویسین:
<html>
    <head>
        <title>My Blog</title>
    </head>
    <body>
        <h1>Welcome to my blog!</h1>
    </body>
</html>

بارگذاری یک View
برای بارگذاری یه ویوی خاص از متد زیر استفاده میکنیم:
$this->load->view('name');

که بجای name باید اسم فایل view خودتون رو بنویسین.

نقل قول:نکته: لازم نیست پسوند فایل ویو رو بنویسید مگه اینکه از چیزی بجز .php استفاده کرده باشین.

حالا فایل کنترلر خودتون رو که قبلاً به‌اسم Blog.php ساخته بودین باز کنین و محتوای متد index رو به این شکل بهش اضافه کنین:
example.com/index.php/blog/index

بارگذاری چند ویو
کدایگنایتر بطور هوشمند فراخوانی چندگانه به متد $this->load->view() رو از داخل کنترلر پشتیبانی میکنه. اگه بیش از یه فراخوانی اتفاق بیفته، خروجی اونها رو به هم اضافه میکنه. برای مثال ممکنه بخواین یه ویوی هدر، یه ویوی منو، یه ویوی محتوا و یه ویوی فوتر داشته باشین:
<?php

class Page extends CI_Controller
{

    public function index()
    {
        $data['page_title'] = 'Your title';
        $this->load->view('header', $data);
        $this->load->view('menu');
        $this->load->view('content', $data);
        $this->load->view('footer');
    }
}

توی مثال بالا، ما از «محتوای پویا» هم استفاده کردیم که درموردش توضیح میدیم.

ذخیره‌کردن ویوها داخل پوشه‌های فرعی
فایل‌های ویوی شما میتونن داخل پوشه‌های فرعی هم برای سازمان‌دهی بهتر ذخیره بشن. اگه چنین کاری انجام بدین، باید اسم پوشه رو هم درکنار اسم ویو ذکر کنید. برای مثال:
$this->load->view('directory_name/file_name');

اضافه‌کردن محتوای پویا به ویو
داده‌هایی که از کنترلر به ویو ارسال میشن رو باید بصورت یه آرایه یا شئ در پارامتر دوم متد بارگذاری ویو مشخص کنین. به این مثال‌ها دقت کنین:
$data = array(
    'title' => 'My Title',
    'heading' => 'My Heading',
    'message' => 'My Message',
);
$this->load->view('blogview', $data);

همچنین میشه از متد compact خود PHP برای ساخت آرایه‌ای که اندیس‌هاش با اسامی متغیرها یکیه استفاده کرد. این مثال با مثال قبلی یکیه:
$title = 'My Title';
$heading = 'My Heading';
$message = 'My Message';
$this->load->view('blogview', compact('title', 'heading', 'message'));

این هم یه مثال از استفاده از اشیاء بعنوان پارامتر:
$data = new SomeClass();
$this->load->view('blogview', $data);

نقل قول:نکته: اگه از یه شئ استفاده کنین، فیلدهای کلاس تبدیل به عناصر آرایه میشن.

خوب اجازه بدین این رو با کنترلر خودمون تست کنیم. محتوای متد index رو از کنترلر Blog به این شکل تغییر بدین:
public function index()
{
    $data['title'] = 'My Real Title';
    $data['heading'] = 'My Real Heading';
    $this->load->view('blogview', $data);
}

حالا فایل ویوی blogview.php رو باز کنین و محتواش رو به این شکل تغییر بدین:
<html>
    <head>
        <title><?php echo $title; ?></title>
    </head>
    <body>
        <h1><?php echo $heading; ?></h1>
    </body>
</html>

ایجاد حلقه
آرایه‌ای که به فایل‌های ویو ارسال میکنین محدود به مقادیر ساده نیست. میتونین از آرایه‌های چندبعدی هم استفاده کنین که داخل حلقه‌ها برای تولید سطرهای مختلف پیمایش بشن. برای مثال اگه داده‌ها رو از دیتابیس استخراج میکنین، معمولاً بصورت آرایه‌های چندبعدی خواهد بود. در اینجا یه مثال ساده رو مشاهده میکنین:
public function index()
{
    $data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');
    $data['title'] = 'My Real Title';
    $data['heading'] = 'My Real Heading';
    $this->load->view('blogview', $data);
}

حالا ویوی خودتون رو باز کنین و یه حلقه بسازین:
<html>
    <head>
        <title><?php echo $title;?></title>
    </head>
    <body>
        <h1><?php echo $heading;?></h1>
        <h3>My Todo List</h3>
        <ul>
            <?php foreach ($todo_list as $item): ?>
            <li><?php echo $item; ?></li>
            <?php endforeach; ?>
        </ul>
    </body>
</html>

نقل قول:نکته: ممکنه دقت کرده باشین که توی مثال بالا ما از دستورزبان جایگزین PHP استفاده کردیم. اگه با این روش آشنا نیستین، اینجا رو مطالعه کنین.

بازگشت خروجی ویوها بعنوان اطلاعات
یه پارامتر سوم بصورت اختیاری داخل متد بارگذاری ویو وجود داره که به شما اجازه میده نحوه‌ی رفتار متد رو تغییر بدین تا بجای ارسال خروجی برای مرورگر، اون رو بصورت یه رشته برای شما برگردونه. این موضوع درصورتی که بخواین قبل از نمایش محتوا، پردازش خاصی روش انجام بدین میتونه مفید باشه. اگه پارامتر سوم رو با مقدار TRUE تنظیم کنین، خروجی View بصورت یه رشته برگردونده میشه. مقدار پیشفرض این پارامتر FALSE هست که باعث میشه خروجی ویو برای مرورگر ارسال بشه. یادتون باشه که اگه میخواین از خروجی این متد استفاده کنین، باید اون رو توی یه متغیر ذخیره کنین:
$string = $this->load->view('myfile', '', TRUE);
تشکر شده توسط: AmirGholami , GHM




کاربران در حال بازدید این موضوع: 1 مهمان