خوب طبق توضیحاتی که در قسمت اول آموزش دادم MVC دارای سه بخش Controller و View و Model هست که تا حدودی قسمت Controller انجام دادیم، فقط باید یه کلاس بنام Controller بسازیم که این کلاس میشه والد و باید ارث بری انجام بدیم ، بعد از اینکه کلاس Controller ایجاد کردیم، میریم سر وقت دو قسمت دیگه که اونارو هم به وب سایتمون اضافه کنیم .
در ابتدا یه فایل به نام Controller.php توی فولدر Libs میسازیم و کدهای زیر توش مینویسیم :

۱
۲
۳
۴
۵
۶
۷
۸
۹
<?php
class Controller
{
    function __construct()
    {
        echo "<br>Main Controller<br>";
    }
}

متن Main Controller واسه تست گذاشتم که بعداً غیرفعالش میکنیم، سپس به ابتدای کد کلاسهای About,Index.Login ، کد زیر رو اضافه میکنیم (مثلاً ابتدای کد Login بصورت زیر میشه)

۱
class Login extends Controller

توی php واسه ارث بری از کلمه extends استفاده میشه (کلاس Login از کلاس Controller ارث میبره)
خوب حالا یه تست میکنیم :

Image

بهمون خطا میده، میگه نتونست کلاس Controller پیدا کنه حالا واسه رفع خطا باید کدهای php فایل Index.php بصورت زیر ویرایش کنیم :

۱
۲
۳
۴
۵
۶
۷
۸
<?php
    require("libs/Controller.php");
    require("libs/Bootstrap.php"); 
    $app = new Bootstrap();
    
?>

فقط خط اول میخواد اضافه کنیم . حالا یه بار دیگه تست میکنیم :

Image

این سری بهمون خطا نداد ولی خوب چیزی هم واسمون چاپ نکرد، باید پیغام Main Controller برامون چاپ میشد، مشکل اینجاست که ما توی کد کلاس Controller گفتیم موقعی که تابع سازنده این کلاس فراخوانی میشه این پیغام چاپ بشه ولی هنوز کدی واسش ننوشتیم که این کارو انجام بده، واسه اینکار باید کد زیر رو توی تابع سازنده کلاسهای Index,Login,About بنویسیم (مثلاً کلاس سازنده Login بصورت زیر میشه)

۱
۲
۳
۴
۵
۶
function __construct()
{
    parent::__construct();
    
    echo "<br>Page Login ";
}

متونستیم بجای اینکه بنویسیم

۱
parent::__construct();

این کد رو بنویسیم (هیچ فرقی نمیکنه)

۱
Controller::__construct();

خوب حالا یه بار دیگه تست میکنیم :

Image

دیدید که برامون پیغام Main Controller چاپ کرد، کلاس Controller به این خاطر ساختیم چون میخوایم از تکرار کدهای که قرار درآینده توی کلاسهای About,Index,Login بنویسیم جلوگیری کنیم و کدهارو فقط توی کلاس Controller بنویسیم و کلاسهای About,Index.Login با استفاده از قابلیت ارث بری از این کدها استفاده کنن (اینجوری هم کدمون ساختار بهتری پیدا میکنه، هم خطایابیش بهتر میشه و هم کمتر میخواد کد بنویسیم)
خوب میخوایم قسمت view برای وب سایتمون بسازیم واسه اینکار ابتدا باید یه فایل دیگه به نام View.php توی فولدر libs بسازیم و کدهای زیرو توش بنویسیم (در واقع داریم یه کلاس بنام view ایجاد میکنیم)

۱
۲
۳
۴
۵
۶
۷
۸
۹
<?php
class View
{
    function __construct()
    {
        echo "<br>we are in page View";
    }
}

تابع سازنده کلاس Controller بصورت زیر ویرایش میکنیم :

۱
۲
۳
۴
۵
۶
function __construct()
{
    echo "<br>Main Controller<br>";
    
    $this->view = new View();
}

یه شی به نام view از نوع کلاس View میسازیم، زمانی که میخوایم یه متغیری تعریف کنیم که بتونیم توی جاهای دیگه ای از کدمون بهش دسترسی داشته باشیم، باید قبل از نام متغیر کلمه this$ قرار بدیم، خوب دوباره باید کدهای php صفحه Index.php بصورت زیر تغییر بدیم :

۱
۲
۳
۴
۵
۶
۷
۸
۹
<?php
    require("libs/Controller.php");
    require("libs/view.php");
    require("libs/Bootstrap.php"); 
    $app = new Bootstrap();
    
?>

و زمانی که یکی از صفحات سایتمون (مثلاً صفحه About) باز میکنیم بصورت زیر نمایش داده میشه :

