Quảng Cáo

Cpm Affiliation : the cpm advertising network

Hướng dẫn lập trình web bán mỹ phẩm đơn giản theo mô hình MVC (Part1)

Category: , , Written by Nam Phạm Ngọc Quang / 16:51


(Lưu ý: Trong quá trình thực hành không nên copy-paste code)

Hướng dẫn mô hình MVC


Để tìm hiểu thêm về định nghĩa mvc:

Mô hình lập trình MVC
Mô hình MVC


http://en.wikipedia.org/wiki/Model-view-controller

Yêu cầu:

- Biết code php đơn giản

- Cài đặt xampp

Bắt đầu:

Vào thư mục htdocs của thư mục xampp tạo folder mypham chứa 3 folder con:

  • Controllers
  • Models
  • Views


Tại thư mục mypham tạo 1 file tên là index.php

Sau quá trình trên thư mục mypham như sau:

Người dùng sẽ truy cập vào toàn bộ trang web của bạn thông qua trang index.php


  • http://yoursite.com/index.php?page1
  • http://yoursite.com/index.php?page2
  • http://yoursite.com/index.php?page3


Cấu hình đầu tiên cho file index.php

<?php
/**
* Định nghĩa SERVER_ROOT là thư mục gốc
*
*/
define('SERVER_ROOT','.');

Mục đích của việc tạo ra SERVER_ROOT để sau này chúng ta dùng để load 1 số tài nguyên, file php,
video, image, css chẳng hạn.

Cấu hình Router

Ở thư mục controllers tạo 1 file tên rourter.php. File này sẽ có nhiệm vụ xử lý tất cả các trang web được
yêu cầu. Nó có công việc nhận yêu cầu từ file index.php và gọi các controller cần thiết để xử lý

<?php
//Lấy chuỗi được yêu cầu để phân tích
$query = $_SERVER['QUERY_STRING'];

Nhớ lại đoạn mô tả, người dùng sẽ truy cập vào trang web ta theo cấu trúc:


  • http://yoursite.com/index.php?page1


Phần nội dung yêu cầu là đoạn văn bản nằm sau dấu ‘?’, ví dụ với đoạn trên là ‘page1’

Tiếp theo, ta thêm đoạn sau vào nội dung file router.php:

//Phân tích trang được yêu cầu và 1 vài biến GET
$parsed = explode('&',$query);
//Trang được yêu cầu sẽ là phần tử đầu tiên
$page = array_shift($parsed);
//Tạo biến để chứa các biến GET
$getVars = array();
foreach ($parsed as $argument)
{
//Tách các biến GET bởi dấu ngăn cách '='
list($variable , $value) = explode('=' , $argument);
$getVars[$variable] = $value;
}
//Đây là phần test, chúng ta sẽ xóa nó sau
print "Trang web duoc yeu cau la '$page'";
print '<br/>';
$vars = print_r($getVars, TRUE);
print "Cac bien duoc truyen vao theo phuong thuc GET :<pre>".$vars."</pre>";

Và bây giờ tại file index.php ta cần nhúng file router.php vào, nội dung file index.php sau khi đã được
sửa:

<?php
/**
* Định nghĩa SERVER_ROOT là thư mục gốc
*
*/
define('SERVER_ROOT','.');
/**
* Include file router để xử lý
*/
require_once(SERVER_ROOT . '/controllers/' . 'router.php');

Bây giờ thử truy cập vào địa chỉ sau:


  • http://localhost/mypham/index.php?sanppham&action=product&sub=category&path=1


Chúng ta sẽ nhận được nội dung như sau:

Trang web duoc yeu cau la 'sanppham'
Cac bien duoc truyen vao theo phuong thuc GET :
Array
(
[action] => product
[sub] => category
[path] => 1
)

Nếu không phải nội dung giống vậy, vui lòng kiểm tra lại các bước vừa làm

Tiếp theo chúng ta sẽ tạo 1 trang cho trang web

Tạo controller


Tại thư mục controllers tạo một file tên sanpham.php

