/
  • آموزش کدایگنایتر 3

  • ارسال پاسخ   امتیاز موضوع:
    • 1 رأی - میانگین امیتازات: 5
    • 1
    • 2
    • 3
    • 4
    • 5

    حالت موضوعی | حالت خطی آموزش کدایگنایتر 3
    نویسنده پیام
    Version غایب
    عضو جدید
    **

    ارسال‌ها: 27
    تاریخ عضویت: ۱۳۹۳ شهريور ۱۵
    اعتبار: 8
    تشکرها : 0
    ( 64 تشکر در 27 ارسال )
    ارسال: #1
    آموزش کدایگنایتر 3
    این آموزش مناسب کلیه کسانی هست که می‌خواهد کار با یک فریمورک را شروع کنند. سعی میکنم با مطالبی مانند تاریخچه ها و مطالب تئوری وقت خودم و شما را هدر ندهم، کلیه مطالب آموزشی در قالب پروژه و با توضیح کامل ارائه خواهند شد.

    مقدمه
    استفاده از فریمورک‌ها سرعت کدنویسی و توسعه برنامه‌های شما را افزایش خواهد داد. کدایگنایتر یکی از بهترین فریمورک‌ها برای شروع کار با فریمورک‌های PHP است که ورژن 4 آن در هنگام نگارش این مطلب در فاز بتا بود، به همین دلیل این تاپیک برای آموزش نسخه 3 ایجاد شده است و منبع آموزش‌ها راهنمای سایت کدایگنایتر است. پروژه‌های عملی این آموزش نیز در گیت هاب منتشر خواهند شد. درباره لایسنس MIT کدایگنایتر ذکر این نکته خالی از لطف نیست که شما می توانید هر کاری دلتان می خواهد (مانند ویرایش، کپی، فروش محصول تولید شده با استفاده از آن و ...) با کدایگنایتر انجام دهید.

    لازمه انجام این آموزش: آشنایی با اصول شی گرایی در PHP و MVC است. همچنین یک IDE (ترجیحا PHPStorm) یا ویرایشگر متن (ترجیحا sublime text) و یک مرورگر (ترجیحا کروم) و همچنین یک شبیه ساز وب سرور (ترجیحا Xampp) پیش نیازهای نرم افزاری این آموزش هستند که توصیه می‌کنم آخرین ورژن آن‌ها را نصب کنید.

    دانلود و نصب
    به صفحه دانلود کدایگنایتر بروید، ورژن 3 را با زدن دکمه Download Codeigniter 3 دانلود کنید.
    فایل را در مسیر 
    کد:
    C:/xampp/htdocs/
    از حالت فشرده خارج کرده و نام پوشه ایجاد شده را به atys تغییر دهید. داخل این پوشه را دایرکتوری ریشه (روت) می گویند که از این به بعد تا انتهای این مطلب، مسیرها نسبت به ریشه یا مستقیم نوشته می شوند.
    آتیس (Atys) نام یکی از خدایان یونان باستان است.

    بهتر است یک دامنه در لوکال تعریف کنیم تا استفاده از سیستم راحت‌تر باشد، اسم این دامنه را atys.localhost انتخاب می‌کنیم، البته هر نام و پسوندی دوست دارید می‌توانید جایگزین کنید:
    فایل httpd-vhosts.conf را که در مسیر
    کد:
    C:\xampp\apache\conf\extra
    قرار دارد، را باز کنید. دقت کنید که ممکن است این فایل در wamp یا شبیه سازهای دیگر در مسیر دیگری باشد، همین نام فایل را در سیستم خود در پوشه مربوط به فایل های شبیه ساز سرور خود جستجو کنید.
    کد:
    <VirtualHost *:80>
        DocumentRoot "c:/xampp/htdocs/atys"
        ServerName atys.localhost
        <Directory "c:/xampp/htdocs/atys">
        </Directory>
    </VirtualHost>
    فایل را ذخیره کنید.

    نکته: اگر فایل ذخیره نشد، ابتدا آن را در محل دیگری مثلا دسکتاپ سیستم خود ذخیره کنید و سپس به محلی که فایل در آنجا قرار دارد کپی کنید تا جایگزین قبلی شود.
    فایل hosts (دقت کنید این فایل پسوند ندارد) را که در مسیر قرار دارد باز کنید و در انتهای آن کد زیر را در خط جدیدی اضافه کنید.
    کد:
    127.0.0.1/atys atys.localhost
    حالا باید وب سرور آپاچی را ری استارت کنید.
    حالا آدرس http://atys.localhost را در مرورگر خود تایپ کنید و با فشردن Enter باید به صفحه‌ای بروید که با عبارت Welcome to Codeigniter مواجه خواهد شد.
    نکته: اگر کروم http را فراموش کردید درغیر اینصورت کروم این آدرس گوگل کرد.

    چارت پروسه کار اپلیکیشن‌
       
    به طور خلاصه روند کار بدین صورت است که:
    1. تمام درخواست‌ها به فایل index.php ارجاع می‌شود.
    2. روتر درخواست را بررسی می‌‌کند و تصمیم می‌گیرد که با درخواست چه برخوردی داشته باشد.
    3. اگر فایل کش وجود داشته باشد، مستقیما به مرورگر ارسال خواهد شد.
    4. درخواست HTTP و تمامی داده‌های ارسال شده توسط کاربر، فیلتر می شود و سپس نوبت کنترلر می‌رسد که وظیفه خود را به عنوان قلب تپنده MVC انجام دهد.
    5. وظیفه کنترلر بارگذاری مدل‌ها، کتابخانه‌ها، فایل‌های کمکی (Helper) و تمامی منابع مورد نیاز برای پردازش درخواست است.
    6. ویو نهایی که قرار است به کاربر نمایش داده شود، ابتدا رندر می‌شود و سپس به مرورگر کاربر ارسال خواهد شد. همچنین قابلیت کش کردن فعال باشد، این ویو اول کش می‌شود تا در درخواست‌های بعدی مورد استفاده قرار گیرد.

    این نکته را به خاطر داشته باشید که تمامی متدها و کلاس‌هایی که قرار است در مدل‌ها، کنترلرها و ویوها بارگذاری و استفاده شود را ما تعیین می‌کنیم.

    یادآوری: اگر نمی دانید MVC چیست و در یک جمله می خواهید بدانید، الگوی معماری MVC (مخفف Model View Controller) روشی برای جداسازی منطق برنامه از خروجی قابل نمایش به کاربر است. مدل‌ها کلاس‌هایی هستند که با فراخوانی و ذخیره داده‌ها سروکار دارند، هر نما یک صفحه وب یا بخشی از یک صفحه وب است، در نهایت کنترلر مسئول ارتباط بین مدل، ویو و هر منبعی برای پردازش درخواست‌های HTTP و تولید صفحا وب است.

    این مطلب به مرور و به صورت روزانه آپدیت می‌شود، لطفا پستی در این مطلب ارسال نکنید و هر مشکلی در طول پروژه را از طریق انجمن مربوط به کدایگنایتر مطرح کنید.
    __________________________________________________________________________
    باورژن
    (آخرین ویرایش در این ارسال: ۱۳۹۶ بهمن ۲۷ ۰۶:۲۱ عصر، توسط Version.)
    ۱۳۹۶ بهمن ۳ ۰۷:۱۰ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : undefined Y.P.Y Alaa ayoubsys ImanAzadi
    Version غایب
    عضو جدید
    **

    ارسال‌ها: 27
    تاریخ عضویت: ۱۳۹۳ شهريور ۱۵
    اعتبار: 8
    تشکرها : 0
    ( 64 تشکر در 27 ارسال )
    ارسال: #2
    RE: آموزش کدایگنایتر 3
    یک دیتابیس با نام atys بسازید.
    بحث این آموزش کدایگنایتر است نه نوع کدگذاری و دیتابیس، اگر نیاز به بحث دارید، در انجمن مربوط به دیتابیس‌ها مطرح کنید. همچنین اگر دلیل ساخت هر کدام از جداول یا ستون‌ها را متوجه نشدید، نگران نباشید با رسیدن به بخش مورد نظر متوجه خواهید شد.

    اولین موردی که نیاز داریم، جدول مربوط به ذخیره تنظیمات سایت است:
    جدول settings را با استفاده از کد زیر بسازید: (انتظار می‌رود که روش اینکار را بدانید، ولی اگر نمی‌دانید، کد زیر را در تب SQL دیتابیس‌تان در phpmyadmin اجرا کنید.)
    کد:
    CREATE TABLE `settings` (
    `setting_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `setting_value` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
    PRIMARY KEY (`setting_name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    جداول زیر مربوط به کاربران، گروه‌های کاربری و دسترسی‌ها است،
    جدول users را ایجاد کنید:
    کد:
    CREATE TABLE `users` (
    `id` int(10) NOT NULL AUTO_INCREMENT,
    `user_name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
    `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `password` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
    `first_name` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
    `last_name` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
    `password_reset_token` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
    `email_verification_token` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
    `created_at` int(11) NOT NULL,
    `updated_at` int(11) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `idx-users-user_name` (`user_name`),
    UNIQUE KEY `idx-users-email` (`email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    جدول rule_items را بسازید:
    کد:
    CREATE TABLE `rule_items` (
    `item_name` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
    `is_usergroup` tinyint(1) NOT NULL DEFAULT '0',
    `description` text COLLATE utf8_unicode_ci,
    PRIMARY KEY (`item_name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    جدول rule_item_child را بسازید:
    کد:
    CREATE TABLE `rule_item_childs` (
    `parent` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
    `child` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
    PRIMARY KEY (`parent`,`child`),
    KEY `child` (`child`),
    CONSTRAINT `fk-rule_item_childs-parent` FOREIGN KEY (`parent`) REFERENCES `rule_items` (`item_name`) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `fk-rule_item_childs-child` FOREIGN KEY (`child`) REFERENCES `rule_items` (`item_name`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    در نهایت جدول rule_assignments را بسازید:
    کد:
    CREATE TABLE `rule_assignments` (
     `item_name` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
     `user_id` int(10) NOT NULL,
     `created_at` int(11) DEFAULT NULL,
     PRIMARY KEY (`item_name`,`user_id`),
     KEY `auth_assignment_user_id_idx` (`user_id`),
     CONSTRAINT `fk-rule_assignment-item_name` FOREIGN KEY (`item_name`) REFERENCES `rule_items` (`item_name`) ON DELETE CASCADE ON UPDATE CASCADE,
     CONSTRAINT `fk-rule_assignment-user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    مسائلی که باید بدانید:
    • جدول settings برای نگهداری تنظیمات کلی مربوط به سایت استفاده می‌شود.
    • جدول users اطلاعات مربوط به کاربران سایت را نگهداری می‌کند، فیلدهای password_reset_token و email_verification_token به ترتیب برای تایید درخواست بازیابی پسورد و تغییر ایمیل کاربرد دارند.
    • جدول rule_items اطلاعات مربوط به گروه‌های کاربری و دسترسی‌ها را نگهداری می‌کند. فیلد is_usergroup تعیین می‌کند که هر آیتم گروه کاربری است یا دسترسی.
    • جدول rule_item_childs برای جلوگیری از تکرار است و توسط آن می‌توان مشخص کرد که یک دسترسی مربوط به کدام گروه کاربری است، ضمن اینکه میتوان مشخص کرد که مثلا کاربران با گروه کاربری ناظر، تمام دسترسی‌های کاربر نویسنده را دارند بعلاوه دسترسی‌های گروه کاربری خودشان و کاربر گروه کاربری مدیر تمام دسترسی‌های ناظر را (که شامل دسترسی‌های گروه نویسنده نیز می‌شود) دارند بعلاوه دسترسی‌های مربوط به خودشان.
    • جدول rule_assignments نیز برای تخصیص نقش به هر کاربر است.
    __________________________________________________________________________
    باورژن
    (آخرین ویرایش در این ارسال: ۱۳۹۶ بهمن ۲۷ ۰۶:۲۲ عصر، توسط Version.)
    ۱۳۹۶ بهمن ۴ ۰۸:۲۰ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : Y.P.Y Alaa ayoubsys ImanAzadi
    Version غایب
    عضو جدید
    **

    ارسال‌ها: 27
    تاریخ عضویت: ۱۳۹۳ شهريور ۱۵
    اعتبار: 8
    تشکرها : 0
    ( 64 تشکر در 27 ارسال )
    ارسال: #3
    RE: آموزش کدایگنایتر 3
    فراموش نکنید که پروژه آتیس را در IDE وارد کنید.
    توضیح کامل ساختار دایرکتوری‌ها (پوشه‌ها) در حال حاضر فقط شما را گیج می‌کند و دانستن درباره آن‌ها هم فایده‌ای ندارد، به موقع و در هنگام استفاده به کاربرد هر دایرکتوری می‌پردازم.

    دایرکتوری application حاوی دایرکتوری‌های مربوط به پروژه ما هست و کار ما در این دایرکتوری انجام می‌شود و دایرکتوری system نیز مربوط به فایل‌های هسته کدایگنایتر است که ما کاری به آن‌ها نداریم. البته یک دایرکتوری دیگر نیز به صورت پیش‌فرض با نام user_guide وجود دارد که در واقع نسخه ای آفلاین از راهنمای کدایگنایتر است و می توانید آن را پاک کنید، در انتهای آموزش ما این دایرکتوری را حذف خواهیم کرد.

    نکته: اگر مایلید که نام دو دایرکتوری اصلی را تغییر دهید، باید نام مورد نظرتان را در فایل index.php در روت پروژه نیز تغییر دهید، برای تغییر نام دایرکتوری system باید مقدار متغییر $system_path و برای تغییر نام دایرکتوری application نیز مقدار متغییر $application_folder را تغییر دهید. (با ctrl + F می توانید این متغییرها را پیدا کنید) البته ما در طول این آموزش این نام‌ها را تغییر نمی‌دهیم و شاید در انتهای پروژه به app و sys تغییر دهیم.

    دایرکتوری config یکی از دایرکتوری‌هایی است که داخل دایرکتوری application قرار دارد و حاوی فایل‌های تنظیمات پروژه ما است. مثلا اگر می‌خواهید پیام‌های سیستمی کدایگنایتر (پیام‌هایی که توسط کدایگنایتر در پروژه به شما نمایش داده می‌شود را تغییر دهید، ابتدا به صفحه دانلود کدایگنایتر بروید و سپس از قسمت مربوط به کدایگنایتر 3 روی لینک Download System Message Translations و فایل Source Code را با پسوند مورد نظرتان دانلود کنید. حالا فایل دانلود شده را باز کنید، این فایل حاوی دو پوشه است، در پوشه language به دنبال پوشه مورد نظر که با نام زبان مورد نظرتان است را پیدا کنید، (مثلا پوشه persian) حالا این پوشه را انتخاب کرده و در دایرکتوری language واقع در دایرکتوری system بریزید، حالا باید در مسیر system/language دو پوشه با نام‌های english و persian داشته باشید، دقت کنید که ما فعلا کاری به دایرکتوری language مربوط به دایرکتوری application نداریم ولی این دایرکتوری برای فایل‌های زبان مربوط به پروژه است در صورتی که دایرکتوری language داخل system مربوط به پیام‌های تولید شده توسط هسته کدایگنایتر است.
    در فایلی که دانلود کردید یک پوشه دیگر نیز با نام core وجود دارد که حاوی یک فایل (با نام MY_LANG.php) است، آن فایل را به دایرکتوری system/core منتقل کنید و سپس آن را باز کنید و مقدار پراپرتی $base_language را به persian تغییر دهید. همچنین بهتر است یک کپی از پوشه english موجود در دایرکتوری application/language بگیرید و نام آن را persian بگذارید. همچنین در فایل config.php که در دایرکتوری application/config قرار دارد به دنبال اندیس language آرایه $config (یعنی $config['language']) بگردید و مقدار آن را نیز persian بگذارید.
    کد:
    system/
            language/
                    english/
                            ...
                            email_lang.php
                            form_validation_lang.php
                            ...
                    persian/

    application/
            language/
                    english/
                            error_messages_lang.php
                    persian/
                            ...
                            email_lang.php
                            error_messages_lang.php
                            form_validation_lang.php
                            ...

    اگر به صفحه اصلی پروژه (atys.localhost) بروید، می‌بینید که زبان آن تغییر نکرده، نگران نباشد، زبان تغییر کرده و دلیل اینکه تغییری نمی‌بینید این است که کل متن این صفحه استاتیک نوشته شده و هیچ متنی از آن در فایل‌های زبان قرار نگرفته، برای مشاهده محتویات این فایل، به دایرکتوری application/views رفته و فایل welcome_message.php را باز کنید. اگر می‌خواهید این فایل رو تغییر دهید باید به دایرکتوری application/controllers بروید و فایل Welcome.php را باز کنید، متد index مسئول نمایش محتوای این صفحه است که در اینجا تصمیم دارد با دستور زیر فایل welcome_message را نمایش دهد.
    کد PHP:
    $this->load->view('welcome_message'); 
    به عنوان یک تمرین محتوای زیر را جایگزین آن کنید:
    کد PHP:
    echo 'Hello iranphp.org!'

    شاید فکر کنید که چرا متد index کنترلر Welcome برای صفحه اصلی استفاده شدند، دلیل آن در قواعد مسیریابی است. قواعد مسیریابی در فایل routes.php در دایرکتوری application/config قرار دارند، این فایل را باز کنید، در آن اندیس default_controller آرایه $route را بیابید و نام کنترلر مورد نظرتان را بنویسید (دقت کنید که گرچه نام فایل و کلاس کنترلر به صورت کپیتال -یعنی حرف اول بزرگ- است ولی اینجا باید تماما حروف کوچک باشد)،

    برای ساخت صفحات ایستا باید ابتدا یک قاعده مسیریابی تعیین کنید، قبل از اینکار صفحه atys.localhost/about را در مرورگرتان باز کنید، با خطای 404 روبرو خواهید شد، حالا خط زیر را به فایل routes.php اضافه کنید:
    کد PHP:
    $route['about'] = 'welcome/about'
    این خط به مسیریاب کدایگنایتر می‌گویند که درخواست‌های صفحه atys.localhost/about را به متد about از کنترلر welcome بفرست، خب باید این متد رو بسازیم، پس فایل Welcome.php را باز کنید و متد زیر را به آن اضافه کنید:
    کد PHP:
    public function about()
        {
            echo 
    'About me page...';
        } 
    ، سپس صفحه atys.localhost/about را در مرورگرتان وارد کنید. می‌بینید که یک صفحه استاتیک ایجاد شد.

    حالا خطی که برای اینکار در فایل routes.php اضافه کردید را پاک کنید، همچنین فایل‌های welcome_message.php در application/views و Welcome.php در application/controller را پاک کنید تا در قسمت بعد ساختارهای اختصاصی برنامه خودمان را ایجاد کنیم.

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

    گرچه فکر می‌کنم حجم و سرعت مطالب آموزشی مناسب است اما در صورتی که از سرعت و حجم آموزش ناراضی هستید و تمایل به افزایش حجم مطالب دارید به صورت پیام خصوصی مطرح کنید.
    __________________________________________________________________________
    باورژن
    (آخرین ویرایش در این ارسال: ۱۳۹۶ بهمن ۷ ۱۰:۲۶ صبح، توسط Version.)
    ۱۳۹۶ بهمن ۶ ۱۰:۰۶ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : Y.P.Y Alaa ayoubsys ImanAzadi
    Version غایب
    عضو جدید
    **

    ارسال‌ها: 27
    تاریخ عضویت: ۱۳۹۳ شهريور ۱۵
    اعتبار: 8
    تشکرها : 0
    ( 64 تشکر در 27 ارسال )
    ارسال: #4
    RE: آموزش کدایگنایتر 3
    در این مطلب درباره کنترلر، مدل و ویو توضیحاتی میدم.
    خب اولین کاری که باید انجام بدیم وارد کردن داده‌های پیش‌فرض مورد نظر ما (تنظیمات سایت) در دیتابیس است، باید رکوردهای زیر را در جدول settings دیتابیس atys وارد کنیم:
    • نام سایت: "site_name" با مقدار "سیستم مدیریت محتوای آتیس"
    • کاربر امکان ثبت نام دارد: "user_can_register" با مقدار "1"
    در پست‌های بعدی، آیتم‌های بیشتری به این لیست اضافه خواهند شد.

    راهنمایی: اگر نمی‌توانید مقادیر فوق را به جدول مورد نظر اضافه کنید، از تب insert استفاده کنید، یا دستور زیر را در تب SQL اجرا کنید:
    کد:
    INSERT INTO `settings` (`setting_name`, `setting_value`) VALUES ('site_name', 'سیستم مدیریت محتوای آتیس'), ('user_can_register', '1');

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

    کنترلرها

    اولین کنترلری که باید بسازید کنترلر Site است (این نام انتخابی است و هر چه دوست دارید می‌توانید بگذارید)، ما از این کنترلر برای هَندل برخی از درخواست‌های استفاده می‌کنیم.

    روش ساخت کنترلر: ابتدا نام کنترلر را انتخاب کنید (مثلا در مثال بالا Site) و دقت داشته باشید که حتما باید کپیتال (یعنی حرف اول بزرگ و سایر حروف کوچک باشد)، سپس فایلی با این نام و پسوند php و محتوای زیر بسازید:
    کد PHP:
    class Site extends CI_Controller {
        public function 
    index() {
            
        }

    نکته: دقت کنید که نام کلاس باید همنام فایل بوده و از کلاس CI_Controller مشتق شده باشد.

    ساخت صفحات مدیریت برای ورود راحت‌تر داده‌ها است. بهتره که کنترلرهای پنل مدیریت رو از کنترلرهای مربوط به تعامل با کاربران سایت جدا کنیم، برای اینکار یک پوشه با نام admin در دایرکتوری application/controllers ایجاد کنید. داخل این دایرکتوری (application/controllers/admin) یک کنترلر با نام Settings بسازید، هدف از ساخت این کنترلر، کنترل و هَندل داده‌های مربوط به سایت است.

    برای پست بعد لازم است که نکات زیر را بدانید:
    • متد index، متد پیشفرض کنترلرها است. یعنی اگر ما لینک atys.localhost/admin/settings را باز کنیم، این کنترلر فراخوانی می‌شود، اگر می خواهید کنترلر دیگری فراخوانی شود، باید نام آن را جزو قواعد مسیریابی قرار دهید. (نگران نباشید تا چند پست بعدی مسیریابی را به خوبی خواهید آموخت.)
    • تحت هیچ شرایطی از نام‌های رزرو شده استفاده نکنید، برای کنترلرها در کدایگنایتر نام‌های CI_Controller و Default و index رزرو شده‌اند. در صورت تمایل لیست تمامی نام‌های رزرو شده در کدایگنایتر را ببینید. (تا پایان آموزش از این نام‌ها استفاده نمی‌شود.)
    • به هر کدام از بخش‌های بعد از لینک سایت یک سِگمِنت می‌گویند، برای مثال در atys.localhost/blog/post/tutorial، سگمنت اول که به نام کنترلر اشاره دارد blog است و سگمنت دوم به متد post اشاره دارد، سگمنت سوم نام پست یعنی tutorial است، سگمنت سوم و سگمنت‌های بعدی (در صورت وجود) پارامترهایی هستند که به متد فوق ارسال می‌شوند.
    • اگر فایل routes در دایرکتوری application/config را باز کنید، می‌بینید که default_controller یکی از اندیس های آرایه $route است (یعنی $route['default_controller'])، این اندیس کنترلر مربوط به صفحه اصلی سایت را مشخص می‌کند.

    مدل‌ها
    مدل ها برای کار با دیتابیس به کار می‌روند،وقتی درخواستی به کنترلر (شامل لود، افزودن یا تغییر داده‌ها) فرستاده شود، کنترلر داده‌ها را به متد (یا متدهای) مورد نظر از مدل مربوطه ارسال می‎کند و مدل هم به کنترلر جوابی می‌دهد، داده‌ها باید در مدل اعتبارسنجی شوند و دلیل آن این است که ممکن است از قسمت‌های مختلف ارسال شوند و اعتبارسنجی در مدل مربوطه انجام می‌شود، یعنی چندین کنترلر (مثلا کنترلر ساخت کاربر در پنل مدیریت و کنترلر سایت برای ساخت کاربر به وسیله ثبت نام)، هر دو داده‌ها را به یک مدل می فرستند تا اعتبارسنجی کند، ضمن اینکه مدل با دیتابیس و داده ها سروکار دارد و ذاتا باید از ماهیت آن ها باخبر باشد. در Yii نیز اعتبارسنجی در مدل انجام می‌شود.

    نکته: داده‌ها الزاما داده‌های مرتبط با دیتابیس نیستند و طبق تعریف الگوی معماری MVC، ارتباط مستقیم با داده‌ها وظیفه مدل است.
    نکته: برای جلوگیری از ارسال زیاد داده‌ها باید اعتبارسنجی اولیه داده‌ها توسط جاوااسکریپت (regex) و html5 (فیلدهای مربوطه) انجام شود، اینکار دو مزیت دارد که اولی رو گفتم و دومی نمایش خطای مناسب و سریع به کاربر است بدون اینکه وقت وی تلف شود، البته توجه کنید که به داده‌هایی که کاربر ارسال می‌کند اعتماد نکنید و اعتبارسنجی را در سمت سرور مجددا حتما انجام دهید زیرا تغییر داده‌ها و اعتبارسنجی داده‌ها با استفاده از inspector مرورگر کار بسیار ساده‌ای است.

    ساخت مدل نیز مشابه کنترلر ولی در دایرکتوری application/models انجام می‌شود:
    کد PHP:
    defined('BASEPATH') OR exit('No direct script access allowed');

    class 
    Posts extends CI_Model {


    نکته: کلاس مدل و نام فایل حاوی آن، باید همنام باشند و اولین حرف آن‌ها کپیتال (Capital) باشد. فراموش نکنید که این کلاس باید از کلاس CI_Model مشتق شده باشد. همچنین در صورت نیاز می‌توانید در دایرکتوری models زیردایرکتوری‌هایی را برای دسته‌بندی بهتر مدل‌ها بسازید که ما در این پروژه نیازی به اینکار نداریم.

    بارگذاری و فراخوانی مدل‌ها
    در متدی از کنترلر که نیاز به لود مدل خاصی دارید، باید دستور زیر را اجرا کنید::
    کد PHP:
    $this->load->model('posts'); 
    اگر مدل را در پوشه‌ای مثلا admin در دایرکتوری models قرار داده‌اید نیز از دستور زیر استفاده کنید:
    کد PHP:
    $this->load->model('admin/posts'); 
    برای فراخوانی متدهای هر مدل نیز، بعد از فراخوانی مدل مربوطه از دستور زیر استفاده کنید:
    کد PHP:
    $this->posts->getPosts(); 
    اگر به هر دلیلی می‌خواهید، مدل را با نام دیگری استفاده کنید، باید آرگومان دوم دستور فراخوانی مدل را با نام مورد نظرتان مقداردهی کنید. که در نهایت نتیجه به صورت زیر خواهد بود:
    کد PHP:
    $this->load->model('posts''the_model');

    $this->the_model->getPosts(); 
    نتیجه کاملا با مثال قبلی یکسان است.

    بارگذاری (Load) مدل به معنی اتصال به دیتابیس نیست، زیرا:
    • اولا ممکن است اعتبارسنجی داده شکست بخورد و نیازی به اتصال به دیتابیس نباشد.
    • دوما ممکن است اصلا ما در این مدل کاری با دیتابیس نداشته باشیم و داده‌ها را به صورت دیگری مثلا ذخیره در یک فایل استفاده کنیم.
    نکته: در هنگام فراخوانی یک مدل می‌توانید مقدار آرگومان سوم را TRUE بگذارید، به صورت خودکار اتصال به دیتابیس نیز انجام می‌شود (این روش را توصیه نمی‌کنم، روش‌های بهتری وجود دارد که در آینده توضیح خواهم داد).

    قدم بعدی کانفیگ دیتابیس است، فایل database.php را که در دایرکتوری application/config قرار دارد باز کنید و نام دیتابیس، نام کاربری و پسورد آن را وارد کنید. (راهنمایی: سه اندیس 'username' و 'password' و 'database' را ویرایش کرده و فایل را ذخیره کنید.)
    حالا که داخل این دایرکتوری (application/config) آمده‌اید، فایل config.php را باز کنید و آدرس صفحه اصلی سایت را در آن وارد کنید:
    کد PHP:
    $config['base_url'] = 'http://atys.localhost/'

    ویوها
    در دایرکتوری application دایرکتوری‌های دیگری نیز وجود دارد که می توان به views اشاره کرد که فایل‌های لایه نما (view) در آن قرار می‌گیرد. برای مثال از بدنه فایل‌های نما:
    کد PHP:
    <html>
    <
    head>
            <
    title>Atys</title>
    </
    head>
    <
    body>
            <
    h1>Welcome to Atys</h1>
            <
    p>This is a paragraph.</p>
    </
    body>
    </
    html
    و برای لود یک فایل ویو توسط کنترلر از متد زیر استفاده کنید:
    کد PHP:
    $this->load->view('name'); 
    نکته: در این متد نیازی به نوشتن پسوند php نیست و فقط نام فایل را مانند نمونه بنویسید.
    نکته: پارامتر دوم این متد یک آرایه اختیاری است که اندیس‌های آن باید انجمنی (غیرعددی) باشد و در ویو هر اندیس تبدیل به یک متغییر می‌شود که مقدارش را از مقدار متناظرش در آرایه می‌گیرد (مثلا اندیس title با مقدار "داشبورد" تبدیل به متغییر $title با مقدار "داشبورد" می‌شود). البته اگر یک شی را به عنوان مقدار به این متد بدهیم، پراپرتی‌های کلاس تبدیل به عناصر آرایه می‌شوند و دوباره در ویو تبدیل به متغییر می‌شوند. طبعا آرایه‌های چند بعدی را نیز با دستور foreach می‌توان در ویو استفاده نمود، مثلا اگر آرایه‌ای را به ویو ارسال کنیم که حاوی اندیسی برای عنوان صفحه و اندیسی برای نگهداری پست‌ها که قطعا خود یک آرایه است، در فایل ویو یک متغییر برای عنوان و یک آرایه برای پست‌ها خواهیم داشت.

    نکته: ما لایه‌ها را حتما دسته‌بندی خواهیم کرد، پس برای دسترسی به آنها باید مشابه دسترسی به مدل‌های دسته‌بندی شده عمل کنیم:
    کد PHP:
    $this->load->view('posts/add'); 

    همچنین برای لود بیش از یک ویو چندین بار این دستور را برای لود قسمت‌های مختلف فراخوانی کنید. مشخص است که داده‌های ارسالی به هر ویو به عنوان متغییری در همان ویو قابل استفاده هستند.
    __________________________________________________________________________
    باورژن
    ۱۳۹۶ بهمن ۸ ۰۱:۱۱ صبح
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : Y.P.Y ayoubsys undefined Alaa ImanAzadi
    Version غایب
    عضو جدید
    **

    ارسال‌ها: 27
    تاریخ عضویت: ۱۳۹۳ شهريور ۱۵
    اعتبار: 8
    تشکرها : 0
    ( 64 تشکر در 27 ارسال )
    ارسال: #5
    RE: آموزش کدایگنایتر 3
    بابت تاخیر دو روزه در نگارش ادامه آموزش عذرخواهی می‌کنم، دلیل این امر مشغله زیادم است که به هر حال برای نگارش یک مطلب باید کیفیت را در نظر گرفت که اینکار زمانبر است و نوشتن هر مطلب زمان زیادی را خصوصا از لحاظ قابل فهم بودن و توضیح ساده آن می‌طلبد.
    با توجه به توضیحاتی که در مطلب قبل دادم، این مطللب بیشتر جنبه عملی دارد تا تئوری. قطعا همه کسانی که این مطلب را می‌خوانند با ساختار html و css و javascript آشنایی لازم را دارند، پس در این موارد هیچ توضیحی نخواهم داد و بحث ما بیشتر تمرکز بر خود فریمورک است.
    اولین کاری که باید انجام بدیم افزودن یک قالب برای نمایش محتوا است، برای اینکار ما ورژن 3 بوتسترپ را دانلود می‌کنیم، دقت کنید که ما به دنبال این نیستیم که وظیفه طراح رابط کاربری را انجام دهیم و صرفا از این قالب برای تست استفاده می کنیم، البته در صورت نیاز می توانید آن را شخصی‌سازی نمایید.
    داخل روت پروژه (پوشه حاوی دایرکتوری‌های application و system) یک دایرکتوری جدید با نام assets ایجاد کنید، این دایرکتوری برای نگهداری فایل‌های css و جاوااسکریپت و فونت‌ها و ... بکار می‌رود. ما برای هر قالبی که می‌خواهیم داشته باشیم یک دایرکتوری حاوی فایل‌های مربوط به آن ایجاد می‌کنیم، بهتر است برای دسته‌بندی بهتر، قالب ها را به وسیله یک دایرکتوری به نام themes مرتب کنیم، داخل این دایرکتوری جدید باید فایلها را دسته بندی شده قرار دهیم، اگر نیاز به توضیح بیشتر دارید، دیدن ساختار زیر به شما کمک زیادی خواهد نمود:
    کد:
    application
    ├──cache
    ├──config
    ├──...
    assets
    ├──themes
    ├────default
    ├──────css
    │        ├──bootstrap.min.css
    │        ├──style.css
    │        ├── ...
    ├──────js
    │        ├──jquery-3.3.1.min.js
    │        ├──bootstrap.min.js
    │        ├── ...
    ├──────fonts
    │        ├──glyphicons-halflings-regular.eot
    │        ├──vazir.eot
    │        ├── ...
    system
    index.php
    ما یک فایل برای شخصی‌سازی و کاستومایز کدهای css با نام style.css در نظر گرفتیم، همچنین فونت‌های پیش‌فرض بوتسترپ (گلیف آیکون) را قرار می‌دهیم و برای متن‌ها نیز از فونت زیبای وزیر کار آقای راستی کردار استفاده می کنیم، البته می توانید از font-awesome و ایران سنس نیز برای نتیجه زیباتر استفاده کنید که بسته به نظر طراح رابط کاربری دارد. در پروژه‌های انگلیسی هم Roboto فونت خوبی است که می‌توانید استفاده کنید.

    خب، حالا باید از این کدها استفاده کنیم، همانطور که در مطالب قبلی این تاپیک گفتم، لایه ویو مسئول نمایش است، پس برای طراحی ظاهر ما فقط به اعمال تغییرات در دایرکتوری application/view نیاز داریم، اما این تغییرات باید چگونه باشد؟
    دسته‌بندی فایل‌ها همیشه به ما در درک ساختار و همچنین توسعه در آینده کمک می‌کند. خب پس برای کلیه فایل‌های مربوط به سایت یک دایرکتوری با نام site در دایرکتوری application/view ایجاد می‌کنیم، حالا یک دایرکتوری نیز داخل این دایرکتوری ایجاد می‌کنیم و لایه ها را در آن قرار می دهیم، ولی ساختار سایر فایل‌ها را به صورت مستقیم ایجاد می‌کنیم، فراموش نکنید که هدف ما ماژولار بودن سیستم و جلوگیری از کدهای تکراری است. برای درک بهتر این موضوع و صرفه‌جویی در زمان صرف شده برای توضیحات، ساختار زیر را ببینید:
    کد:
    application
    ├──views
    │  ├──admin
    ├─────site
    │     ├──layouts
    │        ├──header.php
    │        ├──footer.php
    │        ├──blank.php
    │        ├──sidebar.php
    │        ├──...
    │     ├──main.php
    │     ├──post.php
    │     ├──...
    │  ├──...
    ├──...
    دایرکتوری admin رو قبلا ساخته بودیم و فعلا آن را خالی رها میکنیم تا زمانی که به قسمت پنل مدیریت برسیم. لایه‌های اصلی تشکیل دهنده را در پوشه layouts و فایل‌های مربوط به محتوای داینامیک مثلا پست‌ها را در کنار این دایرکتوری قرار میدهیم، البته این مورد به دلخواه خود شما است و هر جوری که دوست دارید (به شرط رعایت ساختار در رمان فراخوانی) می‌توانید استفاده کنید. قبل از اینکه محتوایی در این فایل‌ها قرار بدهیم، باید یک کتابخانه برای مدیریت ویوها بسازیم و بعد برمی‌گردیم و مقدار مورد نظرمان را در این فایل‌ها قرار دهیم، قبل از ادامه مطمئن شوید که ساختار بالا را حتما ایجاد کرده‌اید.

    نوشتن دستوراتی مانند $this->load->view('site/layouts/header'); و به تعداد زیاد شاید کمی سخت و خسته کننده باشد، با کمک این کتابخانه ساختار بهتری را برای لود فایل‌ها مشخص خواهیم نمود.
    دایرکتوری libraries مسئول نگهداری کدهای مربوط به وب‌اپلیکیشن شما است و کدهای داخل آن با دستور زیر قابل استفاده خواهند بود:
    کد PHP:
    $this->load->library('library_name'); 
    یک فایل با نام Template.php داخل دایرکتوری application/libraries بسازید و کد زیر را داخل این فایل بنویسید:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');

    class 
    Template {
        var 
    $ci;

        function 
    __construct()
        {
            
    $this->ci =& get_instance();
        }

        
    /**
         * @name:            load
         * @desc:            Loads the templates and views specified
         * @param:loc:        Location (admin or site)
         * @param:tpl: Name of the template
         * @param:data:        Optional data array add css and js file to header using the index
         */
        
    public function load($loc$tpl null$data null)
        {
            if(
    $loc !== 'admin' && $loc !=='site')
            {
                
    show_error('شما دسترسی لازم برای اجرای این دستور را ندارید.''403','خطای عدم دسترسی');
            }

            if (
    $tpl === null) {
                
    $tpl 'main';
            }

            if (
    $loc === 'admin') {
                
    // leave it for future usage
            
    } else {
                
    $tplWhiteList = ['main''post'];
                if (!
    in_array($tpl$tplWhiteList)) {
                    
    show_error('صفحه‌ای که درخواست اجرای آن را داده‌اید وجود ندارد.''404','صفحه مورد نظر یافت نشد');
                }
                
    $this->ci->load->view('site/layouts/header'$data);
                if (
    $tpl !== 'main') {
                    
    $this->ci->load->view('site/layouts/sidebar'$data);
                }
                
    $this->ci->load->view('site/' $tpl$data);
                
    $this->ci->load->view('site/layouts/footer'$data);
            }
        }

    دقت کنید که حتما این کد را بنویسید و آن را کپی نکنید. اینکار باعث می شود تا علاوه بر درک بهتر ساختار کد، استفاده از آن نیز برایتان راحت‌تر باشد و به اصلاح تمرین خوبی برای افزایش مهارت شما نیز خواهد بود.
    یه توضیح راجع به این کد باید بدم، میبینید که کامنت‌های متد لود این کلاس به اطلاعات کافی در اختیار شما قرار می‌دهند. سطح شما انقد بالا است که نیاز به توضیح کد بالا نداشته باشید، البته ذکر این نکته‌ها لازمه که:
    • برای دسترسی به شی کدایگنایتر از get_intance() استفاده کردیم.
    • در کتابخانه از $this نمی توانیم استفاده کنیم و باید به جای آن از $this->ci استفاده کنیم. دلیل این امر این است که مثلا load مربوط به کلاس کدایگنایتر است و ما از آن ارث‌بری نکرده‌ایم.
    • در حال حاضر فقط دو قسمت داریم یکی پنل مدیریت و دیگری صفحات عمومی سایت که ابتدا درخواست را بررسی می کنیم، ببینیم که آیا یکی از این دو درخواست است یا نه. اگر tpl ذکر نشده بود، آن را main در نظر می‌گیریم،
    • یک لیست سفید برای صفحات سایت قرار داده‌ایم که فقط در صفحه اصلی (main) نیاز به سایدبار نداریم و در بقیه صفحات این مورد را خواهیم داشت.
    • فانکشن show_error یک متد برای نمایش خطاها است و دستورات بعد از آن اجرا نمی‌شود، سه پارامتر میگیرد که اولی پیام خطا، دومی کد خطا و سومی عنوان خطا است که مورد دوم و سوم اختیاری هستند.
    • بابت پیام‌ها نگران نیاشید در پست بعدی علاوه بر کاستومایز ظاهر خطاها، دستورات چندزبانه شدن متن‌ها و راست‌چین شدن قالب را نیزانجام می‌دهیم.
    برای استفاده از این کلاس باید ابتدا آن را در کنترلر خود لود کنید و سپس متد آن را صدا بزنید.
    کد PHP:
    $this->load->library('template');
    $this->template->load('site''post'); 
    به همین سادگی! زیبا نیست؟ این کدایگنایتر بود، ببنید Yii2 چه فریمورک باحالیه، بعد از این آموزش، احتمالا به آموزش یی2 می‌پردازم. Shy (البته احتمالا بستر انتشارش فرق کنه)
    فقط کافیه post را حذف کنید تا با صفحه اصلی مواجه شوید. (فراموش نکنید که داخل این فایل‌ها باید متنی نوشته باشید وگرنه صفحه سفید نمایش داده می‌شود. فعلا هر متن تستی بنویسید، متن‌ها و ساختار اصلی را در پست بعد قرار خواهم داد)
    به عنوان نکته پایانی ما این کتابخانه را ایجاد کرده ایم تا از شر کدهای اضافی راحت بشیم، نوشتن دو خط بالا تقریبا در تمام متدهای کنترل‌های ما اجباری است، پس می توانیم از قابلیت از قابلیت بارگذاری خودکار (AutoLoad) خود کدایگنایتر استفاده کنیم تا دیگر به خط اول نیازی نداشته باشیم و فقط خط دوم کافی باشد. برای اینکار فایل autoload.php را باز کنید و دنبال اندیس libraries آرایه $autoload بگردید، خط زیر را جایگزین آن کنید، ما به کلیه این کتابخانه‌ها نیاز داریم:
    کد PHP:
    $autoload['libraries'] = array('database''session''template''form_validation'); 

    این کلاس را در طول پروژه تکمیل خواهیم کرد. یک ایده که دارم بهش فکر می‌کنم گسترش متد load به چند متد برای admin و site است که ایده خوبیه انجام میدم.
    در مطلب بعد ساختار فایل‌های کلیه صفحات داخلی را تکمیل می‌کنیم و بعد به سراغ کنترلرها خواهیم رفت.
    __________________________________________________________________________
    باورژن
    (آخرین ویرایش در این ارسال: ۱۳۹۶ بهمن ۲۷ ۰۶:۲۶ عصر، توسط Version.)
    ۱۳۹۶ بهمن ۱۰ ۰۶:۲۴ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : undefined Y.P.Y Alaa ayoubsys ImanAzadi
    Version غایب
    عضو جدید
    **

    ارسال‌ها: 27
    تاریخ عضویت: ۱۳۹۳ شهريور ۱۵
    اعتبار: 8
    تشکرها : 0
    ( 64 تشکر در 27 ارسال )
    ارسال: #6
    RE: آموزش کدایگنایتر 3
    اول تکلیف دو زبانه کردن رو مشخص کنم، خیلی راحته:
    1. یک کپی از پوشه english موجود در دایرکتوری application/language با نام persian بسازید.
    2. یک فایل همنام مثلا the_lang در هر دو دایرکتوری english و persian بسازید. (حتما می‌دانید که می‌توانید دسته‌بندی انجام بدید.)
    3. داخل این فایل‌ها باید آرایه $lang رو مقداردهی کنید (قبلا توضیح دادم که این آرایه رزرو شده و نباید متغییری به این نام داشته باشید، دلیلش استفاده در همین جا است)
      مثال: برای فایل the_lang.php داخل دایرکتوری application/language/persian
      کد PHP:
      $lang['post_new_title'] = 'افزودن پست جدید';
      $lang['post_edit_title'] = 'ویرایش پست';
      $lang['pages_title'] = 'همه صفحه‌ها';
      $lang['pages_heading'] = 'همه صفحه‌ها';
      $lang['pages_section_heading'] = 'صفحه‌ها';
      $lang['pages_new_title'] = 'افزودن صفحه جدید'

      مثال: برای فایل admin_lang.php داخل دایرکتوری application/language/persian
      کد PHP:
      $lang['post_new_title'] = 'Add new post';
      $lang['post_edit_title'] = 'Edit post';
      $lang['pages_title'] = 'Posts';
      $lang['pages_heading'] = 'Pages';
      $lang['pages_section_heading'] = 'Pages';
      $lang['pages_new_title'] = 'Add new page'
    4. یک نکته فایل‌های زبان اگر بزرگ بود به بخش‌های کوچک (چند فایل) تبدیل کنید، در غیراینصورت برای هر بخش یک کامنت تک خطی در بالای آرایه مربوط به آن بگذارید تا راحت‌تر بیابید، در مورد بالا مثلا اسمش رو بزارید Posts، (اگر بلد نیستید Bye life بدید، شوخی کردم با //)
    5. برای فراخوانی این فایل باید کد زیر رو در کنترلر خودتون قرار بدید (دوست دارید بزارید داخل __constructor)
      کد PHP:
      $this->lang->load('the_lang''persian'); 
      حالا اون persian یا english یا هر چی میره فایل مربوطه رو میاره و آرایه داخلشو استفاده میکنه (در این سطح توضیح نمی‌خواد)
    6. نحوه استفاده: داخل ویو مورد نظرتون کد زیر را استفاده کنید:
      کد PHP:
      echo $this->lang->line('pages_section_heading'); 
    7. سازوکارش اینه که با کوکی، سشن، لینک یا ... دلتون خاص نسبت به تغییر زبان در کنترلر اقدام کنید، داخل ویو خودش انجام میده.


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

    بگذریم بریم سراغ Refactor کد کلاس Template که صرفا جهت آموزش شما به اون شکل نوشته شده بود، کد فایل Template رو با خطوط زیر عوض کنید:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');

    class 
    Template {
        var 
    $ci;

        function 
    __construct()
        {
            
    $this->ci =& get_instance();
        }

        
    /**
         * Loads the admin template and view specified
         */
        
    public function admin()
        {
            
    // leave it for future usage
        
    }

        
    /**
         * @name:            load
         * @desc:            Loads the site templates and views specified
         * @param:loc:        Location  site
         * @param:tpl: Name of the template (main or post or ...)
         * @param:data:        Optional data array add css and js file to header using the index
         */
        
    public function site($tpl 'main'$data null)
        {
            
    $tplWhiteList = ['main''post'];
            if (!
    in_array($tpl$tplWhiteList)) {
                
    show_error('صفحه‌ای که درخواست اجرای آن را داده‌اید وجود ندارد.''404','صفحه مورد نظر یافت نشد');
            }
            
    $this->ci->load->view('site/layouts/header'$data);
            if (
    $tpl !== 'main') {
                
    $this->ci->load->view('site/layouts/sidebar'$data);
            }
            
    $this->ci->load->view('site/' $tpl$data);
            
    $this->ci->load->view('site/layouts/footer'$data);
        }

    نکته: این کد در طول برنامه چندین بار کامل خواهد شد.

    حالا دستورات قبلی میشه به صورت زیر:
    کد PHP:
    $this->template->site('post'); 
    این دستور صفحات تعریف شده برای نمایش یک post را نمایش می‌دهد و
    کد PHP:
    $this->template->site(); 
    صفحه اصلی را نمایش می‌دهد. خیلی راحت‌تر و تمیزتره الان.

    کنترلر Site رو به شکل زیر تغییر بدید:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');

    class 
    Site extends CI_Controller
    {
        public function 
    __construct() {
            
    parent::__construct();
            
    $this->load->helper(array('url'));
            
    date_default_timezone_set('Asia/Tehran');
        }
        public function 
    index()
        {
            
    $this->template->site();
        }

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

    خب محتوای ویوها، اسم رو می‌نویسم قبلا ساختیم باید بتونید پیدا کنید.
    header:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');
    ?><!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Welcome to CodeIgniter</title>

        <link rel="stylesheet" href="<?php echo base_url(); ?>assets/themes/default/css/bootstrap.css">
        <link rel="stylesheet" href="<?php echo base_url(); ?>assets/themes/default/css/style.css">

        <script src="<?php echo base_url(); ?>assets/themes/default/js/jquery.min.js"></script>
    </head>
    <body>
    <nav class="navbar navbar-default navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#myPage">Logo</a>
            </div>
            <div class="collapse navbar-collapse" id="myNavbar">
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="#about">ABOUT</a></li>
                    <li><a href="#services">SERVICES</a></li>
                    <li><a href="#portfolio">PORTFOLIO</a></li>
                    <li><a href="#pricing">PRICING</a></li>
                    <li><a href="#contact">CONTACT</a></li>
                </ul>
            </div>
        </div>
    </nav> 

    main:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');
    ?>
    <div class="jumbotron text-center">
        <h1>Company</h1>
        <p>We specialize in blablabla</p>
        <form>
            <div class="input-group">
                <input type="email" class="form-control" size="50" placeholder="Email Address" required>
                <div class="input-group-btn">
                    <button type="button" class="btn btn-danger">Subscribe</button>
                </div>
            </div>
        </form>
    </div>

    <!-- Container (About Section) -->
    <div id="about" class="container-fluid">
        <div class="row">
            <div class="col-sm-8">
                <h2>About Company Page</h2><br>
                <h4>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</h4><br>
                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
                <br><button class="btn btn-default btn-lg">Get in Touch</button>
            </div>
            <div class="col-sm-4">
                <span class="glyphicon glyphicon-signal logo"></span>
            </div>
        </div>
    </div>

    <div class="container-fluid bg-grey">
        <div class="row">
            <div class="col-sm-4">
                <span class="glyphicon glyphicon-globe logo slideanim"></span>
            </div>
            <div class="col-sm-8">
                <h2>Our Values</h2><br>
                <h4><strong>MISSION:</strong> Our mission lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</h4><br>
                <p><strong>VISION:</strong> Our vision Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
                    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
            </div>
        </div>
    </div>

    <!-- Container (Services Section) -->
    <div id="services" class="container-fluid text-center">
        <h2>SERVICES</h2>
        <h4>What we offer</h4>
        <br>
        <div class="row slideanim">
            <div class="col-sm-4">
                <span class="glyphicon glyphicon-off logo-small"></span>
                <h4>POWER</h4>
                <p>Lorem ipsum dolor sit amet..</p>
            </div>
            <div class="col-sm-4">
                <span class="glyphicon glyphicon-heart logo-small"></span>
                <h4>LOVE</h4>
                <p>Lorem ipsum dolor sit amet..</p>
            </div>
            <div class="col-sm-4">
                <span class="glyphicon glyphicon-lock logo-small"></span>
                <h4>JOB DONE</h4>
                <p>Lorem ipsum dolor sit amet..</p>
            </div>
        </div>
        <br><br>
        <div class="row slideanim">
            <div class="col-sm-4">
                <span class="glyphicon glyphicon-leaf logo-small"></span>
                <h4>GREEN</h4>
                <p>Lorem ipsum dolor sit amet..</p>
            </div>
            <div class="col-sm-4">
                <span class="glyphicon glyphicon-certificate logo-small"></span>
                <h4>CERTIFIED</h4>
                <p>Lorem ipsum dolor sit amet..</p>
            </div>
            <div class="col-sm-4">
                <span class="glyphicon glyphicon-wrench logo-small"></span>
                <h4 style="color:#303030;">HARD WORK</h4>
                <p>Lorem ipsum dolor sit amet..</p>
            </div>
        </div>
    </div>

    <!-- Container (Portfolio Section) -->
    <div id="portfolio" class="container-fluid text-center bg-grey">
        <h2>Portfolio</h2><br>
        <h4>What we have created</h4>
        <div class="row text-center slideanim">
            <div class="col-sm-4">
                <div class="thumbnail">
                    <img src="paris.jpg" alt="Paris" width="400" height="300">
                    <p><strong>Paris</strong></p>
                    <p>Yes, we built Paris</p>
                </div>
            </div>
            <div class="col-sm-4">
                <div class="thumbnail">
                    <img src="newyork.jpg" alt="New York" width="400" height="300">
                    <p><strong>New York</strong></p>
                    <p>We built New York</p>
                </div>
            </div>
            <div class="col-sm-4">
                <div class="thumbnail">
                    <img src="sanfran.jpg" alt="San Francisco" width="400" height="300">
                    <p><strong>San Francisco</strong></p>
                    <p>Yes, San Fran is ours</p>
                </div>
            </div>
        </div><br>

        <h2>What our customers say</h2>
        <div id="myCarousel" class="carousel slide text-center" data-ride="carousel">
            <!-- Indicators -->
            <ol class="carousel-indicators">
                <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
                <li data-target="#myCarousel" data-slide-to="1"></li>
                <li data-target="#myCarousel" data-slide-to="2"></li>
            </ol>

            <!-- Wrapper for slides -->
            <div class="carousel-inner" role="listbox">
                <div class="item active">
                    <h4>"This company is the best. I am so happy with the result!"<br><span>Michael Roe, Vice President, Comment Box</span></h4>
                </div>
                <div class="item">
                    <h4>"One word... WOW!!"<br><span>John Doe, Salesman, Rep Inc</span></h4>
                </div>
                <div class="item">
                    <h4>"Could I... BE any more happy with this company?"<br><span>Chandler Bing, Actor, FriendsAlot</span></h4>
                </div>
            </div>

            <!-- Left and right controls -->
            <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
                <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
                <span class="sr-only">Previous</span>
            </a>
            <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
                <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
                <span class="sr-only">Next</span>
            </a>
        </div>
    </div>

    <!-- Container (Pricing Section) -->
    <div id="pricing" class="container-fluid">
        <div class="text-center">
            <h2>Pricing</h2>
            <h4>Choose a payment plan that works for you</h4>
        </div>
        <div class="row slideanim">
            <div class="col-sm-4 col-xs-12">
                <div class="panel panel-default text-center">
                    <div class="panel-heading">
                        <h1>Basic</h1>
                    </div>
                    <div class="panel-body">
                        <p><strong>20</strong> Lorem</p>
                        <p><strong>15</strong> Ipsum</p>
                        <p><strong>5</strong> Dolor</p>
                        <p><strong>2</strong> Sit</p>
                        <p><strong>Endless</strong> Amet</p>
                    </div>
                    <div class="panel-footer">
                        <h3>$19</h3>
                        <h4>per month</h4>
                        <button class="btn btn-lg">Sign Up</button>
                    </div>
                </div>
            </div>
            <div class="col-sm-4 col-xs-12">
                <div class="panel panel-default text-center">
                    <div class="panel-heading">
                        <h1>Pro</h1>
                    </div>
                    <div class="panel-body">
                        <p><strong>50</strong> Lorem</p>
                        <p><strong>25</strong> Ipsum</p>
                        <p><strong>10</strong> Dolor</p>
                        <p><strong>5</strong> Sit</p>
                        <p><strong>Endless</strong> Amet</p>
                    </div>
                    <div class="panel-footer">
                        <h3>$29</h3>
                        <h4>per month</h4>
                        <button class="btn btn-lg">Sign Up</button>
                    </div>
                </div>
            </div>
            <div class="col-sm-4 col-xs-12">
                <div class="panel panel-default text-center">
                    <div class="panel-heading">
                        <h1>Premium</h1>
                    </div>
                    <div class="panel-body">
                        <p><strong>100</strong> Lorem</p>
                        <p><strong>50</strong> Ipsum</p>
                        <p><strong>25</strong> Dolor</p>
                        <p><strong>10</strong> Sit</p>
                        <p><strong>Endless</strong> Amet</p>
                    </div>
                    <div class="panel-footer">
                        <h3>$49</h3>
                        <h4>per month</h4>
                        <button class="btn btn-lg">Sign Up</button>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- Container (Contact Section) -->
    <div id="contact" class="container-fluid bg-grey">
        <h2 class="text-center">CONTACT</h2>
        <div class="row">
            <div class="col-sm-5">
                <p>Contact us and we'll get back to you within 24 hours.</p>
                <p><span class="glyphicon glyphicon-map-marker"></span> Chicago, US</p>
                <p><span class="glyphicon glyphicon-phone"></span> +00 1515151515</p>
                <p><span class="glyphicon glyphicon-envelope"></span> myemail@something.com</p>
            </div>
            <div class="col-sm-7 slideanim">
                <div class="row">
                    <div class="col-sm-6 form-group">
                        <input class="form-control" id="name" name="name" placeholder="Name" type="text" required>
                    </div>
                    <div class="col-sm-6 form-group">
                        <input class="form-control" id="email" name="email" placeholder="Email" type="email" required>
                    </div>
                </div>
                <textarea class="form-control" id="comments" name="comments" placeholder="Comment" rows="5"></textarea><br>
                <div class="row">
                    <div class="col-sm-12 form-group">
                        <button class="btn btn-default pull-right" type="submit">Send</button>
                    </div>
                </div>
            </div>
        </div>
    </div> 

    footer:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');
    ?>
    <footer class="container-fluid text-center">
        <a href="#myPage" title="To Top">
            <span class="glyphicon glyphicon-chevron-up"></span>
        </a>
        <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds. <?php echo  (ENVIRONMENT === 'development') ?  'CodeIgniter Version <strong>' CI_VERSION '</strong>' '' ?></p>
    </footer>

    <script>
        $(document).ready(function(){
            // Add smooth scrolling to all links in navbar + footer link
            $(".navbar a, footer a[href='#myPage']").on('click', function(event) {
                // Make sure this.hash has a value before overriding default behavior
                if (this.hash !== "") {
                    // Prevent default anchor click behavior
                    event.preventDefault();

                    // Store hash
                    var hash = this.hash;

                    // Using jQuery's animate() method to add smooth page scroll
                    // The optional number (900) specifies the number of milliseconds it takes to scroll to the specified area
                    $('html, body').animate({
                        scrollTop: $(hash).offset().top
                    }, 900, function(){

                        // Add hash (#) to URL when done scrolling (default click behavior)
                        window.location.hash = hash;
                    });
                } // End if
            });

            $(window).scroll(function() {
                $(".slideanim").each(function(){
                    var pos = $(this).offset().top;

                    var winTop = $(window).scrollTop();
                    if (pos < winTop + 600) {
                        $(this).addClass("slide");
                    }
                });
            });
        })
    </script>

    </body>
    </html> 

    فایل style.css که در پوشه assets/themes/default/css قرار داره:
    کد PHP:
    body {
        
    font400 15px Latosans-serif;
        
    line-height1.8;
        
    color#818181;
    }
    h2 {
        
    font-size24px;
        
    text-transformuppercase;
        
    color#303030;
        
    font-weight600;
        
    margin-bottom30px;
    }
    h4 {
        
    font-size19px;
        
    line-height1.375em;
        
    color#303030;
        
    font-weight400;
        
    margin-bottom30px;
    }
    .
    jumbotron {
        
    background-color#f4511e;
        
    color#fff;
        
    padding100px 25px;
        
    font-familyMontserratsans-serif;
    }
    .
    container-fluid {
        
    padding60px 50px;
    }
    .
    bg-grey {
        
    background-color#f6f6f6;
    }
    .
    logo-small {
        
    color#f4511e;
        
    font-size50px;
    }
    .
    logo {
        
    color#f4511e;
        
    font-size200px;
    }
    .
    thumbnail {
        
    padding0 0 15px 0;
        
    bordernone;
        
    border-radius0;
    }
    .
    thumbnail img {
        
    width100%;
        
    height100%;
        
    margin-bottom10px;
    }
    .
    carousel-control.right, .carousel-control.left {
        
    background-imagenone;
        
    color#f4511e;
    }
    .
    carousel-indicators li {
        
    border-color#f4511e;
    }
    .
    carousel-indicators li.active {
        
    background-color#f4511e;
    }
    .
    item h4 {
        
    font-size19px;
        
    line-height1.375em;
        
    font-weight400;
        
    font-styleitalic;
        
    margin70px 0;
    }
    .
    item span {
        
    font-stylenormal;
    }
    .
    panel {
        
    border1px solid #f4511e;
        
    border-radius:!important;
        
    transitionbox-shadow 0.5s;
    }
    .
    panel:hover {
        
    box-shadow5px 0px 40px rgba(0,0,0.2);
    }
    .
    panel-footer .btn:hover {
        
    border1px solid #f4511e;
        
    background-color#fff !important;
        
    color#f4511e;
    }
    .
    panel-heading {
        
    color#fff !important;
        
    background-color#f4511e !important;
        
    padding25px;
        
    border-bottom1px solid transparent;
        
    border-top-left-radius0px;
        
    border-top-right-radius0px;
        
    border-bottom-left-radius0px;
        
    border-bottom-right-radius0px;
    }
    .
    panel-footer {
        
    background-colorwhite !important;
    }
    .
    panel-footer h3 {
        
    font-size32px;
    }
    .
    panel-footer h4 {
        
    color#aaa;
        
    font-size14px;
    }
    .
    panel-footer .btn {
        
    margin15px 0;
        
    background-color#f4511e;
        
    color#fff;
    }
    .
    navbar {
        
    margin-bottom0;
        
    background-color#f4511e;
        
    z-index9999;
        
    border0;
        
    font-size12px !important;
        
    line-height1.42857143 !important;
        
    letter-spacing4px;
        
    border-radius0;
        
    font-familyMontserratsans-serif;
    }
    .
    navbar li a, .navbar .navbar-brand {
        
    color#fff !important;
    }
    .
    navbar-nav li a:hover, .navbar-nav li.active a {
        
    color#f4511e !important;
        
    background-color#fff !important;
    }
    .
    navbar-default .navbar-toggle {
        
    border-colortransparent;
        
    color#fff !important;
    }
    footer .glyphicon {
        
    font-size20px;
        
    margin-bottom20px;
        
    color#f4511e;
    }
    .
    slideanim {visibility:hidden;}
    .
    slide {
        
    animation-nameslide;
        -
    webkit-animation-nameslide;
        
    animation-duration1s;
        -
    webkit-animation-duration1s;
        
    visibilityvisible;
    }
    @
    keyframes slide {
        
    0% {
            
    opacity0;
            
    transformtranslateY(70%);
        }
        
    100% {
            
    opacity1;
            
    transformtranslateY(0%);
        }
    }
    @-
    webkit-keyframes slide {
        
    0% {
            
    opacity0;
            -
    webkit-transformtranslateY(70%);
        }
        
    100% {
            
    opacity1;
            -
    webkit-transformtranslateY(0%);
        }
    }
    @
    media screen and (max-width768px) {
        .
    col-sm-{
            
    text-aligncenter;
            
    margin25px 0;
        }
        .
    btn-lg {
            
    width100%;
            
    margin-bottom35px;
        }
    }
    @
    media screen and (max-width480px) {
        .
    logo {
            
    font-size150px;
        }


    نکته: این قالب رو از W3school گرفتم و در قسمت‌های بعد در حین پروژه تغییراتی اعمال می‌کنیم. حالا صفحه اصلی رو لود کنید و لذت ببرید.
    __________________________________________________________________________
    باورژن
    (آخرین ویرایش در این ارسال: ۱۳۹۶ اسفند ۲۵ ۱۲:۴۲ عصر، توسط Version.)
    ۱۳۹۶ بهمن ۱۳ ۰۹:۵۴ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : ayoubsys Y.P.Y ImanAzadi
    Version غایب
    عضو جدید
    **

    ارسال‌ها: 27
    تاریخ عضویت: ۱۳۹۳ شهريور ۱۵
    اعتبار: 8
    تشکرها : 0
    ( 64 تشکر در 27 ارسال )
    ارسال: #7
    RE: آموزش کدایگنایتر 3
    بین این مطلب و مطلب قبل فاصله زیادی افتاد، بابت بدقولی خودم در آپدیت و ارسال قسمت‌های جدید عذرخواهی می‌کنم، از این به بعد هر جمعه یک قسمت مفصل منتشر می‌کنم، در طول هفته مطلب منشر نمی‌کنم.
    در آموزش قبلی در حین کپی کردن کدها، یک خط کد فراموش شده بود، تگ <body> رو داخل header.php بعد از </head> قرار بدید (تگ head پایانی - این درست نمایش نمیده و نمایش کد اینلاین نداره، برای آموزش‌های بعدی دارم یه بستر جدید آماده می کنم - تگ رو به شکل درست نوشتم.)
    قبل از هرکاری داخل تیبل users فیلدهای مربوط به نام و نام خانواگی را NOT NULL قرار بدید و user_name را به username تبدیل کنید:
    کد:
    ALTER TABLE `users` CHANGE `user_name` `username` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, CHANGE `first_name` `first_name` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, CHANGE `last_name` `last_name` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
    تنظیمات ارسال ایمیل لوکال رو هم انجام بدید،
    راهنمایی: برای ارسال ایمیل در لوکال، در پوشه xampp/sendmail به دنبال فایل sendmail.ini بگردید و مقادیر زیر را در آن تغییر دهید:
    کد:
    smtp_server=mail.baversion.com
    smtp_port=587
    auth_username=local@baversion.com
    auth_password=sdf5s%5d&6f16w#e1!f65$e1@f5s6f1651s
    این تنظیمات رو از داخل کانفیگ ایمیل سرورتون بگیرید یا از اکانت جیمیلتون استفاده کنید،
    و فایل php.ini در xampp/php رو نیز:
    کد:
    SMTP=mail.baversion.com
    smtp_port=587
    sendmail_from =local@baversion.com
    sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
    آخری مسیر اجرای فایل sendmail.exe در کامپیوتر شما است.
    دستتون برای تنظیمات بیشتر بازه ولی نیازی نیست و خارج از محدوده آموزش ما است.

    محتوای فایل routes در دایرکتوری application/config را با مقادیر زیر جایگزین کنید:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');

    $route['about'] = 'Site/about';
    $route['contact'] = 'Site/contact';
    $route['register'] = 'Site/register';
    $route['login'] = 'Site/login';
    $route['default_controller'] = 'Site';
    $route['404_override'] = '';
    $route['translate_uri_dashes'] = FALSE

    4 خط اول 4 صفحه استاتیک رو به روتر (مسیریاب) معرفی می‌کنن که به ترتیب دو تا رو امروز و دوتا رو هفته آینده کامل می‌کنیم.
    خط 5 کنترلر پیش‌فرض سایت رو مشخص میکنه و داخل کنترلر که مسلما قبلا گفتم چطوری میشه اکشن (متد) پیش‌فرض (که index است) رو تعریف کرد. (البته به این معنی نیست که اگه صفحه‌ای وجود نداشت اکشن پیش‌فرض اجرا میشه! نه!)
    خط ششم کنترلر مربوط به خطای 404 رو می‌تونین تعریف کنین، کار خوبی ولی فعلا ما بهش کاری نداریم و به عهده خود کدایگنایتر می‌زاریم مدیریت خطاها رو.
    خط آخر اگه TRUE باشه، دَش‌ها (-) رو تبدیل به اندرسکور (_) کنه، چون نام کلاس‌ها dash قبول نمی‌کنه، این دست شما رو بیشتر باز می‌کنه برای مدیریت URLها.

    باید داخل Template به این صفحات اجازه نمایش بدیم، پس محتوای Template.php در دایرکتوری application/libraries رو به مقدار زیر تغییر بدین:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');

    class 
    Template {
        var 
    $ci;

        function 
    __construct()
        {
            
    $this->ci =& get_instance();
        }

        
    /**
         * Loads the admin template and view specified
         */
        
    public function admin()
        {
            
    // leave it for future usage
        
    }

        
    /**
         * @name:            load
         * @desc:            Loads the site templates and views specified
         * @param:loc:        Location  site
         * @param:tpl: Name of the template (main or post or ...)
         * @param:data:        Optional data array add css and js file to header using the index
         */
        
    public function site($tpl 'main'$data null)
        {
            
    $tplWhiteList = ['main''post''about''contact''register''login''forgot'];
            if (!
    in_array($tpl$tplWhiteList)) {
                
    show_error('صفحه‌ای که درخواست اجرای آن را داده‌اید وجود ندارد.''404','صفحه مورد نظر یافت نشد');
            }
            
    $this->ci->load->view('site/layouts/header'$data);
            if (
    $tpl !== 'main') {
                
    $this->ci->load->view('site/layouts/sidebar'$data);
            }
            
    $this->ci->load->view('site/' $tpl$data);
            
    $this->ci->load->view('site/layouts/footer'$data);
        }


    خب، دو تا فانکشن معرفی کنم:
    کد PHP:
    site_url('about'
    این فانکشن اگه آرگومان براش قرار بدیم، به انتهای http://atys.localhost/index.php اضافه میکنه، مثلا مورد بالا خروجیش میشه: http://atys.localhost/index.php/about
    شاید از index.php که قبلا حذف کردیم خوشتون نیاد، راه حل متد زیر است:
    کد PHP:
    base_url('about'
    خروجی این متد مثل بالاییه فقط index.php رو نداره.
    نکته: فراموش نکنید که این فانکشن ها نیاز به هلپر url دارد که بهتره در متد __construct این helper رو لود کنید.

    محتوای کنترلر Site تا اینجا باید مقدار زیر باشه:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');

    class 
    Site extends CI_Controller
    {
        public function 
    __construct() {
            
    parent::__construct();
            
    $this->load->helper(array('url''form'));
            
    date_default_timezone_set('Asia/Tehran');
            
    $this->form_validation->set_error_delimiters('<p class="text-danger">''</p>');
        }

        public function 
    index()
        {
            
    $this->template->site();
        }

        public function 
    about()
        {
            
    $this->template->site('about');
        }


    بریم محتوای هدر رو تکمیل کنیم، محتوای هدر رو با مقدار زیر جایگزین کنید،
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');
    ?><!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Welcome to codeigniter</title>

        <link rel="stylesheet" href="<?php echo base_url(); ?>assets/themes/default/css/bootstrap.css">
        <link rel="stylesheet" href="<?php echo base_url(); ?>assets/themes/default/css/style.css">

        <script src="<?php echo base_url(); ?>assets/themes/default/css/style.css"></script>
    </head>

    <body>
    <nav class="navbar navbar-default navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#myPage">Logo</a>
            </div>
            <div class="collapse navbar-collapse" id="myNavbar">
                <ul class="nav navbar-nav navbar-left">
                    <li><a href="<?=base_url('about')?>">درباره</a></li>
                    <li><a href="<?=base_url('contact')?>">تماس</a></li>
                    <li><a href="<?=base_url('register')?>">ثبت‌نام</a></li>
                    <li><a href="<?=base_url('login')?>">ورود</a></li>
                </ul>
            </div>
        </div>
    </nav> 
    نگران عنوان ها نباشید در مطالب بعدی با دیتابیس تغییراتی ایجاد می‌کنیم.
    نکته: باید فونت های Vazir-Light و Vazir_Bold رو قرار بدین در دایرکتوری assets/themes/default/fonts و محتوای فایل style.css در دایرکتوری assets/themes/default/css رو با مقدار زیر جایگزین کنید:
    کد:
    .list-inline,.list-unstyled{padding-left:initial;padding-right:0}h2,h4{color:#303030;margin-bottom:30px}@font-face{font-family:VazirLight;src:url(../fonts/Vazir-Light.eot) format("eot"),url(../fonts/Vazir-Light.woff2) format("woff2"),url(../fonts/Vazir-Light.woff) format("woff"),url(../fonts/Vazir-Light.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:VazirBold;src:url(../fonts/Vazir-Bold.eot) format("eot"),url(../fonts/Vazir-Bold.woff2) format("woff2"),url(../fonts/Vazir-Bold.woff) format("woff"),url(../fonts/Vazir-Bold.ttf) format("truetype");font-weight:700;font-style:normal}body,html{direction:rtl}.flip.text-left{text-align:right}.flip.text-right{text-align:left}.list-inline{margin-right:-5px;margin-left:0}dd{margin-right:0;margin-left:initial}@media (min-width:768px){.dl-horizontal dt{float:right;clear:right;text-align:left}.dl-horizontal dd{margin-right:180px;margin-left:0}}blockquote{border-right:5px solid #eee;border-left:0}.blockquote-reverse,blockquote.pull-left{padding-left:15px;padding-right:0;border-left:5px solid #eee;border-right:0;text-align:left}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xxs-1,.col-xxs-10,.col-xxs-11,.col-xxs-12,.col-xxs-2,.col-xxs-3,.col-xxs-4,.col-xxs-5,.col-xxs-6,.col-xxs-7,.col-xxs-8,.col-xxs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}@media (max-width:480px){.col-xxs-1,.col-xxs-10,.col-xxs-11,.col-xxs-12,.col-xxs-2,.col-xxs-3,.col-xxs-4,.col-xxs-5,.col-xxs-6,.col-xxs-7,.col-xxs-8,.col-xxs-9{float:right}.col-xxs-12{width:100%!important}.col-xxs-11{width:91.66666667%!important}.col-xxs-10{width:83.33333333%!important}.col-xxs-9{width:75%!important}.col-xxs-8{width:66.66666667%!important}.col-xxs-7{width:58.33333333%!important}.col-xxs-6{width:50%!important}.col-xxs-5{width:41.66666667%!important}.col-xxs-4{width:33.33333333%!important}.col-xxs-3{width:25%!important}.col-xxs-2{width:16.66666667%!important}.col-xxs-1{width:8.33333333%!important}.col-xxs-pull-12{left:100%;right:auto}.col-xxs-pull-11{left:91.66666667%;right:auto}.col-xxs-pull-10{left:83.33333333%;right:auto}.col-xxs-pull-9{left:75%;right:auto}.col-xxs-pull-8{left:66.66666667%;right:auto}.col-xxs-pull-7{left:58.33333333%;right:auto}.col-xxs-pull-6{left:50%;right:auto}.col-xxs-pull-5{left:41.66666667%;right:auto}.col-xxs-pull-4{left:33.33333333%;right:auto}.col-xxs-pull-3{left:25%;right:auto}.col-xxs-pull-2{left:16.66666667%;right:auto}.col-xxs-pull-1{left:8.33333333%;right:auto}.col-xxs-pull-0{left:auto;right:auto}.col-xxs-push-12{right:100%;left:0}.col-xxs-push-11{right:91.66666667%;left:0}.col-xxs-push-10{right:83.33333333%;left:0}.col-xxs-push-9{right:75%;left:0}.col-xxs-push-8{right:66.66666667%;left:0}.col-xxs-push-7{right:58.33333333%;left:0}.col-xxs-push-6{right:50%;left:0}.col-xxs-push-5{right:41.66666667%;left:0}.col-xxs-push-4{right:33.33333333%;left:0}.col-xxs-push-3{right:25%;left:0}.col-xxs-push-2{right:16.66666667%;left:0}.col-xxs-push-1{right:8.33333333%;left:0}.col-xxs-push-0{right:auto;left:0}.col-xxs-offset-12{margin-right:100%;margin-left:0}.col-xxs-offset-11{margin-right:91.66666667%;margin-left:0}.col-xxs-offset-10{margin-right:83.33333333%;margin-left:0}.col-xxs-offset-9{margin-right:75%;margin-left:0}.col-xxs-offset-8{margin-right:66.66666667%;margin-left:0}.col-xxs-offset-7{margin-right:58.33333333%;margin-left:0}.col-xxs-offset-6{margin-right:50%;margin-left:0}.col-xxs-offset-5{margin-right:41.66666667%;margin-left:0}.col-xxs-offset-4{margin-right:33.33333333%;margin-left:0}.col-xxs-offset-3{margin-right:25%;margin-left:0}.col-xxs-offset-2{margin-right:16.66666667%;margin-left:0}.col-xxs-offset-1{margin-right:8.33333333%;margin-left:0}.col-xxs-offset-0{margin-right:0;margin-left:0}}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:right}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{left:100%;right:auto}.col-xs-pull-11{left:91.66666667%;right:auto}.col-xs-pull-10{left:83.33333333%;right:auto}.col-xs-pull-9{left:75%;right:auto}.col-xs-pull-8{left:66.66666667%;right:auto}.col-xs-pull-7{left:58.33333333%;right:auto}.col-xs-pull-6{left:50%;right:auto}.col-xs-pull-5{left:41.66666667%;right:auto}.col-xs-pull-4{left:33.33333333%;right:auto}.col-xs-pull-3{left:25%;right:auto}.col-xs-pull-2{left:16.66666667%;right:auto}.col-xs-pull-1{left:8.33333333%;right:auto}.col-xs-pull-0{left:auto;right:auto}.col-xs-push-12{right:100%;left:0}.col-xs-push-11{right:91.66666667%;left:0}.col-xs-push-10{right:83.33333333%;left:0}.col-xs-push-9{right:75%;left:0}.col-xs-push-8{right:66.66666667%;left:0}.col-xs-push-7{right:58.33333333%;left:0}.col-xs-push-6{right:50%;left:0}.col-xs-push-5{right:41.66666667%;left:0}.col-xs-push-4{right:33.33333333%;left:0}.col-xs-push-3{right:25%;left:0}.col-xs-push-2{right:16.66666667%;left:0}.col-xs-push-1{right:8.33333333%;left:0}.col-xs-push-0{right:auto;left:0}.col-xs-offset-12{margin-right:100%;margin-left:0}.col-xs-offset-11{margin-right:91.66666667%;margin-left:0}.col-xs-offset-10{margin-right:83.33333333%;margin-left:0}.col-xs-offset-9{margin-right:75%;margin-left:0}.col-xs-offset-8{margin-right:66.66666667%;margin-left:0}.col-xs-offset-7{margin-right:58.33333333%;margin-left:0}.col-xs-offset-6{margin-right:50%;margin-left:0}.col-xs-offset-5{margin-right:41.66666667%;margin-left:0}.col-xs-offset-4{margin-right:33.33333333%;margin-left:0}.col-xs-offset-3{margin-right:25%;margin-left:0}.col-xs-offset-2{margin-right:16.66666667%;margin-left:0}.col-xs-offset-1{margin-right:8.33333333%;margin-left:0}.col-xs-offset-0{margin-right:0;margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:right}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{left:100%;right:auto}.col-sm-pull-11{left:91.66666667%;right:auto}.col-sm-pull-10{left:83.33333333%;right:auto}.col-sm-pull-9{left:75%;right:auto}.col-sm-pull-8{left:66.66666667%;right:auto}.col-sm-pull-7{left:58.33333333%;right:auto}.col-sm-pull-6{left:50%;right:auto}.col-sm-pull-5{left:41.66666667%;right:auto}.col-sm-pull-4{left:33.33333333%;right:auto}.col-sm-pull-3{left:25%;right:auto}.col-sm-pull-2{left:16.66666667%;right:auto}.col-sm-pull-1{left:8.33333333%;right:auto}.col-sm-pull-0{left:auto;right:auto}.col-sm-push-12{right:100%;left:0}.col-sm-push-11{right:91.66666667%;left:0}.col-sm-push-10{right:83.33333333%;left:0}.col-sm-push-9{right:75%;left:0}.col-sm-push-8{right:66.66666667%;left:0}.col-sm-push-7{right:58.33333333%;left:0}.col-sm-push-6{right:50%;left:0}.col-sm-push-5{right:41.66666667%;left:0}.col-sm-push-4{right:33.33333333%;left:0}.col-sm-push-3{right:25%;left:0}.col-sm-push-2{right:16.66666667%;left:0}.col-sm-push-1{right:8.33333333%;left:0}.col-sm-push-0{right:auto;left:0}.col-sm-offset-12{margin-right:100%;margin-left:0}.col-sm-offset-11{margin-right:91.66666667%;margin-left:0}.col-sm-offset-10{margin-right:83.33333333%;margin-left:0}.col-sm-offset-9{margin-right:75%;margin-left:0}.col-sm-offset-8{margin-right:66.66666667%;margin-left:0}.col-sm-offset-7{margin-right:58.33333333%;margin-left:0}.col-sm-offset-6{margin-right:50%;margin-left:0}.col-sm-offset-5{margin-right:41.66666667%;margin-left:0}.col-sm-offset-4{margin-right:33.33333333%;margin-left:0}.col-sm-offset-3{margin-right:25%;margin-left:0}.col-sm-offset-2{margin-right:16.66666667%;margin-left:0}.col-sm-offset-1{margin-right:8.33333333%;margin-left:0}.col-sm-offset-0{margin-right:0;margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:right}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{left:100%;right:auto}.col-md-pull-11{left:91.66666667%;right:auto}.col-md-pull-10{left:83.33333333%;right:auto}.col-md-pull-9{left:75%;right:auto}.col-md-pull-8{left:66.66666667%;right:auto}.col-md-pull-7{left:58.33333333%;right:auto}.col-md-pull-6{left:50%;right:auto}.col-md-pull-5{left:41.66666667%;right:auto}.col-md-pull-4{left:33.33333333%;right:auto}.col-md-pull-3{left:25%;right:auto}.col-md-pull-2{left:16.66666667%;right:auto}.col-md-pull-1{left:8.33333333%;right:auto}.col-md-pull-0{left:auto;right:auto}.col-md-push-12{right:100%;left:0}.col-md-push-11{right:91.66666667%;left:0}.col-md-push-10{right:83.33333333%;left:0}.col-md-push-9{right:75%;left:0}.col-md-push-8{right:66.66666667%;left:0}.col-md-push-7{right:58.33333333%;left:0}.col-md-push-6{right:50%;left:0}.col-md-push-5{right:41.66666667%;left:0}.col-md-push-4{right:33.33333333%;left:0}.col-md-push-3{right:25%;left:0}.col-md-push-2{right:16.66666667%;left:0}.col-md-push-1{right:8.33333333%;left:0}.col-md-push-0{right:auto;left:0}.col-md-offset-12{margin-right:100%;margin-left:0}.col-md-offset-11{margin-right:91.66666667%;margin-left:0}.col-md-offset-10{margin-right:83.33333333%;margin-left:0}.col-md-offset-9{margin-right:75%;margin-left:0}.col-md-offset-8{margin-right:66.66666667%;margin-left:0}.col-md-offset-7{margin-right:58.33333333%;margin-left:0}.col-md-offset-6{margin-right:50%;margin-left:0}.col-md-offset-5{margin-right:41.66666667%;margin-left:0}.col-md-offset-4{margin-right:33.33333333%;margin-left:0}.col-md-offset-3{margin-right:25%;margin-left:0}.col-md-offset-2{margin-right:16.66666667%;margin-left:0}.col-md-offset-1{margin-right:8.33333333%;margin-left:0}.col-md-offset-0{margin-right:0;margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:right}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{left:100%;right:auto}.col-lg-pull-11{left:91.66666667%;right:auto}.col-lg-pull-10{left:83.33333333%;right:auto}.col-lg-pull-9{left:75%;right:auto}.col-lg-pull-8{left:66.66666667%;right:auto}.col-lg-pull-7{left:58.33333333%;right:auto}.col-lg-pull-6{left:50%;right:auto}.col-lg-pull-5{left:41.66666667%;right:auto}.col-lg-pull-4{left:33.33333333%;right:auto}.col-lg-pull-3{left:25%;right:auto}.col-lg-pull-2{left:16.66666667%;right:auto}.col-lg-pull-1{left:8.33333333%;right:auto}.col-lg-pull-0{left:auto;right:auto}.col-lg-push-12{right:100%;left:0}.col-lg-push-11{right:91.66666667%;left:0}.col-lg-push-10{right:83.33333333%;left:0}.col-lg-push-9{right:75%;left:0}.col-lg-push-8{right:66.66666667%;left:0}.col-lg-push-7{right:58.33333333%;left:0}.col-lg-push-6{right:50%;left:0}.col-lg-push-5{right:41.66666667%;left:0}.col-lg-push-4{right:33.33333333%;left:0}.col-lg-push-3{right:25%;left:0}.col-lg-push-2{right:16.66666667%;left:0}.col-lg-push-1{right:8.33333333%;left:0}.col-lg-push-0{right:auto;left:0}.col-lg-offset-12{margin-right:100%;margin-left:0}.col-lg-offset-11{margin-right:91.66666667%;margin-left:0}.col-lg-offset-10{margin-right:83.33333333%;margin-left:0}.col-lg-offset-9{margin-right:75%;margin-left:0}.col-lg-offset-8{margin-right:66.66666667%;margin-left:0}.col-lg-offset-7{margin-right:58.33333333%;margin-left:0}.col-lg-offset-6{margin-right:50%;margin-left:0}.col-lg-offset-5{margin-right:41.66666667%;margin-left:0}.col-lg-offset-4{margin-right:33.33333333%;margin-left:0}.col-lg-offset-3{margin-right:25%;margin-left:0}.col-lg-offset-2{margin-right:16.66666667%;margin-left:0}.col-lg-offset-1{margin-right:8.33333333%;margin-left:0}.col-lg-offset-0{margin-right:0;margin-left:0}}caption,th{text-align:right}@media screen and (max-width:767px){.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-right:0;border-left:initial}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-left:0;border-right:initial}}.checkbox label,.radio label{padding-right:20px;padding-left:initial}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-right:-20px;margin-left:auto}.checkbox-inline,.radio-inline{padding-right:20px;padding-left:0}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-right:10px;margin-left:0}.has-feedback .form-control{padding-left:42.5px;padding-right:12px}.form-control-feedback{left:0;right:auto}@media (min-width:768px){.form-inline label{padding-right:0;padding-left:initial}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{margin-right:0;margin-left:auto}.form-horizontal .control-label{text-align:left}}.form-horizontal .has-feedback .form-control-feedback{left:15px;right:auto}.caret{margin-right:2px;margin-left:0}.dropdown-menu{right:0;left:auto;float:left;text-align:right}.btn-group-vertical>.btn,.btn-group>.btn,.btn-group>.btn-group,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:right}.dropdown-menu.pull-right{left:0;right:auto;float:right}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-right:-1px;margin-left:0}.btn-toolbar{margin-right:-5px;margin-left:0}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-right:5px;margin-left:0}.btn .caret,.btn-group>.btn:first-child{margin-right:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-radius:0 4px 4px 0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-radius:4px 0 0 4px}.btn-group.btn-group-justified>.btn,.btn-group.btn-group-justified>.btn-group{float:none}.input-group .form-control,.nav-pills>li,.nav-tabs>li{float:right}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-radius:0 4px 4px 0}.btn-group>.btn-group:last-child>.btn:first-child{border-radius:4px 0 0 4px}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-right:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-radius:0 4px 4px 0}.input-group-addon:first-child{border-left:0;border-right:1px solid}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-radius:4px 0 0 4px}.input-group-addon:last-child{border-left-width:1px;border-left-style:solid;border-right:0}.input-group-btn>.btn+.btn{margin-right:-1px;margin-left:auto}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-left:-1px;margin-right:auto}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-right:-1px;margin-left:auto}.nav{padding-right:0;padding-left:initial}.nav-tabs>li>a{margin-left:auto;margin-right:-2px;border-radius:4px 4px 0 0}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-right:2px;margin-left:auto}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-right:0;margin-left:auto}.nav-justified>.dropdown .dropdown-menu{right:auto}.nav-tabs-justified>li>a{margin-left:0;margin-right:auto}.navbar-collapse{padding-right:15px;padding-left:15px}.navbar-brand{float:right}@media (min-width:768px){.nav-tabs-justified>li>a{border-radius:4px 4px 0 0}.navbar-header{float:right}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-right:-15px;margin-left:auto}}.navbar-toggle{float:left;margin-left:15px;margin-right:auto}@media (max-width:767px){.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 25px 5px 15px}}.pager,.pagination{padding-right:0}@media (min-width:768px){.navbar-right.flip,.navbar-right:last-child{margin-left:-15px;margin-right:auto}.navbar-nav,.navbar-nav>li{float:right}.navbar-left.flip{float:right!important}.navbar-right.flip{float:left!important}.navbar-right .dropdown-menu{left:0;right:auto}.navbar-text{float:right}.navbar-text.navbar-right:last-child{margin-left:0;margin-right:auto}}.pagination>li>a,.pagination>li>span{float:right;margin-right:-1px;margin-left:0}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-radius:0 4px 4px 0}.pagination>li:last-child>a,.pagination>li:last-child>span{margin-right:-1px;border-radius:4px 0 0 4px}.pager{padding-left:initial}.pager .next>a,.pager .next>span{float:left}.pager .previous>a,.pager .previous>span{float:right}.nav-pills>li>a>.badge{margin-left:0;margin-right:3px}.list-group-item>.badge{float:left}.list-group-item>.badge+.badge{margin-left:5px;margin-right:auto}.alert-dismissable,.alert-dismissible{padding-left:35px;padding-right:15px}.alert-dismissable .close,.alert-dismissible .close{right:auto;left:-21px}.progress-bar{float:right}.media>.pull-left{margin-right:10px}.media>.pull-left.flip{margin-right:0;margin-left:10px}.media>.pull-right{margin-left:10px}.media>.pull-right.flip{margin-left:0;margin-right:10px}.media-right,.media>.pull-right{padding-right:10px;padding-left:initial}.media-left,.media>.pull-left{padding-left:10px;padding-right:initial}.list-group,.media-list{padding-right:0;padding-left:initial}.media-list{list-style:none}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-right-radius:3px;border-top-left-radius:0}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-left-radius:3px;border-top-right-radius:0}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px;border-top-right-radius:0}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px;border-top-left-radius:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-right:0;border-left:none}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:none;border-left:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object{right:0;left:auto}.close{float:left}.modal-footer{text-align:left}.modal-footer.flip,.popover{text-align:right}.modal-footer .btn+.btn{margin-left:auto;margin-right:5px}.modal-footer .btn-group .btn+.btn{margin-right:-1px;margin-left:auto}.modal-footer .btn-block+.btn-block{margin-right:0;margin-left:auto}.popover{left:auto}.popover.top>.arrow{right:50%;left:auto;margin-right:-11px;margin-left:auto}.popover.top>.arrow:after{margin-right:-10px;margin-left:auto}.popover.bottom>.arrow{right:50%;left:auto;margin-right:-11px;margin-left:auto}.popover.bottom>.arrow:after{margin-right:-10px;margin-left:auto}.carousel-control{right:0;bottom:0}.carousel-control.left{right:auto;left:0;background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;right:auto;margin-right:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;left:auto;margin-left:-10px}.carousel-indicators{right:50%;left:0;margin-right:-30%;margin-left:0;padding-left:0}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{margin-left:0;margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}}.pull-right.flip{float:left!important}.pull-left.flip{float:right!important}body{line-height:1.8;color:#818181;font-family:VazirLight,Helvetica,Arial,sans-serif}h1,h2,h3,h4,h5,h6{font-family:VazirBold,Helvetica,Arial,sans-serif}h2{font-size:24px;text-transform:uppercase;font-weight:600}.item h4,h4{line-height:1.375em;font-weight:400}h4{font-size:19px}.jumbotron{background-color:#f4511e;color:#fff;padding:100px 25px}.container-fluid{padding:60px 50px}.bg-grey{background-color:#f6f6f6}.logo-small{color:#f4511e;font-size:50px}.logo{color:#f4511e;font-size:200px}.thumbnail{padding:0 0 15px;border:none;border-radius:0}.thumbnail img{width:100%;height:100%;margin-bottom:10px}.carousel-control.left,.carousel-control.right{background-image:none;color:#f4511e}.carousel-indicators li{border-color:#f4511e}.carousel-indicators li.active{background-color:#f4511e}.item h4{font-size:19px;font-style:italic;margin:70px 0}.item span{font-style:normal}.panel{border:1px solid #f4511e;border-radius:0!important;transition:box-shadow .5s}.panel:hover{box-shadow:5px 0 40px rgba(0,0,0,.2)}.panel-footer .btn:hover{border:1px solid #f4511e;background-color:#fff!important;color:#f4511e}.panel-heading{color:#fff!important;background-color:#f4511e!important;padding:25px;border-bottom:1px solid transparent;border-radius:0}.panel-footer{background-color:#fff!important}.panel-footer h3{font-size:32px}.panel-footer h4{color:#aaa;font-size:14px}.panel-footer .btn{margin:15px 0;background-color:#f4511e;color:#fff}.navbar{margin-bottom:0;background-color:#f4511e;z-index:9999;border:0;font-size:12px!important;line-height:1.42857143!important;border-radius:0}.navbar .navbar-brand,.navbar li a{color:#fff!important}.navbar-nav li a:hover,.navbar-nav li.active a{color:#f4511e!important;background-color:#fff!important}.navbar-default .navbar-toggle{border-color:transparent;color:#fff!important}footer .glyphicon{font-size:20px;margin-bottom:20px;color:#f4511e}.slideanim{visibility:hidden}.slide{animation-name:slide;-webkit-animation-name:slide;animation-duration:1s;-webkit-animation-duration:1s;visibility:visible}@keyframes slide{0%{opacity:0;transform:translateY(70%)}100%{opacity:1;transform:translateY​(0)}}@-webkit-keyframes slide{0%{opacity:0;-webkit-transform:translateY(70%)}100%{opacity:1;-webkit-transform:translateY(0)}}@media screen and (max-width:768px){.col-sm-4{text-align:center;margin:25px 0}.btn-lg{width:100%;margin-bottom:35px}}@media screen and (max-width:480px){.logo{font-size:150px}}.box{margin-top:50px}

    سعی کنید فایل‌هاتون (css و js و ...) رو مینیفای (Minify) کنید، البته بحث ما اینجا پرفورمنس نیست، ولی بزودی دوره‌ای درباره پرفرمنس رو در سایت خودم که دارم بازطراحی میکنم قرار میدم.

    فایل footer رو هم:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');
    ?>
    <footer class="container-fluid text-center">
        <a href="#myPage" title="To Top">
            <span class="glyphicon glyphicon-chevron-up"></span>
        </a>
        <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds. <?php echo  (ENVIRONMENT === 'development') ?  'CodeIgniter Version <strong>' CI_VERSION '</strong>' '' ?></p>
    </footer>

    <script>
        $(document).ready(function(){
            // Add smooth scrolling to all links in navbar + footer link
            $(".navbar a, footer a[href='#myPage']").on('click', function(event) {
                // Make sure this.hash has a value before overriding default behavior
                if (this.hash !== "") {
                    // Prevent default anchor click behavior
                    event.preventDefault();

                    // Store hash
                    var hash = this.hash;

                    // Using jQuery's animate() method to add smooth page scroll
                    // The optional number (900) specifies the number of milliseconds it takes to scroll to the specified area
                    $('html, body').animate({
                        scrollTop: $(hash).offset().top
                    }, 900, function(){

                        // Add hash (#) to URL when done scrolling (default click behavior)
                        window.location.hash = hash;
                    });
                } // End if
            });

            $(window).scroll(function() {
                $(".slideanim").each(function(){
                    var pos = $(this).offset().top;

                    var winTop = $(window).scrollTop();
                    if (pos < winTop + 600) {
                        $(this).addClass("slide");
                    }
                });
            });
        })
    </script>

    </body>
    </html> 
    دقت کنید که اسکریپت برای اسکرول به بالای صفحه و به صورت Animate (یعنی با انیمیشن، یعنی با حرکت آروم و نه یکدفعه) است،

    خب، ساخت صفحه درباره ما:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');
    ?>
    <div class="container box">
        <h1>درباره ما</h1>
        <p>متنی درباره ما</p>
    </div> 
    یه متن ساده گذاشتم، اگر دوست داشتید می‌تونید با الگویی که تا همین الان در فایل main.php داریم، بسازید که بحث html است و نه کدایگنایتر. خب در لینک atys.localhost/about می‌تونین تغییرات مد نظرتون رو ببینین.

    مرور: تا الان باید بتونید صفحات استاتیک رو براحتی ایجاد کنید و هر استایل و تم که مد نظرتون است بهش اعمال کنید، بریم فرم تماس با ما هم بسازیم و این مطلب رو تموم کنیم.
    این سه خط رو در فایل config در دایرکتوری application/config به مقادیر زیر تغییر دهید:
    کد PHP:
    $config['csrf_protection'] = TRUE;
    $config['csrf_token_name'] = 'csrf_name';
    $config['csrf_cookie_name'] = 'csrf_cookie'
    کار این خطوط، فعالسازی یک کوکی برای جلوگیری از حملات CSRF است. باید یک فیلد hidden بسازیم و مقادیر رو برای صفحات بفرستیم، برای اینکه نحوه کارش رو یاد بگیرید، در صفحه تماس استفاده می‌کنم.

    فرم تماس با ما:
    کد PHP:
    <?php
    defined
    ('BASEPATH') OR exit('No direct script access allowed');
    ?>
    <div class="container box">
        <h1>تماس با ما</h1>

        <div id="contact">
            <?= $this->session->flashdata('success'?>
            <?= $this->session->flashdata('error'?>
            <p>برای تماس با ما می‌توانید از ایمیل example[at]example[dot]com یا فرم زیر استفاده کنید.</p>
            <?= form_open(base_url() . 'contact', ['class' => 'form-horizontal']) ?>
            <input type="hidden" name="<?=$csrf['csrf_name'];?>" value="<?=$csrf['csrf_cookie'];?>">
            <div class="form-group">
                <?php
                $input 
    = [
                    
    'name'          => 'name',
                    
    'id'            => 'name',
                    
    'class'         => 'form-control',
                    
    'maxlength'     => '50',
                    
    'placeholder'   => 'نام شما',
                    
    'required'      => 'required'
                
    ];
                
    ?>
                <?=form_label('نام''name', ['class'=>'col-sm-2 control-label'])?>
                <div class="col-sm-10">
                    <?=form_input($input)?>
                    <?=form_error('name')?>
                </div>
            </div>
            <div class="form-group">
                <?php
                $input 
    = [
                    
    'name'          => 'email',
                    
    'id'            => 'email',
                    
    'class'         => 'form-control',
                    
    'maxlength'     => '100',
                    
    'placeholder'   => 'Email address...',
                    
    'required'      => 'required',
                    
    'dir'           => 'ltr',
                    
    'type'          => 'email'
                
    ];
                
    ?>
                <?=form_label('ایمیل''email', ['class'=>'col-sm-2 control-label'])?>
                <div class="col-sm-10">
                    <?=form_input($input)?>
                    <?=form_error('email')?>
                </div>
            </div>
            <div class="form-group">
                <?php
                $input 
    = [
                    
    'name'          => 'subject',
                    
    'id'            => 'subject',
                    
    'class'         => 'form-control',
                    
    'maxlength'     => '100',
                    
    'placeholder'   => 'موضوع',
                    
    'required'      => 'required',
                ];
                
    ?>
                <?=form_label('موضوع''subject', ['class'=>'col-sm-2 control-label'])?>
                <div class="col-sm-10">
                    <?=form_input($input)?>
                    <?=form_error('subject')?>
                </div>
            </div>
            <div class="form-group">
                <?php
                $input 
    = [
                    
    'name'          => 'content',
                    
    'id'            => 'content',
                    
    'class'         => 'form-control',
                    
    'minlength'     => '20',
                    
    'placeholder'   => 'متن خود را در این قسمت وارد کنید...',
                    
    'required'      => 'required',
                ];
                
    ?>
                <?=form_label('ایمیل''content', ['class'=>'col-sm-2 control-label'])?>
                <div class="col-sm-10">
                    <?=form_textarea($input)?>
                    <?=form_error('content')?>
                </div>
            </div>
            <div class="form-group">
                <?php
                $data 
    = array(
                    
    'name'          => 'submit',
                    
    'id'            => 'submit',
                    
    'value'         => 'true',
                    
    'class'         => 'btn btn-default',
                    
    'type'          => 'submit',
                    
    'content'       => 'ارسال فرم'
                
    );
                
    ?>

                <div class="col-sm-offset-2 col-sm-10">
                    <?= form_button($data?>
                </div>
            </div>
            <?= form_close() ?>
        </div>
    </div> 
    شما می‌تونین فرم رو به صورت دستی ببیندین و باز کنین، ولی بهتره که از استانداردهای خود کدایگنایتر (خودش رعایت نمی‌کنه البته Dodgy) استفاده کنین.
    کد PHP:
    form_open(base_url() . 'contact', ['class' => 'form-horizontal']) 
    این کد فرم رو باز میکنه و مقادیرش مشخصه، اولین پارامتر action فرم رو مشخص میکنه و آرایه دوم attributeهای عنصر فرم رو، همچنین با کد زیر بسته میشه:
    کد PHP:
    form_close() 

    فانکشن‌های form_label و form_input و form_textarea و form_button به ترتیب label و input و textarea و button می‌سازن. که به کد نگاهی داشته باشین خیلی واضح هستن و نیازی به توضیح ندارن،
    کد زیر رو ببینید:
    کد PHP:
    <?=form_error('subject')?>
    اگه فرمی رو اعتبارسنجی کنیم و بخواهیم خطایی نمایش بدیم، محل این خط محل نمایش خطا و آرگومان داخلش باید یک attribute باشه، درست حدس زدین، name مربوط به عنصر فرم، مثلا اینجا عنصر subject.
    کد PHP:
    $this->form_validation->set_error_delimiters('<p class="text-danger">''</p>'); 
    این کد در متد __construct مسئول تغییر شکل خطاها است. در انتها و بعد از vlidation اگه خطایی باشه زیر فرم با رنگ قرمز نمایش داده میشه،
    فراموش نکنید که قبلا کتابخانه form_Validation در در فایل autoload تعریف کردیم، تا در تمام برنامه اجرا بشه، البته هلپرهایی مثل url و form و ... رو میتونین در اون فایل قرار بدن.
    اکشن مربوط به صفحه تماس:
    کد PHP:
    public function contact()
        {
            
    $this->form_validation->set_rules('name''نام شما''trim|required|max_length[50]');
            
    $this->form_validation->set_rules('email''ایمیل''trim|required|max_length[100]|valid_email');
            
    $this->form_validation->set_rules('subject''موضوع''trim|required|max_length[100]');
            
    $this->form_validation->set_rules('content''پیام''trim|required|min_length[20]');
            if(
    $this->form_validation->run() === TRUE) {
                if (
    $this->_send_mail()) {
                    
    $this->session->set_flashdata('success''<div class="alert alert-success">فرم با موفیت ارسال شد.</div>');
                }
                else {
                    
    $this->session->set_flashdata('error''<div class="alert alert-danger">ارسال فرم شکست خورد!</div>');
                }
            }
            
    $data['csrf'] = [
                
    'csrf_name' => $this->security->get_csrf_token_name(),
                
    'csrf_cookie' => $this->security->get_csrf_hash()
            ];
            
    $this->template->site('contact'$data);
        } 
    قبلا کتابخانه form_validation رو معرفی کردیم، پس می‌تونیم از دستوراتش استفاده کنیم، گفتم نباید به کاربر اعتماد کنیم، پس اول یک سری Rule تعریف میکنیم که اگه مجاز نبود، خطا رخ بده و در زیر هر input (خودمون تعریف کردیم محلشو، بالاتر رو ببینید) متنی مرتبط نمایش داده میشه، کل Ruleهای قابل استفاده رو می‌تونید ببینید و یا متنهی مربوط به اونا رو شخصی‌سازی کنید و یا حتی پا رو فراتر بگذارید و خودتون Rule بنویسید.

    متد set_rules از این کتابخانه مسئول تعریف Ruleها است اولین آرگومنت آن نام فیلد (اتریبیوت name) و دومی نام معادل که در خطا استفاده می‌شود (متن خطا بیشتر است، فقط مثل نمونه بنویسید) و سومی Ruleهایی که مایل به اعتبارسنجی آن‌ها هستید. نکته خاصی نداره ولی این تعریف به تنهایی کافی نیست و اثری نداره، مگر اینکه:
    کد PHP:
    if($this->form_validation->run() === TRUE) { 
    این خط میگه برو ولیدیشن‌ها رو بررسی کن و اگر درست بود، دستورات رو انجام بده، نیاز به else نداره، خودش خودکار خطاها رو تولید میکنه.
    کد PHP:
    $this->session->set_flashdata 
    این تابع یک سشن یکبار مصرف می‌سازد، که در ویو استفاده کرده ایم.

    کد PHP:
    $data['csrf'] = [
                
    'csrf_name' => $this->security->get_csrf_token_name(),
                
    'csrf_cookie' => $this->security->get_csrf_hash()
            ];
            
    $this->template->site('contact'$data); 
    این خطوط هم نام توکن و مقدار هش رو برای ویو ارسال می‌کنن، پارامتر دوم یک آرایه است که کلید یا اندیس هر خانه که می‌تواند به صورت استرینگ (string یا رشته) باشد، در ویو تبدیل به یک متغییر خواهد شد و مقدار آن خانه به عنوان مقدار این متغییر قرار داده می‌شود.

    یه متد (نگفتم اکشن، گفتم متد پس دقت کنید) برای ارسال ایمیل می‌سازیم:
    کد PHP:
    private function _send_mail() {
                
    $this->email->from($this->input->post('email'TRUE), $this->input->post('name'TRUE));
                
    $this->email->to('info@baversion.com');
                
    $this->email->subject($this->input->post('subject'TRUE));
                
    $this->email->message($this->input->post('content'TRUE));
                return 
    $this->email->send();
        } 
    نکته: اینو در واقع بهتره در قالب یک helper تعریف کنیم (شاید جلسه بعد اگه وقت شد، ببرمش داخل یک هلپر)، به این دلیل اینجا نوشتم که بدونید که برای اینکه متدی در کنترلر داشته باشیم که نخواهیم مستقیم اجرا بشه و هدف ما از اون، استفاده به عنوان یک متد کمکی است، میتونیم متد رو با اندراسکور (_) شروع کنیم و کدایگنایتر به صورت خودکار اونو اجرا نمی‌کنه، البته بهتره scope هم public نباشه (کار از محکم کاری عیب نمی‌کنه).
    طبق مدل MVC، ویو و ... قرار نیست به کنترلر دسترسی داشته باشن و کنترلر مسئول انتخاب کنترلر و اکشن است و پارامترها رو بهش پاس میده و خودشو از کار میکشه کنار و بقیه موارد رو به دستای توانای کنترلر میده.

    به عنوان نکته پایانی، برای مقادیر inputها با قرار دادن آرگومنت دوم شاید کمی سختگیری کرده باشیم، می‌تونید به جاش از html_escape استفاده کنید، مقایسه با خودتون.

    امکانات انجمن برای ادامه کافی نیست، پیام به مدیر هم فایده‌ای نداشت! واقعا اذیت میشم در نتیجه با عرض معذرت، توصیه می‌کنم راهنمای کدایگنایتر رو برای ادامه مطالعه کنید.
    موفق باشید.
    __________________________________________________________________________
    باورژن
    (آخرین ویرایش در این ارسال: ۱۳۹۶ اسفند ۲۵ ۱۲:۴۵ عصر، توسط Version.)
    ۱۳۹۶ بهمن ۲۰ ۱۰:۲۳ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : Y.P.Y ImanAzadi
    Version غایب
    عضو جدید
    **

    ارسال‌ها: 27
    تاریخ عضویت: ۱۳۹۳ شهريور ۱۵
    اعتبار: 8
    تشکرها : 0
    ( 64 تشکر در 27 ارسال )
    ارسال: #8
    RE: آموزش کدایگنایتر 3
    نوشتن یک مطلب فقط سرهم کردن چند خط نیست. بلکه باید کیفیت این مطالب به صورت کامل بررسی بشه. به شخصه اصلا از کدایگنایتر استفاده نمی‌کنم، پس برای هر مطلب باید ابتدا یه نتیجه نهایی برای اون مطلب در نظر بگیرم، بعد برم دنبال اینکه داکیومنت‌های مرتبط با موارد موردنیاز مطلب رو بخونم و در نهایت شروع به کدنویسی کنیم و نتیجه‌ها رو در مطلب بنویسم. به هر حال با هر بدبختی است لیست‌ها رو میشه ساخت، بود و ایتالیک کرد ولی چینش، نمایش کد اینلاین، ساخت عنوان فقط چندتا از مشکلاتی است که نبودشون، روح رو از نوشته می‌دزده و چون هیچوقت حتی یه خط مطلب کپی نمی‌نویسم، پس باید مطالبم از هر لحاظ کامل باشه. که خب این مورد متاسفانه باعث عدم ادامه کار میشه.

    آخرین آموزش این تاپیک:
    مورد اول اینکه در توضیحات قبلی نبود، فایل .htaccess (اگه وجود نداره) رو بسازید و مقادیر زیر رو جایگزین کنید:
    کد:
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]

    برای اعتبارسنجی کاربر، باید چند تا کار انجام بدین:
    برای هر عملیاتی مثل لاگین، لاگ‌اوت، رجیستر، بازیابی پسورد و ... اکشن مربوطه رو بسازین
    مثلا، برای اکشن لاگین:
    کد PHP:
    public function login()
        {
                 if(
    logged_in())
            {
                
    $this->load->library('user_agent');
                
    redirect($this->agent->referrer());
            }

            if (
    $this->input->method() === 'post')
            {
                
    $this->_login();
            }
            else
            {
                
    $this->load->view('admin/login'$this->data);
            }
        } 
    در این مثال متد login وجود داره که لاگین بودن یا نبودن کاربر رو بررسی می‌کنه و اگه لاگین بود کاربر رو به صفحه دیگری ریدایرکت می‌کنه، اگه لاگین نبود به متد _login پاس می‌دهد، بعد از اعتبارسنجی مقادیر فرم، نسبت به لاگین کاربر اقدام میکنه. مثالی از محتوای این متد:
    کد PHP:
    private function _login()
        {
            
    $data['error'] = false;
                
            
    $this->form_validation->set_rules('email''Email''required|valid_email');
            
    $this->form_validation->set_rules('password''Password''required');
        
            if(
    $this->form_validation->run()){
                if(
    $this->authit->login(set_value('email'), set_value('password'))){
                    
    // Redirect to your logged in landing page here
                    
    redirect(base_url('admin'));
                } else {
                    
    $data['error'] = 'ایمیل یا پسورد وارد شده اشتباه است.';
                }
            }
        
            
    $this->load->view('admin/login'$data);
        } 

    برای فانکشن login_in که در اکشن لاگین استفاده میشه هم یه هلپر بنویسین و در کنترلر لود کنید. مثلا:
    کد PHP:
    function logged_in()
    {
        
    $CI =& get_instance();
        
    $CI->load->library('authit');
        
        return 
    $CI->authit->logged_in();

    فانکشن دیگه‌ای هم نیاز داشتین که مربوط به لاگین بود در همین هلپر بنویسین.

    برای لاگ‌اوت:
    کد PHP:
    public function logout()
        {
            if(!
    logged_in())
            {
                
    redirect('admin/login');
            }
            
    $this->auth->logout(base_url());
        } 
    و به طور مشابه برای سایر.


    فقط فراموش نکنید که لایبرری Auth رو بسازید و حتما لود کنید (قبلا روش اینکار رو گفتم.)
    در این لایبرری چند تا متد مربوط به عملیات لاگین/رجیستر رو بنویسین، مثلا لاگ‌اوت:
    کد PHP:
    public function logout($redirect false)
        {
            
    $this->CI->session->sess_destroy();
            if(
    $redirect){
                
    $this->CI->load->helper('url');
                
    redirect($redirect'refresh');
            }
        } 

    یا لاگین:
    کد PHP:
    public function logged_in()
        {
            return 
    $this->CI->session->userdata('logged_in');
        }
        
        public function 
    login($email$password)
        {
            
    $user $this->CI->staffs->get_user_by_email($email);
            if(
    $user){
                if(
    password_verify($password$user->password)){
                    unset(
    $user->password);
                    
    $this->CI->session->set_userdata(array(
                        
    'logged_in' => true,
                        
    'user' => $user
                    
    ));
                    
    $this->CI->staffs->update_user($user->id, array('last_login' => date('Y-m-d H:i:s')));
                    return 
    true;
                }
            }
             
            return 
    false;
        } 

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

    در پایان از همه دوستانی که این مطلب رو دنبال کردن تشکر می‌کنم، برای اینکه آموزش نیمه کاره رها نشه، داکیومنت کدایگنایتر رو به زبان فارسی در باورژن مطالعه کنید.
    موفق باشید.
    __________________________________________________________________________
    باورژن
    (آخرین ویرایش در این ارسال: ۱۳۹۷ خرداد ۲۸ ۱۱:۲۱ صبح، توسط Version.)
    ۱۳۹۶ اسفند ۲۵ ۰۳:۳۷ عصر
    یافتن ارسال‌ها WWW پاسخ با نقل قول
     تشکر شده توسط : Y.P.Y
    « قدیمی تر | تازه‌ تر »

    ارسال پاسخ
    پرش به انجمن:


    کاربرانِ درحال بازدید از این موضوع: 1 مهمان
    IranPHP.org | تماس با ما | بازگشت به بالا | بازگشت به محتوا | بایگانی | پیوند سایتی RSS