Image

طبق توضیحاتی که در آموزشهای قبلی دادم، توی قسمت View فقط کدهایی نوشته میشن که میخوایم اطلاعاتی یا چیزی به کاربر نمایش داده بشن (مثل قالب سایت یا تگها و …) پس در نتیجه میایم توی فولدر Views، سه فولدر بنام های Index,About,Login میسازیم و توی هر فولدر یه فایل به نام Index.php میسازیم .
کد Index.php توی فولدر Login :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
۲۰
۲۱
۲۲
۲۳
۲۴
۲۵
۲۶
۲۷
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
    <div>
        <ul>
            <li>
                <label>نام کاربری : </label>&nbsp;
                <input type="text" id="txt_User" name="txt_User" />
            </li>  
            <li>
                <label>رمز عبور : </label>&nbsp;
                <input type="text" id="txt_Pass" name="txt_Pass" />
            </li>   
            <li>
                <input type="submit" id="btn_Login" name="btn_Login" />
            </li>
        </ul>
    </div>
</body>
</html>

کد Index.php توی فولدر Index :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
    ...........Page Index...........
</body>
</html>

کد Index.php توی فولدر About :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
    ...........Page About...........
</body>
</html>

خوب حالا یه فایل Header.php و Footer.php هم توی فولدر Views میسازیم و کدهای منو سایت (با کمی تغییرات) از صفحه Index.php (فایل Index.php که توی فولدر وب سایتمون هست) انتقال میدیم به Header.php (بصورت زیر) :
کد ویرایش شده Index.php (توی فولدر وب سایتمون) :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
۲۰
۲۱
۲۲
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
    
<?php
    require("libs/Controller.php");
    require("libs/view.php");
    require("libs/Bootstrap.php"); 
    $app = new Bootstrap();
    
?>
</body>
</html>

کد Footer.php :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
    <div id="Footer">
        <div>
            &copy;Copyright
        </div>
    </div>
</body>
</html>

کد Header.php :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
۲۰
۲۱
۲۲
۲۳
۲۴
۲۵
۲۶
۲۷
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
    <div id="Header">
        <div id="MainMenu">
            <ul>
                <li>
                    <a href="Index">خانه</a>
                </li>
                <li>
                    <a href="Login">ورود</a>
                </li>
                <li>
                    <a href="About">درباره</a>
                </li>
            </ul>
        </div>
    </div>
</body>
</html>

حالا اگه یه خروجی از وب سایتمون بگیریم بصورت زیر بهمون نمایش داده میشه :

Image

حالا باید تابع سازنده کلاس Controller بصورت زیر ویرایش کنیم :

۱
۲
۳
۴
۵
۶
function __construct()
{
    //echo "<br>Main Controller<br>";
    
    $this->view = new View();
}

و سپس کلاس View رو هم بصورت زیر ویرایش کنیم :

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
<?php
class View
{
    function __construct()
    {
        //echo "<br>we are in page View";
    }
    
    function Render($name)
    {      
        require("Views/Header.php");
        
        require("views/".$name.".php");
        
        require("Views/Footer.php");
    }
        
}

یه تابع بنام Render تعریف میکنیم و زمانی که ابن تابع فراخوانی میشه، ابتدا کدهای Header.php اجرا میشه سپس کدهای فایلی که نامش داخل متغیر name$ هست اجرا میشه و در آخر هم کدهای Footer.php اجرا میشن .
خوب حالا یه اجرا میگیریم .

Image

باید ابتدا این پیغام ها غیر فعال بشن ، باید دستور echo رو توی تابع سازنده کلاسهای About,Index,Login غیر فعال کنیم و سپس یه خط کد به این تابع سازنده اضافه کنیم .
کد تابع سازنده کلاس About :

۱
۲
۳
۴
۵
۶
۷
۸
function __construct()
{
    parent::__construct();
    
    //echo "<br>Page About ";
    
    $this->view->Render("About/index");
}

کد تابع سازنده کلاس Index :

۱
۲
۳
۴
۵
۶
۷
۸
function __construct()
{
    parent::__construct();
    
    //echo "<br>Page Index ";
    
    $this->view->Render("Index/index");
}

کد تابع سازنده کلاس Login :

۱
۲
۳
۴
۵
۶
۷
۸
function __construct()
{
    parent::__construct();
    
    //echo "<br>Page Login ";
    
    $this->view->Render("Login/index");
}

خوب حالا یه خروجی میگیریم ببینیم چه جوری شد :

Image

 

Image

خوب میبینید که تا اینجا همه چی درسته فقط باید یه قالب کوچک براش بنویسیم تا بهتر بشه .