Up until now all of my websites have been written in very linear code (thanks QBASIC!) which has often caused me grief with repeating, messy and unweilding code. Every dynamic page has always had its own seperate .php file, and I never used functions.
I'm rewriting the entire site now using OOP with Smarty as the template engine and could really use some guidance.
Here is my current process:
1) Visitor hits on index.php?/view/fluffybunny. index.php is just a handler for the rest of the website:
// main config holds all database, sphinx and memcached settings
// and also connects to server
require_once '../config/site.cfg.php';
$urlPath = explode('/',$_GET['path']);
$page = new page($tpl,$db);
if (!empty($urlPath[1]))
{
switch ($urlPath[1])
{
case 'view': $page->view($urlPath); break;
case 'browse': $page->browse($urlPath); break;
case 'index': $page->index($urlPath); break;
default: $page->index($urlPath); break;
}
}
else
{
header('HTTP/1.0 404 Not Found'); // then 404 because we dont want seo issues
exit("File not found");
}
2) 'new page()' then fires off an autoloader to include page.class.php:
/* page Class
* Created by James Napier 16/05/2013
* Revision 0.1
*/
class page
{
private $tpl;
private $db;
public function __construct($tpl='',$db='') {
$this->tpl = $tpl;
$this->db = $db;
}
/*
* Displays index page
* Depending on URL it either displays a local index or countrywide index
*/
public function index($urlPath)
{
$locUrl = '';
if (!empty($urlPath[3])) //this is the location part
{
// init location class
$location = new location($this->db);
// check whether location exists
if($location->checkByUrl($urlPath[3]))
{
$locUrl = '/in/'.$urlPath[3]; // if it does add location suffix to urls
}
else
{
// if it doesnt, 404
header('HTTP/1.0 404 Not Found');
exit("File not found");
}
}
// assign location url to template
$this->tpl->assign('locUrl', $locUrl);
// homepage breadcrumbs
$this->tpl->assign('breadCrumbs',array(
array('title'=>'Site '.COUNTRY_CODE1, 'friendlyurl'=>'/'),
array('title'=>'Home', 'friendlyurl'=>'/')));
// Build the template and display it
$this->tpl->display('index.tpl');
}
/*
* Displays individual listing
* Uses the ID from the end of the URL to display the correct item
*/
public function view($urlPath)
{
$id = end($urlPath);
if (!empty($id))
{
// Retrieve the article from the database along with POINT values
$stmt = $this->db->prepare('SELECT *, X(locpoint) as x, Y(locpoint) as y FROM listing WHERE id = :id LIMIT 1');
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
if($listing = $stmt->fetch(PDO::FETCH_ASSOC))
{
// Deal with the article status
if ($listing['status'] == 'deleted')
{
$this->err404();
}
elseif ($listing['status'] == 'disabled')
{
$this->tpl->assign('bannerErr','THIS AD HAS EXPIRED AND IS PENDING DELETION');
}
elseif ($listing['status'] == 'pending')
{
$this->tpl->assign('bannerErr','THIS AD IS NOT YET ACTIVE AND IS BEING REVIEWED BY THE FLOGR TEAM');
}
// Start building the basic page vars from the results
$this->tpl->assign('itemID', $listing['id']);
$this->tpl->assign('itemTitle',$listing['title']);
$this->tpl->assign('itemDescription',$listing['description']);
$this->tpl->assign('itemShortDesc',$listing['shortdesc']);
// price
$this->tpl->assign('itemPrice', number_format($listing['price']));
$this->tpl->assign('itemPriceTag',$listing['pricetag']);
// location details
$this->tpl->assign('itemLatLng', $listing['x'].','.$listing['y']);
$this->tpl->assign('itemLocation', $listing['loctext']);
// contact details
$this->tpl->assign('itemContactName',$listing['name']);
$this->tpl->assign('itemContactNo', $listing['phone']);
$this->tpl->assign('itemContactType', $listing['type']);
// images
$this->tpl->assign('itemImages', json_decode($listing['images'], true));
// Retrieve the category info for breadcrumbs and titles
$getContent = new getContent();
// breadcrumbs
$this->tpl->assign('breadCrumbs',$getContent->breadCrumbs($listing['catid'],'/browse/', $this->db));
// Page and SEO titls
$this->tpl->assign('headTitle',$listing['title'].' located in '.$listing['loctext'].' | site.com');
$this->tpl->assign('headDesc', $listing['shortdesc']);
// Build the template and display it
$this->tpl->display('view_ad.tpl');
// Update hits and set viewed session var
$_SESSION['filter']['viewed'][] = $listing['id'];
$stmt = $this->db->query('UPDATE LOW_PRIORITY listing SET hits = hits+1 WHERE id = '.$listing['id']);
}
else
{
$this->err404();
}
}
else
{
$this->err404();
}
}
/*
* standard 404 error
*/
public function err404()
{
header('HTTP/1.0 404 Not Found');
exit("File not found");
}
}
So firstly my question is, can anybody see any obvious mistakes I'm making as a newbie to OOP?
Secondly, I have some large blocks of code that need to be run on every page (user authentication..etc) regardless of whether the index.php handler has called $page->index(), $page->view()...etc. How would I integrate this code into page.class.php?