<?php
/**
* Đây là file điều khiển của trang sanpham
*/
class Sanpham_Controller
{
/**
* Tên template nằm trong thư mục 'views' trong mô hình MVC
* để hiện thông tin sản phẩm
*/
public $template = 'sanpham';
/**
* Đây là hàm mặc định sẽ được gọi từ router.php
*
* @param array $getVars chứa các biến GET từng trang index.php
*/
public function main(array $getVars)
{
//Đây là đoạn test, chúng ta sẽ có nó sau
print "Day la trang san pham!";
print '<br/>';
$vars = print_r($getVars, TRUE);
print
(
"Cac bien GET duoc truyen vao :" .
"<pre>".$vars."</pre>"
);
}
}

Chúng ta copy code từ phần router.php và sửa lại nó trong hàm main của controller, bây giờ chúng ta sẽ
gọi hàm main của controller từ router.php. File router.php sau khi đã chỉnh sửa sẽ có nội dung như sau:

<?php
//Lấy chuỗi được yêu cầu để phân tích
$query = $_SERVER['QUERY_STRING'];
//Phân tích trang được yêu cầu và 1 vài biến GET
$parsed = explode('&',$query);
//Trang được yêu cầu sẽ là phần tử đầu tiên
$page = array_shift($parsed);
//Tạo biến để chứa các biến GET
$getVars = array();
foreach ($parsed as $argument)
{
//Tách các biến GET bởi dấu ngăn cách '='
list($variable , $value) = explode('=' , $argument);
$getVars[$variable] = $value;
}
//Đường dẫn đến file controller
$target = SERVER_ROOT . '/controllers/' . $page . '.php';
//Include controller
if (file_exists($target))
{
include_once($target);
//Tùy chỉnh lại để phù hợp với tên class
$class = ucfirst($page) . '_Controller';
//Kiểm tra tên class có tồn tại hay không
if (class_exists($class))
{
$controller = new $class;
}
else
{
//Kiểm tra lại tên class nếu gặp lỗi này
die('class does not exist!');
}
}
else
{
//Không tìm thấy file trong 'controllers'
die('page does not exist!');
}
//Gọi hàm main trong controller
//Truyển các biến GET vào hàm main
$controller->main($getVars);

Bây giờ chúng ta hãy thử truy cập lại trang vừa nãy và xem có gì khác

Tạo Model


Trước khi chuyển qua bước này hãy chắn chắn là Sanpham_Controller đã hoạt động.

Tại thư mục models chúng ta sẽ tạo file sanpham.php với nội dung

<?php
/**
* Sanpham_Model sẽ chứa dữ liệu để cung cấp cho Sanpham_Controller
*/
class Sanpham_Model
{
public function __construct()
{
print 'Day la Sanpham_Model';
}
}

Nào, tại Sanpham_Controller hàm main() chúng ta sẽ khởi tạo đối tượng của lớp Sanpham_Model

Hàm main sau khi thay đổi:

public function main(array $getVars)
{
$sanphamModel = new Sanpham_Model();
}

