انجمن عمومی گسترش فناوری آگو
ساخت یک نمونه ساده mvc - نسخه‌ی قابل چاپ

+- انجمن عمومی گسترش فناوری آگو (http://forums.ago.ir)
+-- انجمن: انجمن های عمومی گسترش فناوری آگو (/forumdisplay.php?fid=1)
+--- انجمن: برنامه نویسی (/forumdisplay.php?fid=13)
+--- موضوع: ساخت یک نمونه ساده mvc (/showthread.php?tid=2086)



ساخت یک نمونه ساده mvc - agotd - 02-05-2013 02:46 PM

index.php

کد php:
<?php
require_once('lib/DataAccess.php');
require_once(
'lib/ProductModel.php');
require_once(
'lib/ProductView.php');
require_once(
'lib/ProductController.php');
 
$dao=& new DataAccess ('localhost','user','pass','dbname');
$productModel=& new ProductModel($dao);
$productController=& new ProductController($productModel,$_GET);
echo 
$productController->display();
?>

lib/ProductView.php

کد php:
<?php
/**
 *  Binds product data to HTML rendering
 */
class ProductView {
    
/**
    * Private
    * $model an instance of the ProductModel class
    */
    
var $model;
 
    
/**
    * Private
    * $output rendered HTML is stored here for display
    */
    
var $output;
 
    
//! A constructor.
    /**
    * Constucts a new ProductView object
    * @param $model an instance of the ProductModel class
    */
    
function ProductView (&$model) {
        
$this->model=& $model;
    }
 
    
//! A manipulator
    /**
    * Builds the top of an HTML page
    * @return void
    */
    
function header () {
        
$this->output=
        <<<EOD
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> Our Products </title>
<style>
body { font-size: 13.75px; font-family: verdana }
td { font-size: 13.75px; font-family: verdana }
.title { font-size: 15.75px; font-weight: bold; font-family: verdana }
.heading {
    font-size: 13.75px; font-weight: bold;
    font-family: verdana; background-color: #f7f8f9 }
.nav { background-color: #f7f8f9 }
</style>
</head>
<body>
<div align="center" class="title">Our Products</div>
EOD;
        
$this->output.="\n<div align=\"right\"><a href=\"".
            
$_SERVER['PHP_SELF']."\">Start Over</a></div>\n";
 
    }
 
    
//! A manipulator
    /**
    * Builds the bottom of an HTML page
    * @return void
    */
    
function footer () {
        
$this->output.="</body>\n</html>";
    }
 
    
//! A manipulator
    /**
    * Displays a single product
    * @return void
    */
    
function productItem($id=1) {
        
$this->model->listProduct($id);
        while ( 
$product=$this->model->getProduct() ) {
            
$this->output.="<p><b>Name</b>:".$product['PRODUCTNAME']."</p>".
                
"<p><b>Price</b>:".$product['UNITPRICE']."</p>".
                
"<p><b># In Stock</b>:".$product['UNITSINSTOCK']."</p>";
            if ( 
$this->$product['DISCONTINUED']==) {
                
$this->output.="<p>This product has been discontinued.</p>";
            }
        }
    }
 
    
//! A manipulator
    /**
    * Builds a product table
    * @return void
    */
    
function productTable($rownum=1) {
        
$rowsperpage='20';
        
$this->model->listProducts($rownum,$rowsperpage);
        
$this->output.="<table width=\"600\" align=\"center\">\n<tr>\n".
                
"<td class=\"heading\">Name</td>\n".
                
"<td class=\"heading\">Price</td>\n</tr>\n";
        while ( 
$product=$this->model->getProduct() ) {
            
$this->output.="<tr>\n<td><a href=\"".$_SERVER['PHP_SELF'].
                
"?view=product&id=".$product['PRODUCTID']."\">".
                
$product['PRODUCTNAME']."</a></td>".
                
"<td>".$product['UNITPRICE']."</td>\n</tr>\n";
        }
        
$this->output.="<tr class=\"nav\">\n";
        if ( 
$rownum!=&& $rownum $rowsperpage ) {
            
$this->output.="<td><a href=\"".$_SERVER['PHP_SELF'].
                
"?view=table&rownum=".($rownum-$rowsperpage).
                
"\"><< Prev</a></td>";
        } else {
            
$this->output.="<td>&nbsp;</td>";           
        }
        if ( 
$product['PRODUCTID'] < ($rownum $rowsperpage) ) {
            
$this->output.="<td><a href=\"".$_SERVER['PHP_SELF'].
                
"?view=table&rownum=".($rownum+$rowsperpage).
                
"\">Next >></a></td>";
        } else {
            
$this->output.="<td>&nbsp;</td>\n";           
        }
        
$this->output.="</tr>\n</table>\n";
    }
 
    
//! An accessor
    /**
    * Returns the rendered HTML
    * @return string
    */
    
function display () {
        return 
$this->output;
    }
}
?>

lib/ProductController.php

کد php:
<?php
/**
 *  Controls the application
 */
class ProductController extends ProductView {
 
    
//! A constructor.
    /**
    * Constucts a new ProductController object
    * @param $model an instance of the ProductModel class
    * @param $getvars the incoming HTTP GET method variables
    */
    
function ProductController (&$model,$getvars=null) {
        
ProductView::ProductView($model);
        
$this->header();
        switch ( 
$getvars['view'] ) {
            case 
"product":
                
$this->productItem($getvars['id']);
                break;
            default:
                if ( empty (
$getvars['rownum']) ) {
                    
$this->productTable();
                } else {
                    
$this->productTable($getvars['rownum']);
                }
                break;
        }
        
$this->footer();
    }
}
?>

lib/ProductModel.php

کد php:
<?php
/**
 *  Fetches "products" from the database
 */
class ProductModel {
    
/**
    * Private
    * $dao an instance of the DataAccess class
    */
    
var $dao;
 
    
//! A constructor.
    /**
    * Constucts a new ProductModel object
    * @param $dbobject an instance of the DataAccess class
    */
    
function ProductModel (&$dao) {
        
$this->dao=& $dao;
    }
 
    
//! A manipulator
    /**
    * Tells the $dboject to store this query as a resource
    * @param $start the row to start from
    * @param $rows the number of rows to fetch
    * @return void
    */
    
function listProducts($start=1,$rows=50) {
        
$this->dao->fetch("SELECT * FROM products LIMIT ".$start.", ".$rows);
    }
 
    
//! A manipulator
    /**
    * Tells the $dboject to store this query as a resource
    * @param $id a primary key for a row
    * @return void
    */
    
function listProduct($id) {
        
$this->dao->fetch("SELECT * FROM products WHERE PRODUCTID='".$id."'");
    }
 
    
//! A manipulator
    /**
    * Fetches a product as an associative array from the $dbobject
    * @return mixed
    */
    
function getProduct() {
        if ( 
$product=$this->dao->getRow() )
            return 
$product;
        else
            return 
false;
    }
}
?>

Dataaccess.php

کد php:
<?php
/**
 *  A simple class for querying MySQL
 */
class DataAccess {
    
/**
    * Private
    * $db stores a database resource
    */
    
var $db;
    
/**
    * Private
    * $query stores a query resource
    */
    
var $query// Query resource
 
    //! A constructor.
    /**
    * Constucts a new DataAccess object
    * @param $host string hostname for dbserver
    * @param $user string dbserver user
    * @param $pass string dbserver user password
    * @param $db string database name
    */
    
function DataAccess ($host,$user,$pass,$db) {
        
$this->db=mysql_pconnect($host,$user,$pass);
        
mysql_select_db($db,$this->db);
    }
 
    
//! An accessor
    /**
    * Fetches a query resources and stores it in a local member
    * @param $sql string the database query to run
    * @return void
    */
    
function fetch($sql) {
        
$this->query=mysql_unbuffered_query($sql,$this->db); // Perform query here
    
}
 
    
//! An accessor
    /**
    * Returns an associative array of a query row
    * @return mixed
    */
    
function getRow () {
        if ( 
$row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
            return 
$row;
        else
            return 
false;
    }
}
?>