Started to build out the store model and templates, also added dBug and the new Smarty var_dump.
git-svn-id: http://svn.cleancode.org/svn/pickles@38 4d10bc64-7434-11dc-a737-d2d0f8310089
This commit is contained in:
parent
68b925b213
commit
0f45997d55
16 changed files with 720 additions and 25 deletions
|
@ -5,10 +5,17 @@ define('PATH', getcwd() . '/');
|
||||||
|
|
||||||
function __autoload($class) {
|
function __autoload($class) {
|
||||||
$file = PATH . '../../pickles/classes/' . str_replace('_', '/', $class) . '.php';
|
$file = PATH . '../../pickles/classes/' . str_replace('_', '/', $class) . '.php';
|
||||||
|
|
||||||
if (file_exists($file)) {
|
if (file_exists($file)) {
|
||||||
require_once $file;
|
require_once $file;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
$file = PATH . '../../pickles/models/' . str_replace('_', '/', $class) . '.php';
|
||||||
|
|
||||||
|
if (file_exists($file)) {
|
||||||
|
require_once $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -4,6 +4,8 @@ class Config extends Singleton {
|
||||||
|
|
||||||
private static $instance;
|
private static $instance;
|
||||||
|
|
||||||
|
public $timestamp = null;
|
||||||
|
|
||||||
private function __construct() { }
|
private function __construct() { }
|
||||||
|
|
||||||
public static function getInstance() {
|
public static function getInstance() {
|
||||||
|
@ -22,32 +24,34 @@ class Config extends Singleton {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function load($site) {
|
public function load($site) {
|
||||||
// @todo no hardcoded paths!
|
if (!isset($this->file) || filemtime($this->file) > $this->timestamp) {
|
||||||
$file = '/var/www/josh/pickles/config/' . $site . '.xml';
|
// @todo no hardcoded paths!
|
||||||
|
$file = '/var/www/josh/pickles/config/' . $site . '.xml';
|
||||||
|
|
||||||
if (!isset($this->file) || $this->file != $file) {
|
if (!isset($this->file) || $this->file != $file) {
|
||||||
if (file_exists($file)) {
|
if (file_exists($file)) {
|
||||||
$this->file = $file;
|
$this->file = $file;
|
||||||
|
|
||||||
$config_array = ArrayUtils::object2array(simplexml_load_file($file));
|
$config_array = ArrayUtils::object2array(simplexml_load_file($file));
|
||||||
|
|
||||||
if (is_array($config_array)) {
|
if (is_array($config_array)) {
|
||||||
foreach ($config_array as $variable => $value) {
|
foreach ($config_array as $variable => $value) {
|
||||||
if ($value == 'true' || $value == array()) {
|
if ($value == 'true' || $value == array()) {
|
||||||
$value = (bool) $value;
|
$value = (bool) $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->$variable = $value == array() ? (bool) $value : $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->$variable = $value == array() ? (bool) $value : $value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->freeze();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Error::addError('Unable to load the configuration file');
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->freeze();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Error::addError('Unable to load the configuration file');
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,8 @@ class Controller extends Object {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Load the model
|
// Load the model
|
||||||
$file = '../models/' . $name . '.php';
|
$file = '../models/' . $name . '.php';
|
||||||
|
$shared_file = '../../pickles/models/' . $name . '.php';
|
||||||
|
|
||||||
if (strpos($name, '/') === false) {
|
if (strpos($name, '/') === false) {
|
||||||
$class = $name;
|
$class = $name;
|
||||||
|
@ -57,10 +58,16 @@ class Controller extends Object {
|
||||||
$this->model = new $class;
|
$this->model = new $class;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
elseif (file_exists($shared_file)) {
|
||||||
|
if (class_exists($class)) {
|
||||||
|
$this->model = new $class;
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
$this->model = new Model();
|
$this->model = new Model();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($this->model->get('auth') == false) {
|
if ($this->model->get('auth') == false) {
|
||||||
$this->model->set('auth', $this->config->get('behavior', 'auth'));
|
$this->model->set('auth', $this->config->get('behavior', 'auth'));
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ class Singleton {
|
||||||
|
|
||||||
public function freeze() {
|
public function freeze() {
|
||||||
$session = Session::getInstance();
|
$session = Session::getInstance();
|
||||||
|
$this->timestamp = time();
|
||||||
$class = get_class($this);
|
$class = get_class($this);
|
||||||
$session->$class = serialize($this);
|
$session->$class = serialize($this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,8 @@ class Viewer_Smarty extends Viewer_Common {
|
||||||
$smarty->load_filter('output','trimwhitespace');
|
$smarty->load_filter('output','trimwhitespace');
|
||||||
|
|
||||||
// Include custom Smarty functions
|
// Include custom Smarty functions
|
||||||
$directory = PATH . '../../common/smarty/functions/';
|
// @todo Stupid fucking hard coded path
|
||||||
|
$directory = PATH . '../../pickles/smarty/functions/';
|
||||||
|
|
||||||
if (is_dir($directory)) {
|
if (is_dir($directory)) {
|
||||||
if ($handle = opendir($directory)) {
|
if ($handle = opendir($directory)) {
|
||||||
|
@ -62,20 +63,33 @@ class Viewer_Smarty extends Viewer_Common {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$template = '../templates/' . $this->model->get('name') . '.tpl';
|
||||||
|
$shared_template = str_replace('../', '../../pickles/', $template);
|
||||||
|
|
||||||
|
if (!file_exists($template)) {
|
||||||
|
if (file_exists($shared_template)) {
|
||||||
|
$template = $shared_template;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Pass all of our controller values to Smarty
|
// Pass all of our controller values to Smarty
|
||||||
$smarty->assign('navigation', $navigation);
|
$smarty->assign('navigation', $navigation);
|
||||||
$smarty->assign('section', $this->model->get('section'));
|
$smarty->assign('section', $this->model->get('section'));
|
||||||
$smarty->assign('model', $this->model->get('name'));
|
$smarty->assign('model', $this->model->get('name'));
|
||||||
$smarty->assign('action', $this->model->get('action')); // @todo rename me to event...
|
$smarty->assign('action', $this->model->get('action')); // @todo rename me to event...
|
||||||
$smarty->assign('event', $this->model->get('action')); // but it almost seems like we don't need these anymore at all
|
$smarty->assign('event', $this->model->get('action')); // but it almost seems like we don't need these anymore at all
|
||||||
// Thanks to new naming conventions
|
|
||||||
|
// Thanks to new naming conventions
|
||||||
$smarty->assign('admin', $this->config->get('admin', 'sections'));
|
$smarty->assign('admin', $this->config->get('admin', 'sections'));
|
||||||
$smarty->assign('template', '../templates/' . $this->model->get('name') . '.tpl'); //$template);
|
$smarty->assign('template', $template);
|
||||||
|
|
||||||
// Only load the session if it's available
|
// Only load the session if it's available
|
||||||
|
// @todo not entirely sure that the view needs full access to the session (seems insecure at best)
|
||||||
|
/*
|
||||||
if (isset($_SESSION)) {
|
if (isset($_SESSION)) {
|
||||||
$smarty->assign('session', $_SESSION);
|
$smarty->assign('session', $_SESSION);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
$data = $this->model->getData();
|
$data = $this->model->getData();
|
||||||
|
|
||||||
|
|
|
@ -14,14 +14,32 @@
|
||||||
<admin>
|
<admin>
|
||||||
<menu>false</menu>
|
<menu>false</menu>
|
||||||
<sections>
|
<sections>
|
||||||
|
<news>News</news>
|
||||||
|
<faqs>FAQs</faqs>
|
||||||
<logout>Logout</logout>
|
<logout>Logout</logout>
|
||||||
</sections>
|
</sections>
|
||||||
</admin>
|
</admin>
|
||||||
|
<store>
|
||||||
|
<sections>
|
||||||
|
<home>Shopping Home</home>
|
||||||
|
<account>My Account</account>
|
||||||
|
<cart>View Cart / Checkout</cart>
|
||||||
|
<sale>What's on Sale?</sale>
|
||||||
|
<new>What's New?</new>
|
||||||
|
<terms>Shipping / Returns</terms>
|
||||||
|
</sections>
|
||||||
|
</store>
|
||||||
<contact>
|
<contact>
|
||||||
<subject>Ribbon Nutrition Contact Request</subject>
|
<subject>Ribbon Nutrition Contact Request</subject>
|
||||||
<response>Thank you. A member of our staff will respond to your message as soon as possible.</response>
|
<response>Thank you. A member of our staff will respond to your message as soon as possible.</response>
|
||||||
<recipients>
|
<recipients>
|
||||||
<recipient>joshsherman@gmail.com</recipient>
|
<recipient>joshsherman@gmail.com</recipient>
|
||||||
</recipients>
|
</recipients>
|
||||||
|
<blech>
|
||||||
|
(04:46:10 PM) Dekin Dorcas: sales@...
|
||||||
|
(04:46:27 PM) Dekin Dorcas: nutritionist@...
|
||||||
|
(04:46:33 PM) joshrecovery: w0rd
|
||||||
|
(04:46:46 PM) Dekin Dorcas: general inquiries will be info@...
|
||||||
|
</blech>
|
||||||
</contact>
|
</contact>
|
||||||
</config>
|
</config>
|
||||||
|
|
1
contrib/dBug
Symbolic link
1
contrib/dBug
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
/home/josh/Sites/pickles/contrib/dBug-1.2
|
531
contrib/dBug-1.2/dBug.php
Normal file
531
contrib/dBug-1.2/dBug.php
Normal file
|
@ -0,0 +1,531 @@
|
||||||
|
<?php
|
||||||
|
/*********************************************************************************************************************\
|
||||||
|
* LAST UPDATE
|
||||||
|
* ============
|
||||||
|
* March 22, 2007
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* AUTHOR
|
||||||
|
* =============
|
||||||
|
* Kwaku Otchere
|
||||||
|
* ospinto@hotmail.com
|
||||||
|
*
|
||||||
|
* Thanks to Andrew Hewitt (rudebwoy@hotmail.com) for the idea and suggestion
|
||||||
|
*
|
||||||
|
* All the credit goes to ColdFusion's brilliant cfdump tag
|
||||||
|
* Hope the next version of PHP can implement this or have something similar
|
||||||
|
* I love PHP, but var_dump BLOWS!!!
|
||||||
|
*
|
||||||
|
* FOR DOCUMENTATION AND MORE EXAMPLES: VISIT http://dbug.ospinto.com
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* PURPOSE
|
||||||
|
* =============
|
||||||
|
* Dumps/Displays the contents of a variable in a colored tabular format
|
||||||
|
* Based on the idea, javascript and css code of Macromedia's ColdFusion cfdump tag
|
||||||
|
* A much better presentation of a variable's contents than PHP's var_dump and print_r functions
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* USAGE
|
||||||
|
* =============
|
||||||
|
* new dBug ( variable [,forceType] );
|
||||||
|
* example:
|
||||||
|
* new dBug ( $myVariable );
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* if the optional "forceType" string is given, the variable supplied to the
|
||||||
|
* function is forced to have that forceType type.
|
||||||
|
* example: new dBug( $myVariable , "array" );
|
||||||
|
* will force $myVariable to be treated and dumped as an array type,
|
||||||
|
* even though it might originally have been a string type, etc.
|
||||||
|
*
|
||||||
|
* NOTE!
|
||||||
|
* ==============
|
||||||
|
* forceType is REQUIRED for dumping an xml string or xml file
|
||||||
|
* new dBug ( $strXml, "xml" );
|
||||||
|
*
|
||||||
|
\*********************************************************************************************************************/
|
||||||
|
|
||||||
|
class dBug {
|
||||||
|
|
||||||
|
var $xmlDepth=array();
|
||||||
|
var $xmlCData;
|
||||||
|
var $xmlSData;
|
||||||
|
var $xmlDData;
|
||||||
|
var $xmlCount=0;
|
||||||
|
var $xmlAttrib;
|
||||||
|
var $xmlName;
|
||||||
|
var $arrType=array("array","object","resource","boolean");
|
||||||
|
var $bInitialized = false;
|
||||||
|
var $bCollapsed = false;
|
||||||
|
var $arrHistory = array();
|
||||||
|
|
||||||
|
//constructor
|
||||||
|
function dBug($var,$forceType="",$bCollapsed=false) {
|
||||||
|
//include js and css scripts
|
||||||
|
if(!defined('BDBUGINIT')) {
|
||||||
|
define("BDBUGINIT", TRUE);
|
||||||
|
$this->initJSandCSS();
|
||||||
|
}
|
||||||
|
$arrAccept=array("array","object","xml"); //array of variable types that can be "forced"
|
||||||
|
$this->bCollapsed = $bCollapsed;
|
||||||
|
if(in_array($forceType,$arrAccept))
|
||||||
|
$this->{"varIs".ucfirst($forceType)}($var);
|
||||||
|
else
|
||||||
|
$this->checkType($var);
|
||||||
|
}
|
||||||
|
|
||||||
|
//get variable name
|
||||||
|
function getVariableName() {
|
||||||
|
$arrBacktrace = debug_backtrace();
|
||||||
|
|
||||||
|
//possible 'included' functions
|
||||||
|
$arrInclude = array("include","include_once","require","require_once");
|
||||||
|
|
||||||
|
//check for any included/required files. if found, get array of the last included file (they contain the right line numbers)
|
||||||
|
for($i=count($arrBacktrace)-1; $i>=0; $i--) {
|
||||||
|
$arrCurrent = $arrBacktrace[$i];
|
||||||
|
if(array_key_exists("function", $arrCurrent) &&
|
||||||
|
(in_array($arrCurrent["function"], $arrInclude) || (0 != strcasecmp($arrCurrent["function"], "dbug"))))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
$arrFile = $arrCurrent;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($arrFile)) {
|
||||||
|
$arrLines = file($arrFile["file"]);
|
||||||
|
$code = $arrLines[($arrFile["line"]-1)];
|
||||||
|
|
||||||
|
//find call to dBug class
|
||||||
|
preg_match('/\bnew dBug\s*\(\s*(.+)\s*\);/i', $code, $arrMatches);
|
||||||
|
|
||||||
|
return $arrMatches[1];
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
//create the main table header
|
||||||
|
function makeTableHeader($type,$header,$colspan=2) {
|
||||||
|
if(!$this->bInitialized) {
|
||||||
|
$header = $this->getVariableName() . " (" . $header . ")";
|
||||||
|
$this->bInitialized = true;
|
||||||
|
}
|
||||||
|
$str_i = ($this->bCollapsed) ? "style=\"font-style:italic\" " : "";
|
||||||
|
|
||||||
|
echo "<table cellspacing=2 cellpadding=3 class=\"dBug_".$type."\">
|
||||||
|
<tr>
|
||||||
|
<td ".$str_i."class=\"dBug_".$type."Header\" colspan=".$colspan." onClick='dBug_toggleTable(this)'>".$header."</td>
|
||||||
|
</tr>";
|
||||||
|
}
|
||||||
|
|
||||||
|
//create the table row header
|
||||||
|
function makeTDHeader($type,$header) {
|
||||||
|
$str_d = ($this->bCollapsed) ? " style=\"display:none\"" : "";
|
||||||
|
echo "<tr".$str_d.">
|
||||||
|
<td valign=\"top\" onClick='dBug_toggleRow(this)' class=\"dBug_".$type."Key\">".$header."</td>
|
||||||
|
<td>";
|
||||||
|
}
|
||||||
|
|
||||||
|
//close table row
|
||||||
|
function closeTDRow() {
|
||||||
|
return "</td></tr>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
//error
|
||||||
|
function error($type) {
|
||||||
|
$error="Error: Variable cannot be a";
|
||||||
|
// this just checks if the type starts with a vowel or "x" and displays either "a" or "an"
|
||||||
|
if(in_array(substr($type,0,1),array("a","e","i","o","u","x")))
|
||||||
|
$error.="n";
|
||||||
|
return ($error." ".$type." type");
|
||||||
|
}
|
||||||
|
|
||||||
|
//check variable type
|
||||||
|
function checkType($var) {
|
||||||
|
switch(gettype($var)) {
|
||||||
|
case "resource":
|
||||||
|
$this->varIsResource($var);
|
||||||
|
break;
|
||||||
|
case "object":
|
||||||
|
$this->varIsObject($var);
|
||||||
|
break;
|
||||||
|
case "array":
|
||||||
|
$this->varIsArray($var);
|
||||||
|
break;
|
||||||
|
case "NULL":
|
||||||
|
$this->varIsNULL();
|
||||||
|
break;
|
||||||
|
case "boolean":
|
||||||
|
$this->varIsBoolean($var);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$var=($var=="") ? "[empty string]" : $var;
|
||||||
|
echo "<table cellspacing=0><tr>\n<td>".$var."</td>\n</tr>\n</table>\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if variable is a NULL type
|
||||||
|
function varIsNULL() {
|
||||||
|
echo "NULL";
|
||||||
|
}
|
||||||
|
|
||||||
|
//if variable is a boolean type
|
||||||
|
function varIsBoolean($var) {
|
||||||
|
$var=($var==1) ? "TRUE" : "FALSE";
|
||||||
|
echo $var;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if variable is an array type
|
||||||
|
function varIsArray($var) {
|
||||||
|
$var_ser = serialize($var);
|
||||||
|
array_push($this->arrHistory, $var_ser);
|
||||||
|
|
||||||
|
$this->makeTableHeader("array","array");
|
||||||
|
if(is_array($var)) {
|
||||||
|
foreach($var as $key=>$value) {
|
||||||
|
$this->makeTDHeader("array",$key);
|
||||||
|
|
||||||
|
//check for recursion
|
||||||
|
if(is_array($value)) {
|
||||||
|
$var_ser = serialize($value);
|
||||||
|
if(in_array($var_ser, $this->arrHistory, TRUE))
|
||||||
|
$value = "*RECURSION*";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(in_array(gettype($value),$this->arrType))
|
||||||
|
$this->checkType($value);
|
||||||
|
else {
|
||||||
|
$value=(trim($value)=="") ? "[empty string]" : $value;
|
||||||
|
echo $value;
|
||||||
|
}
|
||||||
|
echo $this->closeTDRow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else echo "<tr><td>".$this->error("array").$this->closeTDRow();
|
||||||
|
array_pop($this->arrHistory);
|
||||||
|
echo "</table>";
|
||||||
|
}
|
||||||
|
|
||||||
|
//if variable is an object type
|
||||||
|
function varIsObject($var) {
|
||||||
|
$var_ser = serialize($var);
|
||||||
|
array_push($this->arrHistory, $var_ser);
|
||||||
|
$this->makeTableHeader("object","object");
|
||||||
|
|
||||||
|
if(is_object($var)) {
|
||||||
|
$arrObjVars=get_object_vars($var);
|
||||||
|
foreach($arrObjVars as $key=>$value) {
|
||||||
|
|
||||||
|
$value=(!is_object($value) && !is_array($value) && trim($value)=="") ? "[empty string]" : $value;
|
||||||
|
$this->makeTDHeader("object",$key);
|
||||||
|
|
||||||
|
//check for recursion
|
||||||
|
if(is_object($value)||is_array($value)) {
|
||||||
|
$var_ser = serialize($value);
|
||||||
|
if(in_array($var_ser, $this->arrHistory, TRUE)) {
|
||||||
|
$value = (is_object($value)) ? "*RECURSION* -> $".get_class($value) : "*RECURSION*";
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(in_array(gettype($value),$this->arrType))
|
||||||
|
$this->checkType($value);
|
||||||
|
else echo $value;
|
||||||
|
echo $this->closeTDRow();
|
||||||
|
}
|
||||||
|
$arrObjMethods=get_class_methods(get_class($var));
|
||||||
|
foreach($arrObjMethods as $key=>$value) {
|
||||||
|
$this->makeTDHeader("object",$value);
|
||||||
|
echo "[function]".$this->closeTDRow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else echo "<tr><td>".$this->error("object").$this->closeTDRow();
|
||||||
|
array_pop($this->arrHistory);
|
||||||
|
echo "</table>";
|
||||||
|
}
|
||||||
|
|
||||||
|
//if variable is a resource type
|
||||||
|
function varIsResource($var) {
|
||||||
|
$this->makeTableHeader("resourceC","resource",1);
|
||||||
|
echo "<tr>\n<td>\n";
|
||||||
|
switch(get_resource_type($var)) {
|
||||||
|
case "fbsql result":
|
||||||
|
case "mssql result":
|
||||||
|
case "msql query":
|
||||||
|
case "pgsql result":
|
||||||
|
case "sybase-db result":
|
||||||
|
case "sybase-ct result":
|
||||||
|
case "mysql result":
|
||||||
|
$db=current(explode(" ",get_resource_type($var)));
|
||||||
|
$this->varIsDBResource($var,$db);
|
||||||
|
break;
|
||||||
|
case "gd":
|
||||||
|
$this->varIsGDResource($var);
|
||||||
|
break;
|
||||||
|
case "xml":
|
||||||
|
$this->varIsXmlResource($var);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
echo get_resource_type($var).$this->closeTDRow();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
echo $this->closeTDRow()."</table>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
//if variable is a database resource type
|
||||||
|
function varIsDBResource($var,$db="mysql") {
|
||||||
|
if($db == "pgsql")
|
||||||
|
$db = "pg";
|
||||||
|
if($db == "sybase-db" || $db == "sybase-ct")
|
||||||
|
$db = "sybase";
|
||||||
|
$arrFields = array("name","type","flags");
|
||||||
|
$numrows=call_user_func($db."_num_rows",$var);
|
||||||
|
$numfields=call_user_func($db."_num_fields",$var);
|
||||||
|
$this->makeTableHeader("resource",$db." result",$numfields+1);
|
||||||
|
echo "<tr><td class=\"dBug_resourceKey\"> </td>";
|
||||||
|
for($i=0;$i<$numfields;$i++) {
|
||||||
|
$field_header = "";
|
||||||
|
for($j=0; $j<count($arrFields); $j++) {
|
||||||
|
$db_func = $db."_field_".$arrFields[$j];
|
||||||
|
if(function_exists($db_func)) {
|
||||||
|
$fheader = call_user_func($db_func, $var, $i). " ";
|
||||||
|
if($j==0)
|
||||||
|
$field_name = $fheader;
|
||||||
|
else
|
||||||
|
$field_header .= $fheader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$field[$i]=call_user_func($db."_fetch_field",$var,$i);
|
||||||
|
echo "<td class=\"dBug_resourceKey\" title=\"".$field_header."\">".$field_name."</td>";
|
||||||
|
}
|
||||||
|
echo "</tr>";
|
||||||
|
for($i=0;$i<$numrows;$i++) {
|
||||||
|
$row=call_user_func($db."_fetch_array",$var,constant(strtoupper($db)."_ASSOC"));
|
||||||
|
echo "<tr>\n";
|
||||||
|
echo "<td class=\"dBug_resourceKey\">".($i+1)."</td>";
|
||||||
|
for($k=0;$k<$numfields;$k++) {
|
||||||
|
$tempField=$field[$k]->name;
|
||||||
|
$fieldrow=$row[($field[$k]->name)];
|
||||||
|
$fieldrow=($fieldrow=="") ? "[empty string]" : $fieldrow;
|
||||||
|
echo "<td>".$fieldrow."</td>\n";
|
||||||
|
}
|
||||||
|
echo "</tr>\n";
|
||||||
|
}
|
||||||
|
echo "</table>";
|
||||||
|
if($numrows>0)
|
||||||
|
call_user_func($db."_data_seek",$var,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//if variable is an image/gd resource type
|
||||||
|
function varIsGDResource($var) {
|
||||||
|
$this->makeTableHeader("resource","gd",2);
|
||||||
|
$this->makeTDHeader("resource","Width");
|
||||||
|
echo imagesx($var).$this->closeTDRow();
|
||||||
|
$this->makeTDHeader("resource","Height");
|
||||||
|
echo imagesy($var).$this->closeTDRow();
|
||||||
|
$this->makeTDHeader("resource","Colors");
|
||||||
|
echo imagecolorstotal($var).$this->closeTDRow();
|
||||||
|
echo "</table>";
|
||||||
|
}
|
||||||
|
|
||||||
|
//if variable is an xml type
|
||||||
|
function varIsXml($var) {
|
||||||
|
$this->varIsXmlResource($var);
|
||||||
|
}
|
||||||
|
|
||||||
|
//if variable is an xml resource type
|
||||||
|
function varIsXmlResource($var) {
|
||||||
|
$xml_parser=xml_parser_create();
|
||||||
|
xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
|
||||||
|
xml_set_element_handler($xml_parser,array(&$this,"xmlStartElement"),array(&$this,"xmlEndElement"));
|
||||||
|
xml_set_character_data_handler($xml_parser,array(&$this,"xmlCharacterData"));
|
||||||
|
xml_set_default_handler($xml_parser,array(&$this,"xmlDefaultHandler"));
|
||||||
|
|
||||||
|
$this->makeTableHeader("xml","xml document",2);
|
||||||
|
$this->makeTDHeader("xml","xmlRoot");
|
||||||
|
|
||||||
|
//attempt to open xml file
|
||||||
|
$bFile=(!($fp=@fopen($var,"r"))) ? false : true;
|
||||||
|
|
||||||
|
//read xml file
|
||||||
|
if($bFile) {
|
||||||
|
while($data=str_replace("\n","",fread($fp,4096)))
|
||||||
|
$this->xmlParse($xml_parser,$data,feof($fp));
|
||||||
|
}
|
||||||
|
//if xml is not a file, attempt to read it as a string
|
||||||
|
else {
|
||||||
|
if(!is_string($var)) {
|
||||||
|
echo $this->error("xml").$this->closeTDRow()."</table>\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$data=$var;
|
||||||
|
$this->xmlParse($xml_parser,$data,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo $this->closeTDRow()."</table>\n";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//parse xml
|
||||||
|
function xmlParse($xml_parser,$data,$bFinal) {
|
||||||
|
if (!xml_parse($xml_parser,$data,$bFinal)) {
|
||||||
|
die(sprintf("XML error: %s at line %d\n",
|
||||||
|
xml_error_string(xml_get_error_code($xml_parser)),
|
||||||
|
xml_get_current_line_number($xml_parser)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//xml: inititiated when a start tag is encountered
|
||||||
|
function xmlStartElement($parser,$name,$attribs) {
|
||||||
|
$this->xmlAttrib[$this->xmlCount]=$attribs;
|
||||||
|
$this->xmlName[$this->xmlCount]=$name;
|
||||||
|
$this->xmlSData[$this->xmlCount]='$this->makeTableHeader("xml","xml element",2);';
|
||||||
|
$this->xmlSData[$this->xmlCount].='$this->makeTDHeader("xml","xmlName");';
|
||||||
|
$this->xmlSData[$this->xmlCount].='echo "<strong>'.$this->xmlName[$this->xmlCount].'</strong>".$this->closeTDRow();';
|
||||||
|
$this->xmlSData[$this->xmlCount].='$this->makeTDHeader("xml","xmlAttributes");';
|
||||||
|
if(count($attribs)>0)
|
||||||
|
$this->xmlSData[$this->xmlCount].='$this->varIsArray($this->xmlAttrib['.$this->xmlCount.']);';
|
||||||
|
else
|
||||||
|
$this->xmlSData[$this->xmlCount].='echo " ";';
|
||||||
|
$this->xmlSData[$this->xmlCount].='echo $this->closeTDRow();';
|
||||||
|
$this->xmlCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//xml: initiated when an end tag is encountered
|
||||||
|
function xmlEndElement($parser,$name) {
|
||||||
|
for($i=0;$i<$this->xmlCount;$i++) {
|
||||||
|
eval($this->xmlSData[$i]);
|
||||||
|
$this->makeTDHeader("xml","xmlText");
|
||||||
|
echo (!empty($this->xmlCData[$i])) ? $this->xmlCData[$i] : " ";
|
||||||
|
echo $this->closeTDRow();
|
||||||
|
$this->makeTDHeader("xml","xmlComment");
|
||||||
|
echo (!empty($this->xmlDData[$i])) ? $this->xmlDData[$i] : " ";
|
||||||
|
echo $this->closeTDRow();
|
||||||
|
$this->makeTDHeader("xml","xmlChildren");
|
||||||
|
unset($this->xmlCData[$i],$this->xmlDData[$i]);
|
||||||
|
}
|
||||||
|
echo $this->closeTDRow();
|
||||||
|
echo "</table>";
|
||||||
|
$this->xmlCount=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//xml: initiated when text between tags is encountered
|
||||||
|
function xmlCharacterData($parser,$data) {
|
||||||
|
$count=$this->xmlCount-1;
|
||||||
|
if(!empty($this->xmlCData[$count]))
|
||||||
|
$this->xmlCData[$count].=$data;
|
||||||
|
else
|
||||||
|
$this->xmlCData[$count]=$data;
|
||||||
|
}
|
||||||
|
|
||||||
|
//xml: initiated when a comment or other miscellaneous texts is encountered
|
||||||
|
function xmlDefaultHandler($parser,$data) {
|
||||||
|
//strip '<!--' and '-->' off comments
|
||||||
|
$data=str_replace(array("<!--","-->"),"",htmlspecialchars($data));
|
||||||
|
$count=$this->xmlCount-1;
|
||||||
|
if(!empty($this->xmlDData[$count]))
|
||||||
|
$this->xmlDData[$count].=$data;
|
||||||
|
else
|
||||||
|
$this->xmlDData[$count]=$data;
|
||||||
|
}
|
||||||
|
|
||||||
|
function initJSandCSS() {
|
||||||
|
echo <<<SCRIPTS
|
||||||
|
<script language="JavaScript">
|
||||||
|
/* code modified from ColdFusion's cfdump code */
|
||||||
|
function dBug_toggleRow(source) {
|
||||||
|
var target = (document.all) ? source.parentElement.cells[1] : source.parentNode.lastChild;
|
||||||
|
dBug_toggleTarget(target,dBug_toggleSource(source));
|
||||||
|
}
|
||||||
|
|
||||||
|
function dBug_toggleSource(source) {
|
||||||
|
if (source.style.fontStyle=='italic') {
|
||||||
|
source.style.fontStyle='normal';
|
||||||
|
source.title='click to collapse';
|
||||||
|
return 'open';
|
||||||
|
} else {
|
||||||
|
source.style.fontStyle='italic';
|
||||||
|
source.title='click to expand';
|
||||||
|
return 'closed';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function dBug_toggleTarget(target,switchToState) {
|
||||||
|
target.style.display = (switchToState=='open') ? '' : 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
function dBug_toggleTable(source) {
|
||||||
|
var switchToState=dBug_toggleSource(source);
|
||||||
|
if(document.all) {
|
||||||
|
var table=source.parentElement.parentElement;
|
||||||
|
for(var i=1;i<table.rows.length;i++) {
|
||||||
|
target=table.rows[i];
|
||||||
|
dBug_toggleTarget(target,switchToState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var table=source.parentNode.parentNode;
|
||||||
|
for (var i=1;i<table.childNodes.length;i++) {
|
||||||
|
target=table.childNodes[i];
|
||||||
|
if(target.style) {
|
||||||
|
dBug_toggleTarget(target,switchToState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
table.dBug_array,table.dBug_object,table.dBug_resource,table.dBug_resourceC,table.dBug_xml {
|
||||||
|
font-family:Verdana, Arial, Helvetica, sans-serif; color:#000000; font-size:12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dBug_arrayHeader,
|
||||||
|
.dBug_objectHeader,
|
||||||
|
.dBug_resourceHeader,
|
||||||
|
.dBug_resourceCHeader,
|
||||||
|
.dBug_xmlHeader
|
||||||
|
{ font-weight:bold; color:#FFFFFF; cursor:pointer; }
|
||||||
|
|
||||||
|
.dBug_arrayKey,
|
||||||
|
.dBug_objectKey,
|
||||||
|
.dBug_xmlKey
|
||||||
|
{ cursor:pointer; }
|
||||||
|
|
||||||
|
/* array */
|
||||||
|
table.dBug_array { background-color:#006600; }
|
||||||
|
table.dBug_array td { background-color:#FFFFFF; }
|
||||||
|
table.dBug_array td.dBug_arrayHeader { background-color:#009900; }
|
||||||
|
table.dBug_array td.dBug_arrayKey { background-color:#CCFFCC; }
|
||||||
|
|
||||||
|
/* object */
|
||||||
|
table.dBug_object { background-color:#0000CC; }
|
||||||
|
table.dBug_object td { background-color:#FFFFFF; }
|
||||||
|
table.dBug_object td.dBug_objectHeader { background-color:#4444CC; }
|
||||||
|
table.dBug_object td.dBug_objectKey { background-color:#CCDDFF; }
|
||||||
|
|
||||||
|
/* resource */
|
||||||
|
table.dBug_resourceC { background-color:#884488; }
|
||||||
|
table.dBug_resourceC td { background-color:#FFFFFF; }
|
||||||
|
table.dBug_resourceC td.dBug_resourceCHeader { background-color:#AA66AA; }
|
||||||
|
table.dBug_resourceC td.dBug_resourceCKey { background-color:#FFDDFF; }
|
||||||
|
|
||||||
|
/* resource */
|
||||||
|
table.dBug_resource { background-color:#884488; }
|
||||||
|
table.dBug_resource td { background-color:#FFFFFF; }
|
||||||
|
table.dBug_resource td.dBug_resourceHeader { background-color:#AA66AA; }
|
||||||
|
table.dBug_resource td.dBug_resourceKey { background-color:#FFDDFF; }
|
||||||
|
|
||||||
|
/* xml */
|
||||||
|
table.dBug_xml { background-color:#888888; }
|
||||||
|
table.dBug_xml td { background-color:#FFFFFF; }
|
||||||
|
table.dBug_xml td.dBug_xmlHeader { background-color:#AAAAAA; }
|
||||||
|
table.dBug_xml td.dBug_xmlKey { background-color:#DDDDDD; }
|
||||||
|
</style>
|
||||||
|
SCRIPTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
33
models/store.php
Normal file
33
models/store.php
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class store extends Model {
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
// Loads the navigation
|
||||||
|
$config = Config::getInstance();
|
||||||
|
$this->data['subnav'] = $config->get('store', 'sections');
|
||||||
|
|
||||||
|
// Loads the categories
|
||||||
|
$categories = $this->db->getArray('SELECT id, name FROM categories WHERE parent_id IS NULL AND visible = "Y" ORDER BY weight;');
|
||||||
|
if (is_array($categories)) {
|
||||||
|
foreach ($categories as $key => $category) {
|
||||||
|
$categories[$key]['subcategories'] = $this->db->getArray('SELECT id, name FROM categories WHERE parent_id = "' . $category['id'] . '" AND visible = "Y" ORDER BY weight;');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->data['categories'] = $categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __default() {
|
||||||
|
// Forces store/home as the first page you get when only /store is called
|
||||||
|
$object = new store_home();
|
||||||
|
$object->__default();
|
||||||
|
|
||||||
|
$this->set('name', 'store/home');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
14
models/store/home.php
Normal file
14
models/store/home.php
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class store_home extends store {
|
||||||
|
|
||||||
|
public function __construct() {
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __default() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
32
smarty/functions/function.var_dump.php
Executable file
32
smarty/functions/function.var_dump.php
Executable file
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
function smarty_function_var_dump($params, &$smarty) {
|
||||||
|
//$hidden = array('SCRIPT_NAME', 'navigation', 'section', 'model', 'action', 'event', 'admin', 'session', 'template');
|
||||||
|
$hidden = array();
|
||||||
|
$all_variables = $smarty->_tpl_vars;
|
||||||
|
$variables = array();
|
||||||
|
|
||||||
|
if (is_array($all_variables)) {
|
||||||
|
foreach ($all_variables as $name => $value) {
|
||||||
|
if (!in_array($name, $hidden)) {
|
||||||
|
$variables['$' . $name] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once 'contrib/dBug/dBug.php';
|
||||||
|
|
||||||
|
echo "
|
||||||
|
<style>
|
||||||
|
table, tr, td {
|
||||||
|
margin: 2px;
|
||||||
|
padding: 2px;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
";
|
||||||
|
|
||||||
|
new dBug($variables);
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
12
templates/store/categories.tpl
Normal file
12
templates/store/categories.tpl
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<div id="store-categories">
|
||||||
|
{foreach from=$categories item=category}
|
||||||
|
<div id="{$category.name|lower|replace:' ':'-'}">
|
||||||
|
<h1 id="">{$category.name}</h1>
|
||||||
|
</div>
|
||||||
|
<ul>
|
||||||
|
{foreach from=$category.subcategories item=subcategory}
|
||||||
|
<li><a href="/store/category/{$subcategory.name|regex_replace:'/&[a-z]+;/':''|replace:' ':' '|strip_tags:false|lower|replace:' ':'-'}">{$subcategory.name}</a></li>
|
||||||
|
{/foreach}
|
||||||
|
</ul><br />
|
||||||
|
{/foreach}
|
||||||
|
</div>
|
3
templates/store/featured_product.tpl
Normal file
3
templates/store/featured_product.tpl
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<div id="store-featured-product">
|
||||||
|
<h1>Featured Product</h1>
|
||||||
|
</div>
|
8
templates/store/home.tpl
Normal file
8
templates/store/home.tpl
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<div id="content-left">
|
||||||
|
{include file="../../pickles/templates/store/navigation.tpl"}<br /><br />
|
||||||
|
{include file="../../pickles/templates/store/categories.tpl"}
|
||||||
|
</div>
|
||||||
|
<div id="content-right">
|
||||||
|
{include file="../../pickles/templates/store/featured_product.tpl"}<br /><br />
|
||||||
|
{include file="../../pickles/templates/store/top_sellers.tpl"}
|
||||||
|
</div>
|
7
templates/store/navigation.tpl
Normal file
7
templates/store/navigation.tpl
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<div id="store-subnav">
|
||||||
|
<ol id="subnav">
|
||||||
|
{foreach from=$subnav key=link item=label}
|
||||||
|
<li {if $model == 'store/'|cat:$link}class="selected"{/if}><a href="/{$section}/{$link}">{$label}</a></li>
|
||||||
|
{/foreach}
|
||||||
|
</ol>
|
||||||
|
</div>
|
3
templates/store/top_sellers.tpl
Normal file
3
templates/store/top_sellers.tpl
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<div id="store-top-sellers">
|
||||||
|
<h1>Top Sellers</h1>
|
||||||
|
</div>
|
Loading…
Add table
Add a link
Reference in a new issue