Refesh lại trang vừa nãy
(http://localhost/mypham/index.php?sanppham&action=product&sub=category&path=1) chúng ta sẽ
gặp 1 thông báo lỗi là:

Fatal error: Class 'Sanpham_Model' not found
in C:\xampp\htdocs\mypham\controllers\sanpham.php on line 20

Lỗi này xuất hiện là do chúng ta chưa include file ‘models/sanpham.php’ nên không có lớp
Sanpham_Model

Bây giờ chúng ta sẽ sửa lại file router, thêm đoạn code này vào trên cùng file router.php

//Tự động include file chứa các class được gọi
function __autoload($className)
{
//tách tên class bởi dấu _
list($filename , $suffix) = explode('_' , $className);
//Lấy đường dẫn đến file
$file = SERVER_ROOT . '/models/' . strtolower($filename) . '.php';
//Include file
if (file_exists($file))
{
include_once($file);
}
else
{
//File không tồn tại
die("File '$filename' định nghĩa lớp '$className' không tồn tại.");
}
}

Hàm này sẽ overload hàm __autoload mặc định trong php, tại hàm này chúng ta sẽ chỉ cho php cần
include những file nào, lưu lại các thay đổi và thử refresh lại trình duyệt, chúng ta sẽ có kết quả là:

Day la Sanpham_Model

Bây giờ tại Sanpham_Model chúng ta sẽ tạo 1 vài sản phẩm và viết hàm lấy sản phẩm theo id

File Sanpham_Model sau khi hay đổi:

<?php
/**
* Sanpham_Model sẽ chứa dữ liệu để cung cấp cho Sanpham_Controller
*/
class Sanpham_Model
{
private $lstSanpham = array(
'1' => array(
'tensp' => 'Kem tri mun',
'mota' => 'Kem tri mun hon hop, nhap khau tu italia, tri mun hieu
qua..'
),
'2' => array(
'tensp' => 'Son moi Lipton',
'mota' => 'Son moi hang hieu, son vao moi do nhu moi bi danh'
),
'3' => array(
'tensp' => 'Kem chong nang',
'mota' => 'Kem chong nang, cang sai cang thay den'
),
'4' => array(
'tensp' => 'Kem trai cay',
'mota' => 'Kem trai cay dung de an chu hong phai de lam dep'
)
);
public function __construct()
{
}
/**
* Hàm lấy sản phẩm theo id
*@param $id id của sản phẩm
*/
public function getSanphamById($id)
{
$sanpham = $this->lstSanpham['id'];
return $sanpham;
}
}

Và bây giờ ở hàm main của Sanpham controller ta sửa lại như sau:

public function main(array $getVars)
{
$sanphamModel = new Sanpham_Model();
$sanpham = $sanphamModel->getSanphamById('1');
print_r($sanpham);
}

Truy cập thử vào địa chỉ:

http://localhost/mypham/index.php?sanpham&id=1

Hãy sửa lại đoạn code trên để người dùng có thể lấy sản phẩm theo id truyền vào từ trình duyệt

Tạo View


Xem đoạn code sau:

<html>
<head></head>
<body>
<h1>Chào mừng đến với website!</h1>
<hr/>
<h2>Thông tin sản phẩm</h2>
<h4><?php echo $data['tensp'];?></h4>
<p><?php echo $data['mota'];?></p>
</body>
</html>

Chúng ta thấy đó là 1 đoạn code html, lồng trong đó là những đoạn php để hiển thị thông tin

Lưu đoạn code trên trong file sanpham.php tại thư mục views

Làm sao chúng ta truyền dữ liệu để hiện thị lên được sanpham.php ? Trong thư mục models tạo 1 file
view.php với nội dung như sau:

<?php
/**
* Lớp điều khiển view trong mô hình MVC
*/
class View_Model
{
/**
* Tạo biến để chứa các dữ liệu đưa vào template
*/
private $data = array();
/**
* Trạng thái view
*/
private $render = FALSE;
/**
* Load template
*/
public function __construct($template)
{
//Tên file
$file = SERVER_ROOT . '/views/' . strtolower($template) . '.php';
if (file_exists($file))
{
/**
* Lưu tên file vào render đến khi destroy hàm chúng ta sẽ
include file vào
*/
$this->render = $file;
}
}
/**
* Lấy dữ liệu từ controller và lưu giữ vào dât
*
* @param $variable tên biến
* @param $value giá trị
*/
public function assign($variable , $value)
{
$this->data[$variable] = $value;
}
public function __destruct()
{
//Tạo biến data chứa dữ liệu
$data = $this->data;
//Include view
include($this->render);
}
}

View Model sẽ load và hiển thị dữ liệu lên, chúng ta có thể gán biến thông qua hàm assign.

Tại Sanpham Controller chúng ta sẽ gọi View Model

File sanpham.php thư mục controller sau khi thay đổi:

<?php
/**
* Đây là file điều khiển của trang sanpham
*/
class Sanpham_Controller
{
/**
* Tên template nằm trong thư mục 'views' trong mô hình MVC
* để hiện thông tin sản phẩm
*/
public $template = 'sanpham';
/**
* Đây là hàm mặc định sẽ được gọi từ router.php
*
* @param array $getVars chứa các biến GET từng trang index.php
*/
public function main(array $getVars)
{
$sanphamModel = new Sanpham_Model();
$sanpham = $sanphamModel->getSanphamById('1');
//Tạo 1 view mới, truyền vào template mà ta cần hiển thị
$viewModel = new View_Model($this->template);
//Truyển biến cho phần view
$viewModel->assign('tensp',$sanpham['tensp']);
$viewModel->assign('mota',$sanpham['mota']);
}
}

Truy cập vào http://localhost/mypham/index.php?sanpham&id=1

Chúng ta sẽ thấy nội dung file template HTML

Kết thúc Phần 1

Thank for sharing!

About The Author


NamPNQ

Không biết viết gì ở đây :D

Quảng cáo