Merging changes to trunk:

Revision: [1761]
Removing old db_acl.sql

Revision: [1759]
Removed unneeded calls to uses().
Changed basics.php listClasses() no longer using folder class.
Starting corrections in  DboPostgres class.
Adding missing DboPostgres::query().
Added missing doc blocks to AjaxHelper.
Fixed undefined keys in FormHelper::generateFields()
Reformatted FormHelper::generateFields() adding open and close brackets where needed

Revision: [1758]
Fixed typo

Revision: [1757]
Fixed errors found when using PHP 4.
Fixed a scaffold error

Revision: [1756]
Merging changes to model_php4.php

Revision: [1755]
Fixed scaffolding for the changes made to the model.
Fixed Model::isForeignKey(), replaced array_key_exists with in_array, other function was failing

Revision: [1754]
Committing changes from bundt model to beta.
DataSources will not be in the beta release

Revision: [1751]
Cleaning up a little more in the code.
Removing loading of log.php unless it is really needed.
Refactored dispatcher to speed up the stripslashes code if it is called

Revision: [1748]
removing all references to error_messages and deleting the file

Revision: [1747]
updated more error messages

Revision: [1746]
removing all error message defines

Revision: [1745]
added _() method from 1.0 to basics.php only used to return string right now

Revision: [1744]
Adding fix for ticket #220

Revision: [1743]
More work on ErrorHandler class

Revision: [1742]
Renaming error view for missing database connection

Revision: [1741]
More work on ErrorHandler class

Revision: [1740]
More work on error class

Revision: [1739]
Replacing all $_SERVER variable check with env() in basics.php

Revision: [1738]
Adding env() to basic

Revision: [1737]
Updated session to use env()

Revision: [1736]
Removing ternary operators from Dispatcher

Revision: [1735]
Per nates request I am rolling back ACL to [1373]

Revision: [1734]
Removed the IP in the session class this was not very reliable.
Added a time setting that generates current time adding the Security::inactiveMins() to the session
Removed code that was added to basics.php to replace gethostbyaddr().
Added CAKE_SESSION_STRING define to core.php which is used in the by the Session class to generate a hashed key.

Revision: [1733]
Moving errors messages to ErrorHandler class.
Updating errors view for use with new class.
Updating Scaffold to use new class.
Updated Dispatcher to use new class.
Removing methods from Object class

Revision: [1732]
Adding ErrorHandler class

Revision: [1731]
Adding fix for Ticket #223


git-svn-id: https://svn.cakephp.org/repo/trunk/cake@1762 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
phpnut 2006-01-12 02:10:47 +00:00
parent 93c65557a4
commit 677a39a445
53 changed files with 6568 additions and 2839 deletions

View file

@ -39,8 +39,7 @@
* release/app/.htaccess
* release/app/webroot/.htaccess
*/
//define ('BASE_URL', $_SERVER['SCRIPT_NAME']);
//define ('BASE_URL', env('SCRIPT_NAME');
/**
* Set debug level here:
@ -66,6 +65,12 @@ define('CAKE_SESSION_COOKIE', 'CAKEPHP');
*/
define('CAKE_SECURITY', 'high');
/**
* Set a random string of used in session.
*
*/
define('CAKE_SESSION_STRING', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
/**
* CakePHP includes 3 types of session saves
* database or file. Set this to your preffered method.

View file

@ -1,36 +0,0 @@
CREATE TABLE `acos` (
`id` int(11) NOT NULL auto_increment,
`object_id` int(11) default NULL,
`alias` varchar(255) NOT NULL default '',
`lft` int(11) default NULL,
`rght` int(11) default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `aros` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) default NULL,
`alias` varchar(255) NOT NULL default '',
`lft` int(11) default NULL,
`rght` int(11) default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `aros_acos` (
`id` int(11) NOT NULL auto_increment,
`aro_id` int(11) default NULL,
`aco_id` int(11) default NULL,
`create` tinyint(1) NOT NULL default '0',
`read` tinyint(1) NOT NULL default '0',
`update` tinyint(1) NOT NULL default '0',
`delete` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`id`)
);
CREATE TABLE `aco_actions` (
`id` int(11) NOT NULL auto_increment,
`aros_acos_id` int(11) default NULL,
`action` varchar(255) NOT NULL default '',
`value` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`id`)
);

View file

@ -67,7 +67,6 @@ require_once ROOT.'cake'.DS.'basics.php';
require_once ROOT.APP_DIR.DS.'config'.DS.'core.php';
require_once ROOT.'cake'.DS.'config'.DS.'paths.php';
require_once LIBS.'object.php';
require_once LIBS.'log.php';
require_once LIBS.'session.php';
require_once LIBS.'security.php';
require_once LIBS.'neat_array.php';
@ -121,9 +120,8 @@ if (DEBUG)
$TIME_START = getMicrotime();
uses('folder');
require_once CAKE.'dispatcher.php';
require_once LIBS.'model'.DS.'dbo'.DS.'dbo_factory.php';
require_once LIBS.'model'.DS.'connection_manager.php';
config('database');

View file

@ -59,7 +59,7 @@ if (!function_exists("ob_get_clean"))
* @uses APP
* @uses MODELS
*/
function loadModels ()
function loadModels()
{
if(!class_exists('AppModel'))
{
@ -71,9 +71,20 @@ function loadModels ()
{
require_once(CAKE.'app_model.php');
}
}
if (phpversion() < 5 && function_exists("overload"))
{
overload('AppModel');
}
foreach (listClasses(MODELS) as $model_fn)
{
require_once (MODELS.$model_fn);
if (phpversion() < 5 && function_exists("overload"))
{
list($name) = explode('.', $model_fn);
overload(Inflector::camelize($name));
}
}
}
@ -102,6 +113,38 @@ function loadView ($viewClass)
}
}
/**
* Loads a model by CamelCase name.
*
* @uses listModules()
* @uses APP
* @uses MODELS
*/
function loadModel($name)
{
$name = Inflector::underscore($name);
// Make sure AppModel is loaded
if(!class_exists('AppModel'))
{
if(file_exists(APP.'app_model.php'))
{
require_once(APP.'app_model.php');
}
else
{
require_once(CAKE.'app_model.php');
}
}
if(file_exists(MODELS.$name.'.php'))
{
require_once (MODELS.$name.'.php');
return true;
}
return false;
}
/**
* Loads all controllers.
@ -176,15 +219,24 @@ function loadController ($name)
}
/**
* Lists PHP files in given directory.
* Returns an array of filenames of PHP files in given directory.
*
* @param string $path Path to scan for files
* @return array List of files in directory
*/
function listClasses($path)
{
$modules = new Folder($path);
return $modules->find('(.+)\.php');
$dir = opendir($path);
while (false !== ($file = readdir($dir)))
{
if ((substr($file, -3, 3) == 'php'))
{
$classes[] = $file;
}
}
closedir($dir);
return $classes;
}
/**
@ -192,10 +244,9 @@ function listClasses($path)
*
* @return boolean Success
*/
function config ()
function config()
{
$args = func_get_args();
$count = count($args);
foreach ($args as $arg)
{
if (('database' == $arg) && file_exists(CONFIGS.$arg.'.php'))
@ -205,11 +256,17 @@ function config ()
elseif (file_exists(CONFIGS.$arg.'.php'))
{
include_once (CONFIGS.$arg.'.php');
if ($count == 1) return true;
if (count($args) == 1)
{
return true;
}
}
else
{
if ($count == 1) return false;
if (count($args) == 1)
{
return false;
}
}
}
@ -231,7 +288,7 @@ function uses ()
$args = func_get_args();
foreach ($args as $arg)
{
require_once(LIBS.strtolower($arg).'.php');
require_once(LIBS.low($arg).'.php');
}
}
@ -251,25 +308,31 @@ function vendor($name)
}
/**
* Print out debug information about given variable.
* Prints out debug information about given variable.
*
* Only runs if DEBUG level is non-zero.
*
* @param boolean $var Variable to show debug information for.
* @param boolean $show_html If set to true, the method prints the debug data in a screen-friendly way.
*/
function debug($var = false, $show_html = false)
function debug($var = false, $showHtml = false)
{
if (DEBUG)
{
print "\n<pre>\n";
if ($show_html) $var = str_replace('<', '&lt;', str_replace('>', '&gt;', $var));
ob_start();
print_r($var);
print "\n</pre>\n";
$var = ob_get_clean();
if ($showHtml)
{
$var = str_replace('<', '&lt;', str_replace('>', '&gt;', $var));
}
print "{$var}\n</pre>\n";
}
}
if (!function_exists('getMicrotime'))
{
/**
@ -295,17 +358,19 @@ if (!function_exists('sortByKey'))
* @param integer $type
* @return mixed
*/
function sortByKey(&$array, $sortby, $order='asc', $type=SORT_NUMERIC)
{
function sortByKey(&$array, $sortby, $order='asc', $type=SORT_NUMERIC)
{
if (!is_array($array))
{
return null;
}
foreach ($array as $key => $val)
{
$sa[$key] = $val[$sortby];
}
if($order == 'asc')
if ($order == 'asc')
{
asort($sa, $type);
}
@ -313,26 +378,29 @@ function sortByKey(&$array, $sortby, $order='asc', $type=SORT_NUMERIC)
{
arsort($sa, $type);
}
foreach ($sa as $key=>$val)
{
$out[] = $array[$key];
}
return $out;
}
}
}
if (!function_exists('array_combine'))
{
/**
* Combines given identical arrays by using the first array's values as keys,
* and the second one's values as values. (Implemented for back-compatibility with PHP4.)
* and the second one's values as values. (Implemented for back-compatibility
* with PHP4)
*
* @param array $a1
* @param array $a2
* @return mixed Outputs either combined array or false.
*/
function array_combine($a1, $a2)
{
function array_combine($a1, $a2)
{
$a1 = array_values($a1);
$a2 = array_values($a2);
$c1 = count($a1);
@ -348,12 +416,14 @@ function array_combine($a1, $a2)
}
$output = array();
for ($i = 0; $i < $c1; $i++)
{
$output[$a1[$i]] = $a2[$i];
}
return $output;
}
}
}
/**
@ -368,7 +438,17 @@ function h($text)
}
/**
* Returns an array of all the given parameters, making parameter lists shorter to write.
* Returns an array of all the given parameters.
*
* Example:
* <code>
* a('a', 'b')
* </code>
*
* Would return:
* <code>
* array('a', 'b')
* </code>
*
* @return array
*/
@ -379,28 +459,46 @@ function a()
}
/**
* Hierarchical arrays.
* Constructs associative array from pairs of arguments.
*
* Example:
* <code>
* aa('a','b')
* </code>
*
* Would return:
* <code>
* array('a'=>'b')
* </code>
*
* @return array
* @todo Explain this method better.
*/
function aa()
{
$args = func_get_args();
for ($l = 0, $c = count($args); $l < $c; $l++)
{
if ($l+1 < count($args))
{
$a[$args[$l]] = $args[$l+1];
}
else
{
$a[$args[$l]] = null;
}
$l++;
}
return $a;
}
/**
* @deprecated Renamed to aa(). Version 0.10.
*/
function ha()
{
$args = func_get_args();
$count = count($args);
for($i=0 ; $i < $count ; $i++)
{
if($i+1 < $count)
{
$a[$args[$i]] = $args[$i+1];
}
else
{
$a[$args[$i]] = null;
}
}
return $a;
return call_user_func_array('aa', $args);
}
/**
@ -413,11 +511,43 @@ function e($text)
echo $text;
}
/**
* Convenience method for strtolower().
*
* @param string $str String to lowercase
*/
function low($str)
{
return strtolower($str);
}
/**
* Convenience method for strtoupper().
*
* @param string $str String to uppercase
*/
function up($str)
{
return strtoupper($str);
}
/**
* Convenience method for str_replace().
*
* @param string $search String to be replaced
* @param string $replace String to insert
* @param string $subject String to search
*/
function r($search, $replace, $subject)
{
return str_replace($search, $replace, $subject);
}
/**
* Print_r convenience function, which prints out <PRE> tags around
* the output of given array. Similar to debug().
*
* @see debug
* @see debug()
* @param array $var
*/
function pr($var)
@ -438,14 +568,13 @@ function pr($var)
*/
function params($p)
{
if(!is_array($p) || count($p) == 0)
if (!is_array($p) || count($p) == 0)
{
return null;
}
else
{
if(is_array($p[0]) && count($p) == 1)
if (is_array($p[0]) && count($p) == 1)
{
return $p[0];
}
@ -458,43 +587,183 @@ function params($p)
}
/**
* Returns the REQUEST_URI from the server environment, or, failing that, constructs
* a new one, using the PHP_SELF constant and other variables.
* Returns the REQUEST_URI from the server environment, or, failing that,
* constructs a new one, using the PHP_SELF constant and other variables.
*
* @return string
* @return string URI
*/
function setUri()
{
if (isset($_SERVER['REQUEST_URI']))
if (env('REQUEST_URI'))
{
$uri = $_SERVER['REQUEST_URI'];
$uri = env('REQUEST_URI');
}
else
{
if (isset($_SERVER['argv']))
if (env('argv'))
{
$uri = $_SERVER['PHP_SELF'] .'/'. $_SERVER['argv'][0];
$uri = env('argv');
$uri = env('PHP_SELF') .'/'. $uri[0];
}
else
{
$uri = $_SERVER['PHP_SELF'] .'/'. $_SERVER['QUERY_STRING'];
$uri = env('PHP_SELF') .'/'. env('QUERY_STRING');
}
}
return $uri;
}
function gethost ($ip)
/**
* Gets an environment variable from available sources.
* Used as a backup if $_SERVER/$_ENV are disabled.
*
* @param string $key Environment variable name.
* @return string Environment variable setting.
*/
function env($key)
{
if (stristr(getenv('OS'), 'windows'))
if (isset($_SERVER[$key]))
{
$host = split('Name:',`nslookup $ip`);
return ( trim (isset($host[1]) ? str_replace ("\n".'Address: '.$ip, '', $host[1]) : $ip));
return $_SERVER[$key];
}
elseif (isset($_ENV[$key]))
{
return $_ENV[$key];
}
elseif (getenv($key) !== false)
{
return getenv($key);
}
return null;
}
if (!function_exists('file_get_contents'))
{
/**
* Returns contents of a file as a string.
*
* @param string $fileName Name of the file.
* @param boolean $useIncludePath Wheter the function should use the
* include path or not.
* @return mixed Boolean false or contents of required file.
*/
function file_get_contents($fileName, $useIncludePath = false)
{
$res = fopen($fileName, 'rb', $useIncludePath);
if ($res === false)
{
trigger_error('file_get_contents() failed to open stream: No such file or directory', E_USER_WARNING);
return false;
}
clearstatcache();
if ($fileSize = @filesize($fileName))
{
$data = fread($res, $fileSize);
}
else
{
$host = `host $ip`;
return (($host ? end ( explode (' ', $host)) : $ip));
$data = '';
while (!feof($res))
{
$data .= fread($res, 8192);
}
}
return "$data\n";
}
}
if (!function_exists('file_put_contents'))
{
/**
* Writes data into file.
*
* If file exists, it will be overwritten. If data is an array, it will be
* join()ed with an empty string.
*
* @param string $fileName File name.
* @param mixed $data String or array.
*/
function file_put_contents($fileName, $data)
{
if (is_array($data))
{
$data = join('', $data);
}
$res = @fopen($fileName, 'xb');
if ($res)
{
@fwrite($res, $data);
}
}
}
/**
* Reads/writes temporary data to cache files or session.
*
* @param string $path File path within /tmp to save the file.
* @param mixed $data The data to save to the temporary file.
* @param mixed $expires A valid strtotime string when the data expires.
* @param string $target The target of the cached data; either 'cache' or 'public'.
* @return mixed The contents of the temporary file.
*/
function cache($path, $data = null, $expires = '+1 day', $target = 'cache')
{
if (is_string($expires))
{
$expires = strtotime($expires);
}
switch (low($target))
{
case 'cache':
$filename = CACHE . $path;
break;
case 'public':
$filename = WWW_ROOT . $path;
break;
}
$now = time();
$timediff = $expires - $now;
$filetime = @filemtime($filename);
if ($data == null)
{
// Read data from file
if (file_exists($filename) && $filetime !== false)
{
if ($filetime + $timediff < $now)
{
// File has expired
@unlink($filename);
}
else
{
$data = file_get_contents($filename);
}
}
}
else
{
file_put_contents($filename, $data);
}
return $data;
}
/**
* Returns a translated string if one is found,
* or the submitted message if not found.
*
* @param unknown_type $msg
* @param unknown_type $return
* @return unknown
* @todo Not implemented in 0.10.x.x
*/
function __($msg, $return = null)
{
return $msg;
}
?>

View file

@ -187,15 +187,19 @@ define ('PEAR', VENDORS.'Pear'.DS);
* Full url prefix
*/
$s = null;
if ( (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] =='on' ))
$https = env('HTTPS');
if ( (isset($https) && $https =='on' ))
{
$s ='s';
}
if (isset($_SERVER['HTTP_HOST']))
{
define('FULL_BASE_URL', 'http'.$s.'://'.$_SERVER['HTTP_HOST']);
}
unset($https);
$httpHost = env('HTTP_HOST');
if (isset($httpHost))
{
define('FULL_BASE_URL', 'http'.$s.'://'.$httpHost);
}
unset($httpHost);
/**
* Web path to the public images directory.
*/

View file

@ -32,7 +32,7 @@
/**
* List of helpers to include
*/
uses('error_messages', 'router', DS.'controller'.DS.'controller');
uses('router', DS.'controller'.DS.'controller');
/**
* Dispatcher translates URLs to controller-action-paramter triads.
@ -123,7 +123,8 @@ class Dispatcher extends Object
{
if(preg_match('/([\\.]+)/',$ctrlName))
{
$this->error404(strtolower($ctrlName),'Was not found on this server');
return $this->cakeError('error404',array(array('url' => strtolower($ctrlName),
'message' => 'Was not found on this server')));
exit();
}
else
@ -136,17 +137,8 @@ class Dispatcher extends Object
if ($missingController)
{
$controller =& new Controller();
$params['action'] = 'missingController';
if (empty($params['controller']))
{
$params['controller'] = "Controller";
}
else
{
$params['controller'] = Inflector::camelize($params['controller']."Controller");
}
$controller->missingController = $params['controller'];
return $this->cakeError('missingController',array(array('className' => Inflector::camelize($params['controller']."Controller"),
'webroot' => $this->webroot)));
}
else
{
@ -195,22 +187,25 @@ class Dispatcher extends Object
if((in_array('scaffold', array_keys($classVars))) && ($missingAction === true))
{
uses(DS.'controller'.DS.'scaffold');
$scaffolding = new Scaffold($controller, $params);
exit;
return new Scaffold($controller, $params);
}
$controller->constructClasses();
if ($missingAction)
{
$controller->missingAction = $params['action'];
$params['action'] = 'missingAction';
return $this->cakeError('missingAction',
array(array('className' => Inflector::camelize($params['controller']."Controller"),
'action' => $params['action'],
'webroot' => $this->webroot)));
}
if ($privateAction)
{
$controller->privateAction = $params['action'];
$params['action'] = 'privateAction';
return $this->cakeError('privateAction',
array(array('className' => Inflector::camelize($params['controller']."Controller"),
'action' => $params['action'],
'webroot' => $this->webroot)));
}
return $this->_invoke($controller, $params );
@ -249,18 +244,47 @@ class Dispatcher extends Object
include CONFIGS.'routes.php';
$params = $Route->parse ($from_url);
// add submitted form data
$params['form'] = $_POST;
if (isset($_POST['data']))
if (ini_get('magic_quotes_gpc') == 1)
{
$params['data'] = (ini_get('magic_quotes_gpc') == 1)?
$this->stripslashes_deep($_POST['data']) : $_POST['data'];
if(!empty($_POST))
{
if(is_array($_POST))
{
$params['form'] = array_map('stripslashes', $_POST);
}
else
{
$params['form'] = stripcslashes($_POST);
}
}
}
else
{
$params['form'] = $_POST;
}
if (isset($params['form']['data']))
{
$params['data'] = $params['form']['data'];
}
if (isset($_GET))
{
$params['url'] = $this->urldecode_deep($_GET);
$params['url'] = (ini_get('magic_quotes_gpc') == 1)?
$this->stripslashes_deep($params['url']) : $params['url'];
if (ini_get('magic_quotes_gpc') == 1)
{
if(is_array($_GET))
{
$params['url'] = array_map('stripslashes', $_GET);
}
else
{
$params['url'] = stripcslashes($_GET);
}
}
else
{
$params['url'] = $_GET;
}
}
foreach ($_FILES as $name => $data)
@ -274,26 +298,6 @@ class Dispatcher extends Object
return $params;
}
/**
* Recursively strips slashes from given array.
*
*/
function stripslashes_deep($val)
{
return (is_array($val)) ?
array_map(array('Dispatcher','stripslashes_deep'), $val) : stripslashes($val);
}
/**
* Recursively performs urldecode on given array.
*
*/
function urldecode_deep($val)
{
return (is_array($val)) ?
array_map(array('Dispatcher','urldecode_deep'), $val) : urldecode($val);
}
/**
* Returns a base URL.
*
@ -309,8 +313,8 @@ class Dispatcher extends Object
$base = BASE_URL.$this->admin;
}
$docRoot = $_SERVER['DOCUMENT_ROOT'];
$scriptName = $_SERVER['PHP_SELF'];
$docRoot = env('DOCUMENT_ROOT');
$scriptName = env('PHP_SELF');
// If document root ends with 'webroot', it's probably correctly set
$r = null;
@ -361,36 +365,5 @@ class Dispatcher extends Object
}
return $base;
}
/**
* Displays an error page (e.g. 404 Not found).
*
* @param int $code Error code (e.g. 404)
* @param string $name Name of the error message (e.g. Not found)
* @param string $message
* @return unknown
*/
function error ($code, $name, $message)
{
$controller =& new Controller ($this);
$controller->base = $this->base;
$controller->autoLayout = true;
$controller->set(array('code'=>$code, 'name'=>$name, 'message'=>$message));
$controller->pageTitle = $code.' '. $name;
return $controller->render('errors/error404');
}
/**
* Convenience method to display a 404 page.
*
* @param string $url URL that spawned this message, to be included in the output.
* @param string $message Message text for the 404 page.
*/
function error404 ($url, $message)
{
header("HTTP/1.0 404 Not Found");
$this->error('404', 'Not found', sprintf(ERROR_404, $url, $message));
}
}
?>

View file

@ -39,8 +39,8 @@
* @subpackage cake.cake.libs
* @since CakePHP v 0.9.2
*/
class ClassRegistry
{
class ClassRegistry
{
/**
* Names of classes with their objects.
@ -55,8 +55,8 @@
*
* @return ClassRegistry instance
*/
function &getInstance() {
function &getInstance()
{
static $instance = array();
if (!$instance)
{
@ -73,11 +73,12 @@
*/
function addObject($key, &$object)
{
$_this =& ClassRegistry::getInstance();
$key = strtolower($key);
if (array_key_exists($key, $this->_objects) === false)
if (array_key_exists($key, $_this->_objects) === false)
{
$this->_objects[$key] =& $object;
$_this->_objects[$key] =& $object;
}
}
@ -89,8 +90,9 @@
*/
function isKeySet($key)
{
$_this =& ClassRegistry::getInstance();
$key = strtolower($key);
return array_key_exists($key, $this->_objects);
return array_key_exists($key, $_this->_objects);
}
/**
@ -102,7 +104,8 @@
function &getObject($key)
{
$key = strtolower($key);
return $this->_objects[$key];
$_this =& ClassRegistry::getInstance();
return $_this->_objects[$key];
}
}
?>

View file

@ -28,13 +28,6 @@
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
/**
* Enter description here...
*
* @return AclBase
*/
uses('error_messages');
/**
* Access Control List abstract class. Not to be instantiated.
* Subclasses of this class are used by AclComponent to perform ACL checks in Cake.
@ -57,7 +50,7 @@ class AclBase
//No instantiations or constructor calls (even statically)
if (strcasecmp(get_class($this), "AclBase") == 0 || !is_subclass_of($this, "AclBase"))
{
trigger_error(ERROR_ABSTRACT_CONSTRUCTION, E_USER_ERROR);
trigger_error(__("[acl_base] The AclBase class constructor has been called, or the class was instantiated. This class must remain abstract. Please refer to the Cake docs for ACL configuration."), E_USER_ERROR);
return NULL;
}
@ -70,10 +63,8 @@ class AclBase
* @param unknown_type $aco
* @param unknown_type $action
*/
function check($aro, $aco, $action = "*")
{
function check($aro, $aco, $action = "*") {}
}
}
?>

View file

@ -85,11 +85,6 @@ class DB_ACL extends AclBase
trigger_error('ACO permissions key "' . $action . '" does not exist in DB_ACL::check()', E_USER_ERROR);
}
if($aroPath == false || $aroPath == null || count($aroPath) == 0 || $tmpAcoPath == false || $tmpAcoPath == null || count($tmpAcoPath) == 0)
{
return null;
}
foreach($tmpAcoPath as $a)
{
$acoPath[] = $a['Aco']['id'];

View file

@ -1,4 +1,3 @@
CREATE TABLE `acos` (
`id` int(11) NOT NULL auto_increment,
`model` varchar(255) NOT NULL default '',

View file

@ -56,36 +56,29 @@ class AclNode extends AppModel
* Enter description here...
*
*/
function __construct($object = null, $parent = null)
function __construct()
{
parent::__construct();
$this->__setTable();
if($object != null)
{
$this->create($object, $parent);
}
exit();
}
/**
* Enter description here...
*
* @param unknown_type $object A new ACL object. This can be a string for alias-based ACL, or a Model for object-based ACL
* @param unknown_type $parent The parent object
* @param unknown_type $link_id
* @param unknown_type $parent_id
* @param unknown_type $alias
* @return unknown
*/
function create($object = null, $parent = null)
function create($link_id = 0, $parent_id = null, $alias = '')
{
if (strtolower(get_class($this)) == "aclnode")
{
trigger_error(ERROR_ABSTRACT_CONSTRUCTION, E_USER_ERROR);
return NULL;
}
parent::create();
pr($this->__dataVars());
exit();
if (strtolower(get_class($this)) == "aclnode")
{
trigger_error(__("[acl_base] The AclBase class constructor has been called, or the class was instantiated. This class must remain abstract. Please refer to the Cake docs for ACL configuration."), E_USER_ERROR);
return NULL;
}
extract($this->__dataVars());
if($parent_id == null || $parent_id === 0)
@ -134,7 +127,7 @@ class AclNode extends AppModel
{
if (strtolower(get_class($this)) == "aclnode")
{
trigger_error(ERROR_ABSTRACT_CONSTRUCTION, E_USER_ERROR);
trigger_error(__("[acl_base] The AclBase class constructor has been called, or the class was instantiated. This class must remain abstract. Please refer to the Cake docs for ACL configuration."), E_USER_ERROR);
return null;
}
extract($this->__dataVars());
@ -213,16 +206,16 @@ class AclNode extends AppModel
}
/**
* The path to a node as an array, where the first element of the array is at the root of the tree, and the last element is the requested node
* Enter description here...
*
* @param mixed $id
* @return array
* @param unknown_type $id
* @return unknown
*/
function getPath($id)
{
if (strtolower(get_class($this)) == "aclnode")
{
trigger_error(ERROR_ABSTRACT_CONSTRUCTION, E_USER_ERROR);
trigger_error(__("[acl_base] The AclBase class constructor has been called, or the class was instantiated. This class must remain abstract. Please refer to the Cake docs for ACL configuration."), E_USER_ERROR);
return NULL;
}
extract($this->__dataVars());
@ -236,16 +229,16 @@ class AclNode extends AppModel
}
/**
* Gets the child nodes of a specified element
* Enter description here...
*
* @param mixed $id
* @return array
* @param unknown_type $id
* @return unknown
*/
function getChildren($id)
{
if (strtolower(get_class($this)) == "aclnode")
{
trigger_error(ERROR_ABSTRACT_CONSTRUCTION, E_USER_ERROR);
trigger_error(__("[acl_base] The AclBase class constructor has been called, or the class was instantiated. This class must remain abstract. Please refer to the Cake docs for ACL configuration."), E_USER_ERROR);
return NULL;
}
extract($this->__dataVars());
@ -255,57 +248,32 @@ class AclNode extends AppModel
}
/**
* Gets a reference to a node object
* Enter description here...
*
* @param unknown_type $obj
* @param unknown_type $id
* @param unknown_type $fKey
* @return unknown
*/
function _resolveID($obj, $fKey)
function _resolveID($id, $fKey)
{
extract($this->__dataVars());
if(is_object($obj))
{
if(isset($obj->id) && isset($obj->name))
{
return "model = '{$obj->name}' and {$secondary_id} = {$obj->id}";
}
return null;
}
else if(is_array($obj))
{
$keys = array_keys($obj);
$key1 = $keys[0];
if(is_string($key1) && is_array($obj[$key1]) && isset($obj[$key1]['id']))
{
return "model = '{$key1}' and {$secondary_id} = {$obj[$key1]['id']}";
}
return null;
}
else if(is_string($obj))
{
$path = explode('/', $obj);
}
$key = (is_string($id) ? 'alias' : $fKey);
$val = (is_string($id) ? '"' . addslashes($id) . '"' : $id);
return "{$key} = {$val}";
}
/**
* Private method: modifies the left and right values of affected nodes in a tree when a node is added or removed
* Enter description here...
*
* @param string $table aros or acos, depending on the tree to be modified
* @param int $dir The direction in which to shift the nodes
* @param int $lft The left position of the node being added or removed
* @param int $rght The right position of the node being added or removed
* @param unknown_type $table
* @param unknown_type $dir
* @param unknown_type $lft
* @param unknown_type $rght
*/
function _syncTable($table, $dir, $lft, $rght)
{
$shift = ($dir == 2 ? 1 : 2);
$table = strtolower($table);
$this->db->query("UPDATE {$table} SET rght = rght " . ($dir > 0 ? "+" : "-") . " {$shift} WHERE rght > " . $rght);
$this->db->query("UPDATE {$table} SET lft = lft " . ($dir > 0 ? "+" : "-") . " {$shift} WHERE lft > " . $lft);
$this->db->query("UPDATE $table SET rght = rght " . ($dir > 0 ? "+" : "-") . " {$shift} WHERE rght > " . $rght);
$this->db->query("UPDATE $table SET lft = lft " . ($dir > 0 ? "+" : "-") . " {$shift} WHERE lft > " . $lft);
}
/**

View file

@ -149,14 +149,6 @@ class Controller extends Object
*/
var $autoLayout = true;
/**
* Database configuration to use (see /config/database.php)
*
* @var string
* @access public
*/
var $useDbConfig = 'default';
/**
* Enter description here...
*
@ -218,9 +210,6 @@ class Controller extends Object
*/
function constructClasses()
{
$dboFactory = DboFactory::getInstance($this->useDbConfig);
$this->db =& $dboFactory;
if (!empty($this->components))
{
$component =& new Component($this);
@ -263,11 +252,6 @@ class Controller extends Object
}
elseif ($this->uses)
{
if (!$this->db)
{
die("Controller::__construct() : ".$this->name." controller needs database access, exiting.");
}
$uses = is_array($this->uses)? $this->uses: array($this->uses);
foreach ($uses as $modelClass)
@ -281,7 +265,8 @@ class Controller extends Object
}
else
{
die("Controller::__construct() : ".ucfirst($this->name)." requires missing model {$modelClass}, exiting.");
return $this->cakeError('missingTable',array(array('className' => $modelClass,
'webroot' => '')));
}
}
}
@ -494,11 +479,10 @@ class Controller extends Object
$model = $this->modelClass;
$modelKey = $this->modelKey;
$table = $this->{$model}->table;
$table = $this->{$model}->source;
$association = array_search($table,$this->{$model}->alias);
$classRegistry =& ClassRegistry::getInstance();
$objRegistryModel = $classRegistry->getObject($modelKey);
$objRegistryModel = ClassRegistry::getObject($modelKey);
foreach ($objRegistryModel->_tableInfo as $tables)
{
@ -506,7 +490,7 @@ class Controller extends Object
{
$alias = null;
// set up the prompt
if( $objRegistryModel->isForeignKey($tabl['name']) )
if ($objRegistryModel->isForeignKey($tabl['name']))
{
$niceName = substr( $tabl['name'], 0, strpos( $tabl['name'], "_id" ) );
$fieldNames[ $tabl['name'] ]['prompt'] = Inflector::humanize($niceName);
@ -541,7 +525,7 @@ class Controller extends Object
$fieldNames[ $tabl['name']]['tagName'] = $model.'/'.$tabl['name'];
// Now, find out if this is a required field.
//$validationFields = $classRegistry->getObject($table)->validate;
//$validationFields = ClassRegistry::getObject($table)->validate;
$validationFields = $objRegistryModel->validate;
if( isset( $validationFields[ $tabl['name'] ] ) )
{
@ -580,29 +564,28 @@ class Controller extends Object
case "varchar":
case "char":
{
if( isset( $fieldNames[ $tabl['name']]['foreignKey'] ) )
if (isset($fieldNames[ $tabl['name']]['foreignKey']))
{
$fieldNames[ $tabl['name']]['type'] = 'select';
// This is a foreign key select dropdown box. now, we have to add the options.
$fieldNames[ $tabl['name']]['options'] = array();
// get the list of options from the other model.
$registry = ClassRegistry::getInstance();
$otherModel = $registry->getObject(Inflector::underscore($fieldNames[$tabl['name']]['modelKey']));
$otherModel = ClassRegistry::getObject(Inflector::underscore($fieldNames[$tabl['name']]['modelKey']));
if( is_object($otherModel) )
if (is_object($otherModel))
{
if( $doCreateOptions )
if ($doCreateOptions)
{
$otherDisplayField = $otherModel->getDisplayField();
foreach( $otherModel->findAll() as $pass )
foreach ($otherModel->findAll() as $pass)
{
foreach( $pass as $key=>$value )
foreach ($pass as $key => $value)
{
if( $alias.$key == $this->{$model}->tableToModel[$fieldNames[ $tabl['name'] ]['table']] && isset( $value[$otherModel->primaryKey] ) && isset( $value[$otherDisplayField] ) )
if($alias.$key == $this->{$model}->tableToModel[$fieldNames[ $tabl['name'] ]['table']] && isset( $value['id'] ) && isset( $value[$otherDisplayField]))
{
$fieldNames[ $tabl['name']]['options'][$value[$otherModel->primaryKey]] = $value[$otherDisplayField];
$fieldNames[ $tabl['name']]['options'][$value['id']] = $value[$otherDisplayField];
}
}
}
@ -641,7 +624,7 @@ class Controller extends Object
// for foreign key autonumber fields, we'll set the type to 'key' so that it does not display in the input form.
$charCount = strlen($this->$model->primaryKey);
if( 0 == strncmp($tabl['name'], $this->$model->primaryKey, $charCount) )
if(0 == strncmp($tabl['name'], $this->$model->primaryKey, $charCount))
{
$fieldNames[ $tabl['name']]['type'] = 'hidden';
}
@ -652,19 +635,18 @@ class Controller extends Object
$fieldNames[ $tabl['name']]['options'] = array();
// get the list of options from the other model.
$registry = ClassRegistry::getInstance();
$otherModel = $registry->getObject(Inflector::underscore($fieldNames[$tabl['name']]['modelKey']));
$otherModel = ClassRegistry::getObject(Inflector::underscore($fieldNames[$tabl['name']]['modelKey']));
if( is_object($otherModel) )
{
if( $doCreateOptions )
{
$otherDisplayField = $otherModel->getDisplayField();
foreach( $otherModel->findAll() as $pass )
foreach($otherModel->findAll() as $pass)
{
foreach( $pass as $key=>$value )
foreach($pass as $key => $value)
{
if( $alias.$key == $this->{$model}->tableToModel[$fieldNames[ $tabl['name'] ]['table']] && isset( $value[$otherModel->primaryKey] ) && isset( $value[$otherDisplayField] ) )
if( $alias.$key == $this->{$model}->tableToModel[$fieldNames[ $tabl['name'] ]['table']] && isset($value[$otherModel->primaryKey]) && isset($value[$otherDisplayField]))
{
$fieldNames[ $tabl['name']]['options'][$value[$otherModel->primaryKey]] = $value[$otherDisplayField];
}
@ -700,15 +682,17 @@ class Controller extends Object
case "date":
case "datetime":
{
if( 0 != strncmp( "created", $tabl['name'], 6 ) && 0 != strncmp("modified",$tabl['name'], 8) )
if(0 != strncmp( "created", $tabl['name'], 6 ) && 0 != strncmp("modified",$tabl['name'], 8))
{
$fieldNames[ $tabl['name']]['type'] = $type;
}
if(isset($data[$model][$tabl['name']]))
{
$fieldNames[ $tabl['name']]['selected'] = $data[$model][$tabl['name']];
}
else
{
$fieldNames[ $tabl['name']]['selected'] = null;
$ieldNames[ $tabl['name']]['selected'] = null;
}
}
break;
@ -721,14 +705,14 @@ class Controller extends Object
}
// now, add any necessary hasAndBelongsToMany list boxes
// loop through the many to many relations to make a list box.
foreach( $objRegistryModel->_manyToMany as $relation )
foreach($objRegistryModel->hasAndBelongsToMany as $relation => $relData)
{
//list($modelName) = $relation;
list($manyAssociation, $modelName, $value) = $relation;
$modelName = $relData['className'];
$manyAssociation = $relation;
$modelKeyM = Inflector::underscore($modelName);
$modelObject = new $modelName();
if( $doCreateOptions )
if($doCreateOptions)
{
$otherDisplayField = $modelObject->getDisplayField();
$fieldNames[$modelKeyM]['model'] = $modelName;
@ -736,11 +720,11 @@ class Controller extends Object
$fieldNames[$modelKeyM]['type'] = "selectMultiple";
$fieldNames[$modelKeyM]['tagName'] = $manyAssociation.'/'.$manyAssociation;
foreach( $modelObject->findAll() as $pass )
foreach($modelObject->findAll() as $pass)
{
foreach( $pass as $key=>$value )
foreach($pass as $key=>$value)
{
if( $key == $modelName && isset( $value[$modelObject->primaryKey] ) && isset( $value[$otherDisplayField] ) )
if($key == $modelName && isset($value[$modelObject->primaryKey]) && isset( $value[$otherDisplayField]))
{
$fieldNames[$modelKeyM]['options'][$value[$modelObject->primaryKey]] = $value[$otherDisplayField];
}
@ -759,6 +743,6 @@ class Controller extends Object
return $fieldNames;
}
}
}
?>

View file

@ -356,11 +356,9 @@ class Scaffold extends Object {
$this->controllerClass->helpers[] = 'Form';
}
$isDataBaseSet = DboFactory::getInstance($this->controllerClass->useDbConfig);
if(!empty($isDataBaseSet))
{
$this->controllerClass->constructClasses();
if(isset($this->controllerClass->{$this->modelKey}->ds))
{
if($params['action'] === 'index' || $params['action'] === 'list' ||
$params['action'] === 'show' || $params['action'] === 'add' ||
$params['action'] === 'create' || $params['action'] === 'edit' ||
@ -403,18 +401,16 @@ class Scaffold extends Object {
}
else
{
$this->controllerClass->layout = 'default';
$this->controllerClass->missingAction = $params['action'];
call_user_func_array(array($this->controllerClass, 'missingAction'), null);
exit;
return $this->cakeError('missingAction',
array(array('className' => Inflector::camelize($params['controller']."Controller"),
'action' => $params['action'],
'webroot' => $this->controllerClass->webroot)));
}
}
else
{
$this->controllerClass->constructClasses();
$this->controllerClass->layout = 'default';
call_user_func_array(array($this->controllerClass, 'missingDatabase'), null);
exit;
return $this->cakeError('missingDatabase',
array(array('webroot' => $this->controllerClass->webroot)));
}
}

207
cake/libs/error.php Normal file
View file

@ -0,0 +1,207 @@
<?php
/* SVN FILE: $Id$ */
/**
* Short description for file.
*
* Long description for file
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright (c) 2005, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs
* @since CakePHP v 0.10.5.1732
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
/**
* Short description for file.
*
* Long description for file
*
* @package cake
* @subpackage cake.cake.libs
* @since CakePHP v 0.10.5.1732
*/
class ErrorHandler extends Object
{
var $controller = null;
/**
* Class constructor.
*/
function __construct($method, $messages)
{
$this->controller =& new Controller();
if(DEBUG > 0)
{
call_user_func_array(array(&$this, $method), $messages);
}
else
{
call_user_func_array(array(&$this, 'error404'), $messages);
}
}
/**
* Displays an error page (e.g. 404 Not found).
*
* @param int $code Error code (e.g. 404)
* @param string $name Name of the error message (e.g. Not found)
* @param string $message
* @return unknown
*/
function error ($params)
{
extract($params);
$this->controller->webroot = $this->_webroot();
$this->controller->set(array('code'=>$code,
'name'=>$name,
'message'=>$message,
'title' => $code.' '. $name));
$this->controller->render('../errors/error404');
}
/**
* Convenience method to display a 404 page.
*
* @param string $url URL that spawned this message, to be included in the output.
* @param string $message Message text for the 404 page.
*/
function error404 ($params)
{
extract($params);
if(!isset($url))
{
$url = $action;
}
if(!isset($message))
{
$message = '';
}
header("HTTP/1.0 404 Not Found");
$this->error(array('code'=>'404',
'name'=>'Not found',
'message'=>sprintf(__("The requested address %s was not found on this server."), $url, $message)));
}
/**
* Renders the Missing Controller web page.
*
*/
function missingController($params)
{
extract($params);
$this->controller->webroot = $webroot;
$this->controller->set(array('controller' => $className,
'title' => 'Missing Controller'));
$this->controller->render('../errors/missingController');
}
/**
* Renders the Missing Action web page.
*
*/
function missingAction($params)
{
extract($params);
$this->controller->webroot = $webroot;
$this->controller->set(array('controller' => $className,
'action' => $action,
'title' => 'Missing Method in Controller'));
$this->controller->render('../errors/missingAction');
}
/**
* Renders the Private Action web page.
*
*/
function privateAction($params)
{
extract($params);
$this->controller->webroot = $webroot;
$this->controller->set(array('controller' => $className,
'action' => $action,
'title' => 'Trying to access private method in class'));
$this->controller->render('../errors/privateAction');
}
/**
* Renders the Missing Table web page.
*
*/
function missingTable($params)
{
extract($params);
$this->controller->webroot = $this->_webroot();
$this->controller->set(array('model' => $className,
'table' => $table,
'title' => 'Missing Database Table'));
$this->controller->render('../errors/missingTable');
exit();
}
/**
* Renders the Missing Database web page.
*
*/
function missingDatabase($params)
{
extract($params);
$this->controller->webroot = $webroot;
$this->controller->set(array('title' => 'Scaffold Missing Database Connection'));
$this->controller->render('../errors/missingScaffolddb');
}
/**
* Renders the Missing View web page.
*
*/
function missingView($params)
{
extract($params);
$this->controller->webroot = $webroot;
$this->controller->set(array('controller' => $className,
'action' => $action,
'title' => 'Missing View'));
$this->controller->render('../errors/missingView');
}
/**
* Renders the Missing Table web page.
*
*/
function missingConnection($params)
{
extract($params);
$this->controller->webroot = $this->_webroot();
$this->controller->set(array('model' => $className,
'title' => 'Missing Database Connection'));
$this->controller->render('../errors/missingConnection');
exit();
}
function _webroot()
{
$dispatcher =& new Dispatcher();
$dispatcher->baseUrl();
return $dispatcher->webroot;
}
}
?>

View file

@ -1,117 +0,0 @@
<?php
/* SVN FILE: $Id$ */
/**
* Error Messages Defines
*
* Longer, human-readable error messages for Cake operation errors to be displayed
* to end-users.
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright (c) 2005, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs
* @since CakePHP v 0.2.9
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
/**
* Error string for when the specified database driver can not be found.
*/
define ('ERROR_UNKNOWN_DATABASE_DRIVER', '[DbFactory] Specified database driver (%s) not found');
/**
* Error string for when the dispatcher can not find a default controller.
*/
define ('ERROR_NO_CONTROLLER_SET', '[Dispatcher] No default controller, can\'t continue, check routes config');
/**
* Error string for when the dispatcher can not find a default action.
*/
define ('ERROR_NO_ACTION_SET', '[Dispatcher] No default action, can\'t continue, check routes config');
/**
* Error string for when the dispatcher can not find given controller.
*/
define ('ERROR_UNKNOWN_CONTROLLER', '[Dispatcher] Specified controller "%s" doesn\'t exist, create it first');
/**
* Error string for when the dispatcher can not find expected action in controller.
*/
define ('ERROR_NO_ACTION', '[Dispatcher] Action "%s" is not defined in the "%s" controller, create it first');
/**
* Error string for errors in view.
*/
define ('ERROR_IN_VIEW', '[Controller] Error in view "%s", got: <blockquote>%s</blockquote>');
/**
* Error string for when the controller can not find expected view.
*/
define ('ERROR_NO_VIEW', '[Controller] No template file for view "%s" (expected "%s"), create it first');
/**
* Error string for errors in layout.
*/
define ('ERROR_IN_LAYOUT', '[Controller] Error in layout "%s", got: <blockquote>"%s"</blockquote>');
/**
* Error string for when the controller can not find expected layout.
*/
define ('ERROR_NO_LAYOUT', '[Controller] Couln\'t find layout "%s" (expected "%s"), create it first');
/**
* Error string for database not being able to access the table list.
*/
define ('ERROR_NO_TABLE_LIST', '[Database] Couldn\'t get table list, check database config');
/**
* Error string for no corresponding database table found for model.
*/
define ('ERROR_NO_MODEL_TABLE', '[Model] No DB table for model "%s" (expected "%s"), create it first');
/**
* Error string for Field not present in table.
*/
define ('ERROR_NO_FIELD_IN_MODEL_DB', '[Model::set()] Field "%s" is not present in table "%s", check database schema');
/**
* Error string short short error message.
*/
define ('SHORT_ERROR_MESSAGE', '<div class="error_message">%s</div>');
/**
* Error string for when original image can not be loaded.
*/
define ('ERROR_CANT_GET_ORIGINAL_IMAGE', '[Image] Couldn\'t load original image %s (tried from "%s")');
/**
* Error string for error 404.
*/
define ('ERROR_404', "The requested address /%s was not found on this server."); // second %s contains short error message
/**
* Error string for error 500.
*/
define ('ERROR_500', "Application error, sorry.");
/**
* Error string for attempted construction of an abstract class
*/
define ('ERROR_ABSTRACT_CONSTRUCTION', '[acl_base] The AclBase class constructor has been called, or the class was instantiated. This class must remain abstract. Please refer to the Cake docs for ACL configuration.');
?>

View file

@ -0,0 +1,145 @@
<?php
/* SVN FILE: $Id$ */
/**
* Short description for file.
*
* Long description for file
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright (c) 2005, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model
* @since CakePHP v 0.10.x.1402
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
/**
* Manages loaded instances of DataSource objects
*
* Long description for file
*
* @package cake
* @subpackage cake.cake.libs.model
* @since CakePHP v 0.10.x.1402
*
*/
uses('model'.DS.'datasources'.DS.'datasource');
class ConnectionManager extends Object
{
/**
* Holds a loaded instance of the Connections object
*
* @var class:Connections
* @access public
*/
var $config = null;
/**
* Holds instances DataSource objects
*
* @var array
* @access private
*/
var $_dataSources = array();
/**
* Constructor.
*
*/
function __construct()
{
if(class_exists('DATABASE_CONFIG'))
{
$this->config = new DATABASE_CONFIG();
}
}
/**
* Gets a reference to the ConnectionManger object instance
*
* @return object
*/
function &getInstance()
{
static $instance = null;
if($instance == null)
{
$instance =& new ConnectionManager();
}
return $instance;
}
/**
* Gets a reference to a DataSource object
*
* @param string $name The name of the DataSource, as defined in app/config/connections
* @return object
*/
function &getDataSource($name)
{
$_this =& ConnectionManager::getInstance();
if(in_array($name, array_keys($_this->_dataSources)))
{
return $_this->_dataSources[$name];
}
if(in_array($name, array_keys(get_object_vars($_this->config))))
{
$config = $_this->config->{$name};
if(isset($config['driver']) && $config['driver'] != null && $config['driver'] != '')
{
$filename = 'dbo_'.$config['driver'];
$classname = Inflector::camelize(strtolower('DBO_'.$config['driver']));
}
else
{
$filename = $config['datasource'].'_source';
$classname = Inflector::camelize(strtolower($config['datasource'].'_source'));
}
$tail = 'dbo'.DS.$filename.'.php';
if (file_exists(LIBS.'model'.DS.$tail))
{
require_once(LIBS.'model'.DS.$tail);
}
else if (file_exists(MODELS.$tail))
{
require_once(MODELS.$tail);
}
else
{
trigger_error('Unable to load model file ' . $filename . '.php', E_USER_ERROR);
return null;
}
$_this->_dataSources[$name] =& new $classname($config);
$_this->_dataSources[$name]->configKeyName = $name;
}
else
{
trigger_error("ConnectionManager::getDataSource - Non-existent data source {$name}", E_USER_ERROR);
return null;
}
return $_this->_dataSources[$name];
}
}
?>

View file

@ -0,0 +1,422 @@
<?php
/* SVN FILE: $Id$ */
/**
* Short description for file.
*
* Long description for file
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright (c) 2005, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.datasources
* @since CakePHP v 0.10.x.1379
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
/**
* Short description for file.
*
* Long description for file
*
* @package cake
* @subpackage cake.cake.libs.model.datasources
* @since CakePHP v 0.10.x.1379
*
*/
class DataSource extends Object
{
/**
* Are we connected to the DataSource?
*
* @var boolean
* @access public
*/
var $connected = false;
/**
* Print debug info?
*
* @var boolean
* @access public
*/
var $debug = false;
/**
* Print full query debug info?
*
* @var boolean
* @access public
*/
var $fullDebug = false;
/**
* Error description of last query
*
* @var unknown_type
* @access public
*/
var $error = null;
/**
* String to hold how many rows were affected by the last SQL operation.
*
* @var unknown_type
* @access public
*/
var $affected = null;
/**
* Number of rows in current resultset
*
* @var int
* @access public
*/
var $numRows = null;
/**
* Time the last query took
*
* @var unknown_type
* @access public
*/
var $took = null;
/**
* Enter description here...
*
* @var unknown_type
* @access private
*/
var $_result = null;
/**
* Queries count.
*
* @var unknown_type
* @access private
*/
var $_queriesCnt = 0;
/**
* Total duration of all queries.
*
* @var unknown_type
* @access private
*/
var $_queriesTime = null;
/**
* Log of queries executed by this DataSource
*
* @var unknown_type
* @access private
*/
var $_queriesLog = array();
/**
* Maximum number of items in query log, to prevent query log taking over
* too much memory on large amounts of queries -- I we've had problems at
* >6000 queries on one system.
*
* @var int Maximum number of queries in the queries log.
* @access private
*/
var $_queriesLogMax = 200;
/**
* The default configuration of a specific DataSource
*
* @var array
* @access public
*/
var $_baseConfig = array();
/**
* Holds references to descriptions loaded by the DataSource
*
* @var array
* @access private
*/
var $__descriptions = array();
/**
* A reference to the physical connection of this DataSource
*
* @var array
* @access public
*/
var $connection = null;
/**
* The DataSource configuration
*
* @var array
* @access public
*/
var $config = array();
/**
* The DataSource configuration key name
*
* @var string
* @access public
*/
var $configKeyName = null;
/**
* Whether or not this DataSource is in the middle of a transaction
*
* @var boolean
* @access public
*/
var $__transactionStarted = false;
function __construct ()
{
parent::__construct();
if(func_num_args() > 0)
{
$this->setConfig(func_get_arg(0));
}
}
/**
* Returns true if the DataSource supports the given interface (method)
*
* @param string $interface The name of the interface (method)
* @return boolean True on success
*/
function isInterfaceSupported ($interface)
{
$methods = get_class_methods(get_class($this));
$methods = strtolower(implode('|', $methods));
$methods = explode('|', $methods);
return in_array(strtolower($interface), $methods);
}
/**
* Sets the configuration for the DataSource
*
* @param array $config The configuration array
* @return void
*/
function setConfig ($config)
{
if(is_array($this->_baseConfig))
{
$this->config = $this->_baseConfig;
foreach($config as $key => $val)
{
$this->config[$key] = $val;
}
}
}
/**
* Cache the DataSource description
*
* @param string $object The name of the object (model) to cache
* @param mixed $data The description of the model, usually a string or array
* @return void
*/
function __cacheDescription ($object, $data = null)
{
if (DEBUG > 0)
{
$expires = "+10 seconds";
}
else
{
$expires = "+1 day";
}
if ($data !== null)
{
$this->__descriptions[$object] = &$data;
}
$new = cache('models'.DS.low(get_class($this)).'_'.$object, serialize($data), $expires);
if($new != null)
{
$new = unserialize($new);
}
return $new;
}
/**
* Parses conditions array (or just passes it if it's a string)
* @return string
*
*/
function conditions ($conditions)
{
return $conditions;
}
function name ($name)
{
return $name;
}
function value ($value)
{
return $value;
}
function describe ($model)
{
if (isset($this->__descriptions[$model->source]))
{
return $this->__descriptions[$model->source];
}
$cache = $this->__cacheDescription($model->source);
if ($cache !== null)
{
$this->__descriptions[$model->source] = &$cache;
return $cache;
}
return null;
}
function create (&$model, $fields = null, $values = null)
{
return false;
}
function read (&$model, $queryData = array())
{
return false;
}
function update (&$model, $fields = null, $values = null)
{
return false;
}
function delete (&$model, $id = null)
{
if ($id == null)
{
$id = $model->id;
}
}
function fields ($fields)
{
return $fields;
}
function getColumnType (&$model, $fields)
{
return false;
}
function insertQueryData($query, $data, $association, $assocData, &$model, &$linkModel, $index)
{
$keys = array('{$__cake_id__$}', '{$__cake_foreignKey__$}');
foreach($keys as $key)
{
if (strpos($query, $key) !== false)
{
switch($key)
{
case '{$__cake_id__$}':
$val = null;
if (isset($data[$index][$model->name])) {
$val = $data[$index][$model->name][$model->primaryKey];
}
break;
case '{$__cake_foreignKey__$}':
break;
}
$query = r($key, $this->value($val), $query);
}
}
return $query;
}
function resolveKey($model, $key)
{
return $key;
}
function getFieldValue ($data, $path)
{
if (!is_array($path))
{
$path = explode('.', $path);
}
$tmp = array();
foreach ($path as $i => $key)
{
if (intval($key) > 0 || $key == '0')
{
if (isset($data[intval($key)]))
{
$data = $data[intval($key)];
}
else
{
return null;
}
}
elseif ($key == '{n}')
{
foreach ($data as $j => $val)
{
if (is_subclass_of($this, 'DataSource') || is_subclass_of($this, 'datasource'))
{
$tmp[] = $this->getFieldValue($val, array_slice($path, $i + 1));
}
else
{
$tmp[] = DataSource::getFieldValue($val, array_slice($path, $i + 1));
}
}
return $tmp;
}
else
{
if (isset($data[$key]))
{
$data = $data[$key];
}
else
{
return null;
}
}
}
return $data;
}
function __destruct ()
{
if ($this->connected)
{
$this->close();
}
}
}
?>

View file

@ -0,0 +1,762 @@
<?php
/* SVN FILE: $Id$ */
/**
* Short description for file.
*
* Long description for file
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright (c) 2005, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.datasources
* @since CakePHP v 0.10.0.1076
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
/**
* Include DataSource base class
*
*/
uses('model'.DS.'datasources'.DS.'datasource');
/**
* DboSource
*
* Creates DBO-descendant objects from a given db connection configuration
*
* @package cake
* @subpackage cake.cake.libs.model.datasources
* @since CakePHP v 0.10.0.1076
*
*/
class DboSource extends DataSource
{
var $description = "Database Data Source";
/**
* Constructor
*
*/
function __construct($config = null)
{
$this->debug = DEBUG > 0;
$this->fullDebug = DEBUG > 1;
parent::__construct($config);
return $this->connect();
}
/**
* Prepares a value, or an array of values for database queries by quoting and escaping them.
*
* @param mixed $data A value or an array of values to prepare.
* @return mixed Prepared value or array of values.
*/
function value ($data, $column = null)
{
if (is_array($data))
{
$out = array();
foreach ($data as $key => $item)
{
$out[$key] = $this->value($item);
}
return $out;
}
else
{
return null;
}
}
function sources ()
{
return array_map('strtolower', $this->listSources());
}
/**
* Executes given SQL statement.
*
* @param string $sql SQL statement
* @return unknown
*/
function rawQuery ($sql)
{
$this->took = $this->error = $this->numRows = false;
return $this->execute($sql);
}
/**
* Queries the database with given SQL statement, and obtains some metadata about the result
* (rows affected, timing, any errors, number of rows in resultset). The query is also logged.
* If DEBUG is set, the log is shown all the time, else it is only shown on errors.
*
* @param string $sql
* @return unknown
*/
function execute($sql)
{
$t = getMicrotime();
$this->_result = $this->__execute($sql);
$this->affected = $this->lastAffected();
$this->took = round((getMicrotime() - $t) * 1000, 0);
$this->error = $this->lastError();
$this->numRows = $this->lastNumRows($this->_result);
$this->logQuery($sql);
if (($this->debug && $this->error) || ($this->fullDebug))
{
$this->showQuery($sql);
}
if ($this->error)
{
return false;
}
else
{
return $this->_result;
}
}
/**
* Returns a single row of results from the _last_ SQL query.
*
* @param resource $res
* @return array A single row of results
*/
function fetchArray ($assoc=false)
{
if ($assoc === false)
{
return $this->fetchRow();
}
else
{
return $this->fetchRow($assoc);
}
}
/**
* Returns a single row of results for a _given_ SQL query.
*
* @param string $sql SQL statement
* @return array A single row of results
*/
function one ($sql)
{
if ($this->query($sql))
{
return $this->fetchArray();
}
return false;
}
/**
* Returns an array of all result rows for a given SQL query.
* Returns false if no rows matched.
*
* @param string $sql SQL statement
* @return array Array of resultset rows, or false if no rows matched
*/
function fetchAll ($sql)
{
if($this->execute($sql))
{
$out = array();
while ($item = $this->fetchArray(null, true))
{
$out[] = $item;
}
return $out;
}
else
{
return false;
}
}
/**
* Returns a single field of the first of query results for a given SQL query, or false if empty.
*
* @param string $name Name of the field
* @param string $sql SQL query
* @return unknown
*/
function field ($name, $sql)
{
$data = $this->one($sql);
if (empty($data[$name]))
{
return false;
}
else
{
return $data[$name];
}
}
/**
* Checks if it's connected to the database
*
* @return boolean True if the database is connected, else false
*/
function isConnected()
{
return $this->connected;
}
/**
* Outputs the contents of the log.
*
* @param boolean $sorted
*/
function showLog($sorted=false)
{
$log = $sorted?
sortByKey($this->_queriesLog, 'took', 'desc', SORT_NUMERIC):
$this->_queriesLog;
print("<table border=1>\n<tr><th colspan=7>{$this->_queriesCnt} queries took {$this->_queriesTime} ms</th></tr>\n");
print("<tr><td>Nr</td><td>Query</td><td>Error</td><td>Affected</td><td>Num. rows</td><td>Took (ms)</td></tr>\n");
foreach($log AS $k=>$i)
{
print("<tr><td>".($k+1)."</td><td>{$i['query']}</td><td>{$i['error']}</td><td align='right'>{$i['affected']}</td><td align='right'>{$i['numRows']}</td><td align='right'>{$i['took']}</td></tr>\n");
}
print("</table>\n");
}
/**
* Log given SQL query.
*
* @param string $sql SQL statement
*/
function logQuery($sql)
{
$this->_queriesCnt++;
$this->_queriesTime += $this->took;
$this->_queriesLog[] = array(
'query' => $sql,
'error' => $this->error,
'affected' => $this->affected,
'numRows' => $this->numRows,
'took' => $this->took
);
if (count($this->_queriesLog) > $this->_queriesLogMax)
{
array_pop($this->_queriesLog);
}
if ($this->error)
{
return false; // shouldn't we be logging errors somehow?
// TODO: Add hook to error log
}
}
/**
* Output information about an SQL query. The SQL statement, number of rows in resultset,
* and execution time in microseconds. If the query fails, and error is output instead.
*
* @param string $sql
*/
function showQuery($sql)
{
$error = $this->error;
if (strlen($sql)>200 && !$this->fullDebug)
{
$sql = substr($sql, 0, 200) .'[...]';
}
if ($this->debug || $error)
{
print("<p style=\"text-align:left\"><b>Query:</b> {$sql} <small>[Aff:{$this->affected} Num:{$this->numRows} Took:{$this->took}ms]</small>");
if($error)
{
print("<br /><span style=\"color:Red;text-align:left\"><b>ERROR:</b> {$this->error}</span>");
}
print('</p>');
}
}
function create(&$model, $fields = null, $values = null)
{
if ($fields == null)
{
unset($fields, $values);
$fields = array_keys($model->data);
$values = array_values($model->data);
}
if($this->execute('INSERT INTO '.$model->source.' ('.join(',', $fields).') VALUES ('.join(',', $values).')'))
{
return true;
}
return false;
}
function read (&$model, $queryData = array(), $recursive = 1)
{
$this->__scrubQueryData($queryData);
$null = null;
$array = array();
$linkedModels = array();
if ($recursive > 0)
{
foreach($model->__associations as $type)
{
foreach($model->{$type} as $assoc => $assocData)
{
$linkModel =& $model->{$assocData['className']};
if (true === $this->generateAssociationQuery($model, $linkModel, $type, $assoc, $assocData, $queryData, false, $null))
{
$linkedModels[] = $type.$assoc;
}
}
}
}
// Build final query SQL
$query = $this->generateAssociationQuery($model, $null, null, null, null, $queryData, false, $null);
$resultSet = $this->fetchAll($query);
if ($recursive > 0)
{
foreach($model->__associations as $type)
{
foreach($model->{$type} as $assoc => $assocData)
{
if (!in_array($type.$assoc, $linkedModels))
{
$linkModel =& $model->{$assocData['className']};
$this->queryAssociation($model, $linkModel, $type, $assoc, $assocData, $array, true, $resultSet, $recursive - 1);
}
}
}
}
return $resultSet;
}
function queryAssociation(&$model, &$linkModel, $type, $association, $assocData, &$queryData, $external = false, &$resultSet, $recursive = 1)
{
//$external = (($linkModel->ds === $this) && $resultSet == null);
$query = $this->generateAssociationQuery($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet);
if ($query)
{
foreach ($resultSet as $i => $row)
{
$q = $this->insertQueryData($query, $resultSet, $association, $assocData, $model, $linkModel, $i);
$fetch = $this->fetchAll($q);
if (!empty($fetch) && is_array($fetch))
{
if (isset($fetch[0][$association]))
{
foreach ($fetch as $j => $row)
{
$resultSet[$i][$association][$j] = $row[$association];
}
}
else
{
$plural = Inflector::pluralize($association);
foreach ($fetch as $j => $row)
{
$resultSet[$i][$plural][$j] = $row[$plural];
}
}
}
}
}
}
function generateAssociationQuery(&$model, &$linkModel, $type, $association = null, $assocData = array(), &$queryData, $external = false, &$resultSet)
{
$this->__scrubQueryData($queryData);
if ($linkModel == null)
{
// Generates primary query
$sql = 'SELECT ' . join(', ', $this->fields($queryData['fields'])) . ' FROM ';
$sql .= $this->name($model->source).' AS ';
$sql .= $this->name($model->name).' ' . join(' ', $queryData['joins']).' ';
$sql .= $this->conditions($queryData['conditions']).' '.$this->order($queryData['order']);
$sql .= ' '.$this->limit($queryData['limit']);
return $sql;
}
$alias = $association;
if($model->name == $linkModel->name)
{
$alias = Inflector::pluralize($association);
}
switch ($type)
{
case 'hasOne':
if ($external)
{
if ($assocData['finderQuery'])
{
return $assocData['finderQuery'];
}
$sql = 'SELECT * FROM '.$this->name($linkModel->source).' AS '.$alias;
$conditions = $queryData['conditions'];
$condition = $model->escapeField($assocData['foreignKey']);
$condition .= '={$__cake_foreignKey__$}';
if (is_array($conditions))
{
$conditions[] = $condition;
}
else
{
if (trim($conditions) != '')
{
$conditions .= ' AND ';
}
$conditions .= $condition;
}
$sql .= $this->conditions($queryData['conditions']) . $this->order($queryData['order']);
$sql .= $this->limit($queryData['limit']);
}
else
{
$sql = ' LEFT JOIN '.$this->name($linkModel->source);
$sql .= ' AS '.$this->name($alias).' ON '.$this->name($alias).'.';
$sql .= $this->name($assocData['foreignKey']).'='.$model->escapeField($model->primaryKey);
$sql .= $this->conditions($assocData['conditions']);
$sql .= $this->order($assocData['order']);
if (!in_array($queryData['joins'], $sql))
{
$queryData['joins'][] = $sql;
}
return true;
}
break;
case 'belongsTo':
if ($external)
{
pr('external');
$conditions = $assocData['conditions'];
$sql = 'SELECT * FROM '.$this->name($linkModel->source).' AS '.$this->name($alias);
$condition = $linkModel->escapeField($assocData['foreignKey']);
$condition .= '={$__cake_id__$}';
if (is_array($conditions))
{
$conditions[] = $condition;
}
else
{
if (trim($conditions) != '')
{
$conditions .= ' AND ';
}
$conditions .= $condition;
}
$sql .= $this->conditions($queryData['conditions']) . $this->order($queryData['order']);
$sql .= $this->limit($queryData['limit']);
return $sql;
}
else
{
$sql = ' LEFT JOIN '.$this->name($linkModel->source);
$sql .= ' AS ' . $this->name($alias) . ' ON ';
$sql .= $this->name($model->name).'.'.$this->name($assocData['foreignKey']);
$sql .= '='.$linkModel->escapeField($linkModel->primaryKey);
if (!in_array($sql, $queryData['joins']))
{
$queryData['joins'][] = $sql;
}
return true;
}
break;
case 'hasMany':
if(isset($assocData['finderQuery']) && $assocData['finderQuery'] != null)
{
$sql = $assocData['finderQuery'];
}
else
{
$conditions = $assocData['conditions'];
$sql = 'SELECT * FROM '.$this->name($linkModel->source).' AS ';
$sql .= $this->name($alias);
$cond = $this->name($alias).'.'.$this->name($assocData['foreignKey']);
$cond .= '={$__cake_id__$}';
if (is_array($conditions))
{
$conditions[] = $cond;
}
else
{
if (trim($conditions) != '')
{
$conditions .= ' AND ';
}
$conditions .= $cond;
}
$sql .= $this->conditions($conditions);
$sql .= $this->order($assocData['order']);
}
return $sql;
break;
case 'hasAndBelongsToMany':
if(isset($assocData['finderQuery']) && $assocData['finderQuery'] != null)
{
$sql = $assocData['finderQuery'];
}
else
{
$joinTbl = $this->name($assocData['joinTable']);
$alias = $this->name($alias);
$sql = 'SELECT '.join(', ', $this->fields($assocData['fields']));
$sql .= ' FROM '.$this->name($linkModel->source).' AS '.$alias;
$sql .= ' JOIN '.$joinTbl.' ON '.$joinTbl;
$sql .= '.'.$this->name($assocData['foreignKey']).'={$__cake_id__$}';
$sql .= ' AND '.$joinTbl.'.'.$this->name($assocData['associationForeignKey']);
$sql .= ' = '.$alias.'.'.$this->name($linkModel->primaryKey);
$sql .= $this->conditions($assocData['conditions']);
$sql .= $this->order($assocData['order']);
}
return $sql;
break;
}
return null;
}
function update (&$model, $fields = null, $values = null)
{
$updates = array();
foreach (array_combine($fields, $values) as $field => $value)
{
$updates[] = $this->name($field).'='.$this->value($value);
}
$sql = 'UPDATE '.$this->name($model->source).' AS '.$this->name($model->name);
$sql .= ' SET '.join(',', $updates);
$sql .= ' WHERE '.$model->escapeField($model->primaryKey).'='.$this->value($model->getID());
return $this->execute($sql);
}
function delete (&$model, $id = null)
{
$_id = $model->id;
if ($id != null)
{
$model->id = $id;
}
if (!is_array($model->id))
{
$model->id = array($model->id);
}
foreach ($model->id as $id)
{
$result = $this->execute('DELETE FROM '.$this->name($model->source).' WHERE '.$this->name($model->primaryKey).'='.$this->value($id));
}
if ($result)
{
return true;
}
return false;
}
function resolveKey($model, $key, $assoc = null)
{
if ($assoc == null)
{
$assoc = $model->name;
}
if (!strpos('.', $key))
{
return $this->name($model->source).'.'.$this->name($key);
}
return $key;
}
function getColumnType (&$model, $field)
{
$columns = $model->loadInfo();
}
function __scrubQueryData(&$data)
{
if (!isset($data['conditions']))
{
$data['conditions'] = ' 1 ';
}
if (!isset($data['fields']))
{
$data['fields'] = '*';
}
if (!isset($data['joins']))
{
$data['joins'] = array();
}
if (!isset($data['order']))
{
$data['order'] = '';
}
if (!isset($data['limit']))
{
$data['limit'] = '';
}
}
function fields ($fields)
{
if (is_array($fields))
{
$f = $fields;
}
else
{
if ($fields != null)
{
if (strpos($fields, ','))
{
$fields = explode(',', $fields);
}
else
{
$fields = array($fields);
}
$fields = array_map('trim', $fields);
}
else
{
$fields = array('*');
}
}
if (count($fields) > 1 && $fields[0] != '*')
{
for ($i = 0; $i < count($fields); $i++)
{
$fields[$i] = $this->name($fields[$i]);
}
}
return $fields;
}
/**
* Parses conditions array (or just passes it if it's a string)
* @return string
*
*/
function conditions ($conditions)
{
$rt = '';
if (!strpos(low($conditions), 'where') || strpos(low($conditions), 'where') === 0)
{
$rt = ' WHERE ';
}
if (is_string($conditions))
{
if (trim($conditions) == '')
{
$conditions = ' 1';
}
return $rt.$conditions;
}
elseif (is_array($conditions))
{
$out = array();
foreach ($conditions as $key => $value)
{
$slashedValue = $this->value($value);
//TODO: Remove the = below so LIKE and other compares can be used
$data = $key . '=';
if ($value === null)
{
$data .= 'null';
}
else
{
$data = $slashedValue;
}
$out[] = $data;
}
return ' WHERE ' . join(' AND ', $out);
}
else
{
return $rt.' 1 ';
}
}
function limit ()
{
}
function order ($key, $dir = '')
{
if (trim($key) == '')
{
return '';
}
return ' ORDER BY '.$key.' '.$dir;
}
/**
* Disconnects database, kills the connection and says the connection is closed, and if DEBUG is turned on, the log for this object is shown.
*
*/
function close ()
{
if ($this->fullDebug)
{
$this->showLog();
}
$this->disconnect();
$this->_conn = NULL;
$this->connected = false;
}
/**
* Destructor. Closes connection to the database.
*
*/
function __destruct()
{
if ($this->__transactionStarted)
{
$this->rollback();
}
$this->close();
parent::__destruct();
}
}
?>

View file

@ -32,7 +32,10 @@
* Enter description here...
*
*/
uses('object');
if(!class_exists('Object'))
{
uses('object');
}
/**
* Purpose: DBO/ADO

View file

@ -20,7 +20,7 @@
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
* @version $Revision$
* @modifiedby $LastChangedBy$
@ -39,7 +39,7 @@ require_once(VENDORS.'adodb/adodb.inc.php');
* Database abstraction implementation for the AdoDB library.
*
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
*/
class DBO_AdoDB extends DBO

View file

@ -0,0 +1,471 @@
<?php
/* SVN FILE: $Id$ */
/**
* Short description for file.
*
* Long description for file
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright (c) 2005, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice.
*
* @filesource
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
/**
* Enter description here...
*
*/
uses('object');
/**
* Purpose: DBO/ADO
*
* Description:
* A SQL functions wrapper. Provides ability to get results as arrays
* and query logging (with execution time).
*
* Example usage:
*
* <code>
* require_once('dbo_mysql.php'); // or 'dbo_postgres.php'
*
* // create and connect the object
* $db = new DBO_MySQL(array( // or 'DBO_Postgres'
* 'host'=>'localhost',
* 'login'=>'username',
* 'password'=>'password',
* 'database'=>'database'));
*
* // read the whole query result array (of rows)
* $all_rows = $db->fetchAll("SELECT a,b,c FROM table");
*
* // read the first row with debugging on
* $first_row_only = $db->one("SELECT a,b,c FROM table WHERE a=1", TRUE);
*
* // emulate the usual way of reading query results
* if ($db->query("SELECT a,b,c FROM table"))
* {
* while ($row = $db->fetchArray())
* {
* print $row['a'].$row['b'].$row['c'];
* }
* }
*
* // show a log of all queries, sorted by execution time
* $db->showLog(TRUE);
* </code>
*
* @package cake
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
*/
class DBO extends Object
{
/**
* Are we connected to the database?
*
* @var boolean
* @access public
*/
var $connected=FALSE;
/**
* Connection configuration.
*
* @var array
* @access public
*/
var $config=FALSE;
/**
* Enter description here...
*
* @var boolean
* @access public
*/
var $debug=FALSE;
/**
* Enter description here...
*
* @var boolean
* @access public
*/
var $fullDebug=FALSE;
/**
* Enter description here...
*
* @var unknown_type
* @access public
*/
var $error=NULL;
/**
* String to hold how many rows were affected by the last SQL operation.
*
* @var unknown_type
* @access public
*/
var $affected=NULL;
/**
* Number of rows in current resultset
*
* @var int
* @access public
*/
var $numRows=NULL;
/**
* Time the last query took
*
* @var unknown_type
* @access public
*/
var $took=NULL;
/**
* Enter description here...
*
* @var unknown_type
* @access private
*/
var $_conn=NULL;
/**
* Enter description here...
*
* @var unknown_type
* @access private
*/
var $_result=NULL;
/**
* Queries count.
*
* @var unknown_type
* @access private
*/
var $_queriesCnt=0;
/**
* Total duration of all queries.
*
* @var unknown_type
* @access private
*/
var $_queriesTime=NULL;
/**
* Enter description here...
*
* @var unknown_type
* @access private
*/
var $_queriesLog=array();
/**
* Maximum number of items in query log, to prevent query log taking over
* too much memory on large amounts of queries -- I we've had problems at
* >6000 queries on one system.
*
* @var int Maximum number of queries in the queries log.
* @access private
*/
var $_queriesLogMax=200;
/**
* Constructor. Sets the level of debug for dbo (fullDebug or debug).
*
* @param array $config
* @return unknown
*/
function __construct($config=NULL)
{
$this->debug = DEBUG > 0;
$this->fullDebug = DEBUG > 1;
parent::__construct();
return $this->connect($config);
}
/**
* Destructor. Closes connection to the database.
*
*/
function __destructor()
{
$this->close();
}
/**
* Returns a string with a USE [databasename] SQL statement.
*
* @param string $db_name Name of database to use
* @return unknown Result of the query
*/
function useDb($db_name)
{
return $this->query("USE {$db_name}");
}
/**
* Disconnects database, kills the connection and says the connection is closed, and if DEBUG is turned on, the log for this object is shown.
*
*/
function close ()
{
if ($this->fullDebug) $this->showLog();
$this->disconnect();
$this->_conn = NULL;
$this->connected = false;
}
/**
* Prepares a value, or an array of values for database queries by quoting and escaping them.
*
* @param mixed $data A value or an array of values to prepare.
* @return mixed Prepared value or array of values.
*/
function prepare ($data)
{
if (is_array($data))
{
$out = null;
foreach ($data as $key=>$item)
{
$out[$key] = $this->prepareValue($item);
}
return $out;
}
else
{
return $this->prepareValue($data);
}
}
function sources ()
{
return array_map('strtolower', $this->listSources());
}
/**
* Executes given SQL statement.
*
* @param string $sql SQL statement
* @return unknown
*/
function rawQuery ($sql)
{
$this->took = $this->error = $this->numRows = false;
return $this->execute($sql);
}
/**
* Queries the database with given SQL statement, and obtains some metadata about the result
* (rows affected, timing, any errors, number of rows in resultset). The query is also logged.
* If DEBUG is set, the log is shown all the time, else it is only shown on errors.
*
* @param string $sql
* @return unknown
*/
function query($sql)
{
$t = getMicrotime();
$this->_result = $this->execute($sql);
$this->affected = $this->lastAffected();
$this->took = round((getMicrotime()-$t)*1000, 0);
$this->error = $this->lastError();
$this->numRows = $this->lastNumRows($this->_result);
$this->logQuery($sql);
if (($this->debug && $this->error) || ($this->fullDebug))
$this->showQuery($sql);
return $this->error? false: $this->_result;
}
/**
* Returns a single row of results from the _last_ SQL query.
*
* @param resource $res
* @return array A single row of results
*/
function farr ($assoc=false)
{
if ($assoc === false)
{
return $this->fetchRow();
}
else
{
return $this->fetchRow($assoc);
}
}
/**
* Returns a single row of results for a _given_ SQL query.
*
* @param string $sql SQL statement
* @return array A single row of results
*/
function one ($sql)
{
return $this->query($sql)? $this->fetchArray(): false;
}
/**
* Returns an array of all result rows for a given SQL query.
* Returns false if no rows matched.
*
* @param string $sql SQL statement
* @return array Array of resultset rows, or false if no rows matched
*/
function all ($sql)
{
if($this->query($sql))
{
$out=array();
while ($item = $this->fetchArray(null, true))
{
$out[] = $item;
}
return $out;
}
else
{
return false;
}
}
/**
* Returns a single field of the first of query results for a given SQL query, or false if empty.
*
* @param string $name Name of the field
* @param string $sql SQL query
* @return unknown
*/
function field ($name, $sql)
{
$data = $this->one($sql);
return empty($data[$name])? false: $data[$name];
}
/**
* Checks if the specified table contains any record matching specified SQL
*
* @param string $table Name of table to look in
* @param string $sql SQL WHERE clause (condition only, not the "WHERE" part)
* @return boolean True if the table has a matching record, else false
*/
function hasAny($table, $sql)
{
$out = $this->one("SELECT COUNT(*) AS count FROM {$table}".($sql? " WHERE {$sql}":""));
return is_array($out)? $out[0]['count']: false;
}
/**
* Checks if it's connected to the database
*
* @return boolean True if the database is connected, else false
*/
function isConnected()
{
return $this->connected;
}
/**
* Outputs the contents of the log.
*
* @param boolean $sorted
*/
function showLog($sorted=false)
{
$log = $sorted?
sortByKey($this->_queriesLog, 'took', 'desc', SORT_NUMERIC):
$this->_queriesLog;
print("<table border=1>\n<tr><th colspan=7>{$this->_queriesCnt} queries took {$this->_queriesTime} ms</th></tr>\n");
print("<tr><td>Nr</td><td>Query</td><td>Error</td><td>Affected</td><td>Num. rows</td><td>Took (ms)</td></tr>\n");
foreach($log AS $k=>$i)
{
print("<tr><td>".($k+1)."</td><td>{$i['query']}</td><td>{$i['error']}</td><td align='right'>{$i['affected']}</td><td align='right'>{$i['numRows']}</td><td align='right'>{$i['took']}</td></tr>\n");
}
print("</table>\n");
}
/**
* Log given SQL query.
*
* @param string $sql SQL statement
*/
function logQuery($sql)
{
$this->_queriesCnt++;
$this->_queriesTime += $this->took;
$this->_queriesLog[] = array(
'query'=>$sql,
'error'=>$this->error,
'affected'=>$this->affected,
'numRows'=>$this->numRows,
'took'=>$this->took
);
if (count($this->_queriesLog) > $this->_queriesLogMax)
{
array_pop($this->_queriesLog);
}
if ($this->error)
return false; // shouldn't we be logging errors somehow?
}
/**
* Output information about an SQL query. The SQL statement, number of rows in resultset,
* and execution time in microseconds. If the query fails, and error is output instead.
*
* @param string $sql
*/
function showQuery($sql)
{
$error = $this->error;
if (strlen($sql)>200 && !$this->fullDebug)
{
$sql = substr($sql, 0, 200) .'[...]';
}
if ($this->debug || $error)
{
print("<p style=\"text-align:left\"><b>Query:</b> {$sql} <small>[Aff:{$this->affected} Num:{$this->numRows} Took:{$this->took}ms]</small>");
if($error)
{
print("<br /><span style=\"color:Red;text-align:left\"><b>ERROR:</b> {$this->error}</span>");
}
print('</p>');
}
}
}
?>

View file

@ -32,12 +32,18 @@
* Enter description here...
*
*/
uses('object');
if(!class_exists('Object'))
{
uses('object');
}
/**
* Enter description here...
*
*/
config('database');
if (!class_exists('DATABASE_CONFIG'))
{
config('database');
}
/**
* DbFactory

View file

@ -20,7 +20,7 @@
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
* @version $Revision$
* @modifiedby $LastChangedBy$
@ -34,7 +34,7 @@
* All implementations override this class.
*
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
*/
class DBO_generic extends DBO

View file

@ -20,7 +20,7 @@
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
* @version $Revision$
* @modifiedby $LastChangedBy$
@ -32,7 +32,7 @@
/**
* Include DBO.
*/
uses('model'.DS.'dbo'.DS.'dbo');
uses('model'.DS.'datasources'.DS.'dbo_source');
/**
* Short description for class.
@ -40,30 +40,72 @@ uses('model'.DS.'dbo'.DS.'dbo');
* Long description for class
*
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
*/
class DBO_MySQL extends DBO
class DboMysql extends DboSource
{
var $description = "MySQL DBO Driver";
var $_baseConfig = array('persistent' => true,
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'cake',
'port' => 3306
);
var $columns = array(
'primary_key' => array('name' => 'int(11) DEFAULT NULL auto_increment'),
'string' => array('name' => 'varchar', 'limit' => '255'),
'text' => array('name' => 'text'),
'integer' => array('name' => 'int', 'limit' => '11'),
'float' => array('name' => 'float'),
'datetime' => array('name' => 'datetime', 'format' => 'Y-m-d h:i:s'),
'timestamp' => array('name' => 'datetime', 'format' => 'Y-m-d h:i:s'),
'time' => array('name' => 'time', 'format' => 'h:i:s'),
'date' => array('name' => 'date', 'format' => 'Y-m-d'),
'binary' => array('name' => 'blob'),
'boolean' => array('name' => 'tinyint', 'limit' => '1')
);
function __construct ($config)
{
parent::__construct($config);
return $this->connect();
}
/**
* Connects to the database using options in the given configuration array.
*
* @param array $config Configuration array for connecting
* @return boolean True if the database could be connected, else false
*/
function connect ($config)
function connect ()
{
if ($config)
$config = $this->config;
if ($config['persistent'])
{
$this->config = $config;
$this->_conn = $config['connect']($config['host'],$config['login'],$config['password']);
$connect = 'mysql_pconnect';
}
else
{
$connect = 'mysql_connect';
}
$this->connected = $this->_conn? true: false;
if($this->connected)
return mysql_select_db($config['database'], $this->_conn);
else{
$this->connected = false;
$this->connection = $connect($config['host'], $config['login'], $config['password']);
if ($this->connection)
{
$this->connected = true;
}
if ($this->connected)
{
return mysql_select_db($config['database'], $this->connection);
}
else
{
//die('Could not connect to DB.');
}
}
@ -75,7 +117,7 @@ class DBO_MySQL extends DBO
*/
function disconnect ()
{
return mysql_close($this->_conn);
return mysql_close($this->connection);
}
/**
@ -84,39 +126,65 @@ class DBO_MySQL extends DBO
* @param string $sql SQL statement
* @return resource Result resource identifier
*/
function execute ($sql)
function __execute ($sql)
{
return mysql_query($sql, $this->_conn);
return mysql_query($sql, $this->connection);
}
/**
* MySQL query abstraction
*
* @param string $method Method name
* @param array $params Parameters
* @return resource Result resource identifier
*/
function query ()
{
$args = func_get_args();
if (count($args) == 1)
{
return $this->fetchAll($args[0]);
}
elseif (count($args) > 1 && strpos($args[0], 'findBy') === 0)
{
$field = Inflector::underscore(str_replace('findBy', '', $args[0]));
$query = '`' . $args[2]->name . '`.`' . $field . '` = ' . $this->value($args[1][0]);
return $args[2]->find($query);
}
elseif (count($args) > 1 && strpos($args[0], 'findAllBy') === 0)
{
$field = Inflector::underscore(str_replace('findAllBy', '', $args[0]));
$query = '`' . $args[2]->name . '`.`' . $field . '` = ' . $this->value($args[1][0]);
return $args[2]->findAll($query);
}
}
/**
* Returns a row from given resultset as an array .
*
* @param bool $assoc Associative array only, or both?
* @return array The fetched row as an array
*/
function fetchRow ($assoc=false)
function fetchRow ($assoc = false)
{
//return mysql_fetch_array($this->_result, $assoc? MYSQL_ASSOC: MYSQL_BOTH);
$this->mysqlResultSet($this->_result);
$this->resultSet($this->_result);
$resultRow = $this->fetchResult();
return $resultRow;
}
/**
* Returns an array of tables in the database. If there are no tables, an error is raised and the application exits.
* Returns an array of sources (tables) in the database.
*
* @return array Array of tablenames in the database
*/
function tablesList ()
function listSources ()
{
$result = mysql_list_tables($this->config['database'], $this->_conn);
$result = mysql_list_tables($this->config['database'], $this->connection);
if (!$result)
{
trigger_error(ERROR_NO_TABLE_LIST, E_USER_NOTICE);
exit;
return null;
}
else
{
@ -135,37 +203,162 @@ class DBO_MySQL extends DBO
* @param string $tableName Name of database table to inspect
* @return array Fields in table. Keys are name and type
*/
function fields ($tableName)
function &describe (&$model)
{
$cache = parent::describe($model);
if ($cache != null)
{
return $cache;
}
$fields = false;
$cols = $this->all("DESC {$tableName}");
$cols = $this->query('DESC ' . $this->name($model->source));
foreach ($cols as $column)
{
// $fields[] = array('name'=>$column['Field'], 'type'=>$column['Type']);
if(isset($column['COLUMNS']) && !isset($column[0]))
$colKey = array_keys($column);
if (isset($column[$colKey[0]]) && !isset($column[0]))
{
$column[0] = $column['COLUMNS'];
$column[0] = $column[$colKey[0]];
}
if(isset($column[0]))
if (isset($column[0]))
{
$fields[] = array('name' => $column[0]['Field'], 'type' => $column[0]['Type']);
}
}
$this->__cacheDescription($model->source, $fields);
return $fields;
}
/**
* Returns a quoted name of $data for use in an SQL statement.
*
* @param string $data Name (table/field) to be prepared for use in an SQL statement
* @return string Quoted for MySQL
*/
function name ($data)
{
if ($data == '*')
{
return '*';
}
return '`'.$data.'`';
}
/**
* Returns a quoted and escaped string of $data for use in an SQL statement.
*
* @param string $data String to be prepared for use in an SQL statement
* @param string $column The column into which this data will be inserted
* @return string Quoted and escaped
*/
function prepareValue ($data)
function value ($data, $column = null)
{
return "'".mysql_real_escape_string($data, $this->_conn)."'";
$parent = parent::value($data, $column);
if ($parent != null)
{
return $parent;
}
if (ini_get('magic_quotes_gpc') == 1)
{
$data = stripslashes($data);
}
if (version_compare(phpversion(),"4.3.0") == "-1")
{
$data = mysql_escape_string($data, $this->connection);
}
else
{
$data = mysql_real_escape_string($data, $this->connection);
}
return "'" . $data . "'";
// TODO: Add logic that formats/escapes data based on column type
}
/**
* Translates between PHP boolean values and MySQL (faked) boolean values
*
* @param mixed $data Value to be translated
* @return mixed Converted boolean value
*/
function boolean ($data)
{
if ($data === true || $data === false)
{
if ($data === true)
{
return 1;
}
return 0;
}
else
{
if (intval($data !== 0))
{
return true;
}
return false;
}
}
function create(&$model, $fields = null, $values = null)
{
return parent::create($model, $fields, $values);
}
function update(&$model, $fields = null, $values = null)
{
return parent::update($model, $fields, $values);
}
/**
* Begin a transaction
*
* @return boolean True on success, false on fail (i.e. if the database/model does not support transactions).
*/
function begin (&$model)
{
if (parent::begin($model))
{
if ($this->execute('START TRANSACTION'))
{
$this->__transactionStarted = true;
return true;
}
}
return false;
}
/**
* Commit a transaction
*
* @return boolean True on success, false on fail (i.e. if the database/model does not support transactions, or a transaction has not started).
*/
function commit (&$model)
{
if (parent::commit($model))
{
$this->__transactionStarted;
return $this->execute('COMMIT');
}
return false;
}
/**
* Rollback a transaction
*
* @return boolean True on success, false on fail (i.e. if the database/model does not support transactions, or a transaction has not started).
*/
function rollback (&$model)
{
if (parent::rollback($model))
{
return $this->execute('ROLLBACK');
}
return false;
}
/**
@ -175,17 +368,26 @@ class DBO_MySQL extends DBO
*/
function lastError ()
{
return mysql_errno($this->_conn)? mysql_errno($this->_conn).': '.mysql_error($this->_conn): null;
if (mysql_errno($this->connection))
{
return mysql_errno($this->connection).': '.mysql_error($this->connection);
}
return null;
}
/**
* Returns number of affected rows in previous database operation. If no previous operation exists, this returns false.
* Returns number of affected rows in previous database operation. If no previous operation exists,
* this returns false.
*
* @return int Number of affected rows
*/
function lastAffected ()
{
return $this->_result? mysql_affected_rows($this->_conn): false;
if ($this->_result)
{
return mysql_affected_rows($this->connection);
}
return null;
}
/**
@ -196,7 +398,11 @@ class DBO_MySQL extends DBO
*/
function lastNumRows ()
{
return $this->_result? @mysql_num_rows($this->_result): false;
if ($this->_result)
{
return @mysql_num_rows($this->_result);
}
return null;
}
/**
@ -204,9 +410,9 @@ class DBO_MySQL extends DBO
*
* @return int
*/
function lastInsertId ()
function lastInsertId ($source = null)
{
return mysql_insert_id($this->_conn);
return mysql_insert_id($this->connection);
}
/**
@ -216,9 +422,23 @@ class DBO_MySQL extends DBO
* @param int $offset Offset from which to start results
* @return string SQL limit/offset statement
*/
function selectLimit ($limit, $offset=null)
function limit ($limit, $offset = null)
{
return $limit? " LIMIT".($offset? " {$offset},": null)." {$limit}": null;
if ($limit)
{
$rt = '';
if (!strpos(low($limit), 'limit') || strpos(low($limit), 'limit') === 0)
{
$rt = ' LIMIT';
}
if ($offset)
{
$rt .= ' ' . $offset. ',';
}
$rt .= ' ' . $limit;
return $rt;
}
return null;
}
/**
@ -226,19 +446,19 @@ class DBO_MySQL extends DBO
*
* @param unknown_type $results
*/
function mysqlResultSet(&$results)
function resultSet(&$results)
{
$this->results =& $results;
$this->map = array();
$index = 0;
$num_fields = mysql_num_fields($results);
$j=0;
$index = 0;
$j = 0;
while ($j < $num_fields)
{
$column = mysql_fetch_field($results,$j);
if(!empty($column->table))
if (!empty($column->table))
{
$this->map[$index++] = array($column->table, $column->name);
}
@ -251,7 +471,7 @@ class DBO_MySQL extends DBO
}
/**
* Enter description here...
* Fetches the next row from the current result set
*
* @return unknown
*/
@ -274,7 +494,6 @@ class DBO_MySQL extends DBO
return false;
}
}
}
?>

View file

@ -20,7 +20,7 @@
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
* @version $Revision$
* @modifiedby $LastChangedBy$
@ -41,7 +41,7 @@ vendor('Pear/DB');
* Long description for class
*
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.2.9
*/
class DBO_Pear extends DBO
@ -65,11 +65,6 @@ class DBO_Pear extends DBO
{
$this->config = $config;
if (preg_match('#^pear[-_](.*)$#i', $config['driver'], $res))
{
$config['driver'] = $res[1];
}
$dsn = $config['driver'].'://'.$config['login'].':'.$config['password'].'@'.$config['host'].'/'.$config['database'];
$options = array(
'debug' => DEBUG-1,

View file

@ -20,7 +20,7 @@
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.9.1.114
* @version $Revision$
* @modifiedby $LastChangedBy$
@ -31,7 +31,7 @@
/**
* Include DBO.
*/
uses('model'.DS.'dbo'.DS.'dbo');
uses('model'.DS.'datasources'.DS.'dbo_source');
/**
* PostgreSQL layer for DBO.
@ -39,33 +39,67 @@ uses('model'.DS.'dbo'.DS.'dbo');
* Long description for class
*
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.9.1.114
*/
class DBO_Postgres extends DBO
class DboPostgres extends DboSource
{
var $description = "PostgreSQL DBO Driver";
var $_baseConfig = array('persistent' => true,
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'cake',
'port' => 3306
);
var $columns = array(
'primary_key' => array('name' => 'serial primary key'),
'string' => array('name' => 'varchar', 'limit' => '255'),
'text' => array('name' => 'text'),
'integer' => array('name' => 'integer'),
'float' => array('name' => 'float'),
'datetime' => array('name' => 'timestamp'),
'timestamp' => array('name' => 'timestamp'),
'time' => array('name' => 'time'),
'date' => array('name' => 'date'),
'binary' => array('name' => 'bytea'),
'boolean' => array('name' => 'boolean')
);
/**
* Connects to the database using options in the given configuration array.
*
* @param array $config Configuration array for connecting
* @return True if successfully connected.
*/
function connect ($config)
function connect ()
{
if ($config)
$config = $this->config;
if ($config['persistent'])
{
$this->config = $config;
$this->_conn = $config['connect']("host={$config['host']} dbname={$config['database']} user={$config['login']} password={$config['password']}");
$connect = 'pg_pconnect';
}
$this->connected = $this->_conn? true: false;
if($this->connected)
return true;
else
{
//die('Could not connect to DB.');
$connect = 'pg_connect';
}
$this->connection = $connect("dbname={$config['database']} user={$config['login']} password={$config['password']}");
if ($this->connection)
{
$this->connected = true;
}
else
{
$this->connected = false;
}
return $this->connected;
}
/**
@ -75,7 +109,7 @@ class DBO_Postgres extends DBO
*/
function disconnect ()
{
return pg_close($this->_conn);
return pg_close($this->connection);
}
/**
@ -84,9 +118,34 @@ class DBO_Postgres extends DBO
* @param string $sql SQL statement
* @return resource Result resource identifier
*/
function execute ($sql)
function __execute ($sql)
{
return pg_query($this->_conn, $sql);
return pg_query($this->connection, $sql);
}
function query ()
{
$args = func_get_args();
echo "<pre>";
print_r($args);
echo "</pre>";
die();
if (count($args) == 1)
{
return $this->fetchAll($args[0]);
}
elseif (count($args) > 1 && strpos($args[0], 'findBy') === 0)
{
$field = Inflector::underscore(str_replace('findBy', '', $args[0]));
$query = '`' . $args[2]->name . '`.`' . $field . '` = ' . $this->value($args[1][0]);
return $args[2]->find($query);
}
elseif (count($args) > 1 && strpos($args[0], 'findAllBy') === 0)
{
$field = Inflector::underscore(str_replace('findAllBy', '', $args[0]));
$query = '`' . $args[2]->name . '`.`' . $field . '` = ' . $this->value($args[1][0]);
return $args[2]->findAll($query);
}
}
/**
@ -104,7 +163,7 @@ class DBO_Postgres extends DBO
*
* @return array Array of tablenames in the database
*/
function tablesList ()
function listSources ()
{
$sql = "SELECT a.relname AS name
FROM pg_class a, pg_user b
@ -112,17 +171,20 @@ class DBO_Postgres extends DBO
AND relname !~ '^xin[vx][0-9]+' AND b.usesysid = a.relowner
AND NOT (EXISTS (SELECT viewname FROM pg_views WHERE viewname=a.relname));";
$result = $this->all($sql);
$this->execute($sql);
$result = $this->fetchRow();
if (!$result)
{
trigger_error(ERROR_NO_TABLE_LIST, E_USER_ERROR);
exit;
return null;
}
else
{
$tables = array();
foreach ($result as $item) $tables[] = $item['name'];
foreach ($result as $item)
{
$tables[] = $item['name'];
}
return $tables;
}
}
@ -153,7 +215,18 @@ class DBO_Postgres extends DBO
* @param string $data String to be prepared for use in an SQL statement
* @return string Quoted and escaped
*/
function prepareValue ($data)
function name ($data)
{
return "'". $data."'";
}
/**
* Returns a quoted and escaped string of $data for use in an SQL statement.
*
* @param string $data String to be prepared for use in an SQL statement
* @return string Quoted and escaped
*/
function value ($data)
{
return "'".pg_escape_string($data)."'";
}
@ -165,8 +238,12 @@ class DBO_Postgres extends DBO
*/
function lastError ()
{
$last_error = pg_last_error($this->_conn);
return $last_error? $last_error: null;
$last_error = pg_last_error($this->connection);
if ($last_error)
{
return $last_error;
}
return null;
}
/**
@ -176,7 +253,11 @@ class DBO_Postgres extends DBO
*/
function lastAffected ()
{
return $this->_result? pg_affected_rows($this->_result): false;
if ($this->_result)
{
return pg_affected_rows($this->_result);
}
return false;
}
/**
@ -187,19 +268,23 @@ class DBO_Postgres extends DBO
*/
function lastNumRows ()
{
return $this->_result? pg_num_rows($this->_result): false;
if ($this->_result)
{
return pg_num_rows($this->_result);
}
return false;
}
/**
* Returns the ID generated from the previous INSERT operation.
*
* @param string $table Name of the database table
* @param string $source Name of the database table
* @param string $field Name of the ID database field. Defaults to "id"
* @return int
*/
function lastInsertId ($table, $field='id')
function lastInsertId ($source, $field='id')
{
$sql = "SELECT CURRVAL('{$table}_{$field}_seq') AS max";
$sql = "SELECT CURRVAL('{$source}_{$field}_seq') AS max";
$res = $this->rawQuery($sql);
$data = $this->fetchRow($res);
return $data['max'];
@ -212,9 +297,14 @@ class DBO_Postgres extends DBO
* @param int $offset Offset from which to start results
* @return string SQL limit/offset statement
*/
function selectLimit ($limit, $offset=null)
function limit ($limit, $offset = null)
{
return " LIMIT {$limit}".($offset? " OFFSET {$offset}": null);
$rt = ' LIMIT ' . $limit;
if ($offset)
{
$rt .= ' OFFSET ' . $offset;
}
return $rt;
}
}

View file

@ -20,7 +20,7 @@
* @copyright Copyright (c) 2005, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.9.0
* @version $Revision$
* @modifiedby $LastChangedBy$
@ -39,7 +39,7 @@ uses('model'.DS.'dbo'.DS.'dbo');
* Long description for class
*
* @package cake
* @subpackage cake.cake.libs.model.dbo
* @subpackage cake.cake.libs.model.datasources.dbo
* @since CakePHP v 0.9.0
*/
class DBO_SQLite extends DBO
@ -126,7 +126,7 @@ class DBO_SQLite extends DBO
}
}
/**
/**
* Returns an array of the fields in given table name.
*
* @param string $tableName Name of database table to inspect
@ -145,7 +145,7 @@ class DBO_SQLite extends DBO
return $fields;
}
/**
/**
* Returns a quoted and escaped string of $data for use in an SQL statement.
*
* @param string $data String to be prepared for use in an SQL statement
@ -156,7 +156,7 @@ class DBO_SQLite extends DBO
return "'" . sqlite_escape_string($data) . "'";
}
/**
/**
* Returns a formatted error message from previous database operation.
*
* @return string Error message
@ -166,7 +166,7 @@ class DBO_SQLite extends DBO
return sqlite_last_error($this->_conn)? sqlite_last_error($this->_conn).': '.sqlite_error_string(sqlite_last_error($this->_conn)): null;
}
/**
/**
* Returns number of affected rows in previous database operation. If no previous operation exists, this returns false.
*
* @return int Number of affected rows
@ -176,7 +176,7 @@ class DBO_SQLite extends DBO
return $this->_result? sqlite_changes($this->_conn): false;
}
/**
/**
* Returns number of rows in previous resultset. If no previous resultset exists,
* this returns false.
*
@ -187,7 +187,7 @@ class DBO_SQLite extends DBO
return $this->_result? sqlite_num_rows($this->_result): false;
}
/**
/**
* Returns the ID generated from the previous INSERT operation.
*
* @return int
@ -197,7 +197,7 @@ class DBO_SQLite extends DBO
return sqlite_last_insert_rowid($this->_conn);
}
/**
/**
* Returns a limit statement in the correct format for the particular database.
*
* @param int $limit Limit of results returned

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -140,98 +140,6 @@ class Object
}
}
/**
* Renders the Missing Controller web page.
*
*/
function missingController()
{
//$this->autoLayout = true;
$this->pageTitle = 'Missing Controller';
$this->render('../errors/missingController');
exit();
}
/**
* Renders the Missing Action web page.
*
*/
function missingAction()
{
//$this->autoLayout = true;
$this->pageTitle = 'Missing Method in Controller';
$this->render('../errors/missingAction');
exit();
}
/**
* Renders the Private Action web page.
*
*/
function privateAction()
{
//$this->autoLayout = true;
$this->pageTitle = 'Trying to access private method in class';
$this->render('../errors/privateAction');
exit();
}
/**
* Renders the Missing View web page.
*
*/
function missingView()
{
//We are simulating action call below, this is not a filename!
//$this->autoLayout = true;
$this->missingView = $this->name;
$this->pageTitle = 'Missing View';
$this->render('../errors/missingView');
exit();
}
/**
* Renders the Missing Database web page.
*
*/
function missingDatabase()
{
//$this->autoLayout = true;
$this->pageTitle = 'Scaffold Missing Database Connection';
$this->render('../errors/missingScaffolddb');
exit();
}
/**
* Renders the Missing Table web page.
*
*/
function missingTable($tableName)
{
$error =& new Controller();
$error->constructClasses();
$error->missingTable = $this->table;
$error->missingTableName = $tableName;
$error->pageTitle = 'Missing Database Table';
$error->render('../errors/missingTable');
exit();
}
/**
* Renders the Missing Table web page.
*
*/
function missingConnection()
{
$error =& new Controller();
$error->constructClasses();
$error->missingConnection = $this->name;
//$error->autoLayout = true;
$error->pageTitle = 'Missing Database Connection';
$error->render('../errors/missingDatabase');
exit();
}
/**
* Renders the Missing Helper file web page.
*
@ -257,6 +165,15 @@ class Object
$this->render('../errors/missingHelperClass');
exit();
}
function cakeError($method, $messages)
{
if(!class_exists('ErrorHandler'))
{
uses('error');
}
return new ErrorHandler($method, $messages);
}
}
?>

View file

@ -51,12 +51,6 @@ class CakeSession extends Object
* @var unknown_type
*/
var $error = false;
/**
* Enter description here...
*
* @var unknown_type
*/
var $ip = false;
/**
* Enter description here...
*
@ -87,6 +81,18 @@ class CakeSession extends Object
* @var unknown_type
*/
var $security = null;
/**
* Enter description here...
*
* @var unknown_type
*/
var $time = false;
/**
* Enter description here...
*
* @var unknown_type
*/
var $sessionTime = false;
/**
* Enter description here...
*
@ -94,7 +100,7 @@ class CakeSession extends Object
*/
function __construct($base = null)
{
$this->host = $_SERVER['HTTP_HOST'];
$this->host = env('HTTP_HOST');
if (empty($base))
{
@ -110,24 +116,17 @@ class CakeSession extends Object
$this->host = substr($this->host,0, strpos($this->host, ':'));
}
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
if(env('HTTP_USER_AGENT') != null)
{
$this->ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$this->ip = $_SERVER['REMOTE_ADDR'];
}
if(!empty($_SERVER['HTTP_USER_AGENT']))
{
$this->userAgent = md5($_SERVER['HTTP_USER_AGENT']);
$this->userAgent = md5(env('HTTP_USER_AGENT').CAKE_SESSION_STRING);
}
else
{
$this->userAgent = "";
}
$this->time = time();
$this->sessionTime = $this->time + (Security::inactiveMins() * 60);
$this->security = CAKE_SECURITY;
$this->_initSession();
$this->_begin();
@ -298,6 +297,26 @@ class CakeSession extends Object
echo "</pre>";
die();
}
/**
* Enter description here...
*
* @access private
*/
function _destroyInvalid()
{
$sessionpath = session_save_path();
if (empty($sessionpath))
{
$sessionpath = "/tmp";
}
if (isset($_COOKIE[session_name()]))
{
setcookie(CAKE_SESSION_COOKIE, '', time()-42000, $this->path);
}
$file = $sessionpath.DS."sess_".session_id();
@unlink($file);
$this->__construct($this->path);
}
/**
* Enter description here...
@ -405,40 +424,30 @@ class CakeSession extends Object
*
*/
function _new()
{
if(!ereg("\.aol\.com$", gethost($this->ip)))
{
if($this->readSessionVar("Config"))
{
if($this->ip == $this->readSessionVar("Config.ip") && $this->userAgent == $this->readSessionVar("Config.userAgent"))
if($this->userAgent == $this->readSessionVar("Config.userAgent") &&
$this->time <= $this->readSessionVar("Config.time"))
{
$this->writeSessionVar("Config.time", $this->sessionTime);
$this->valid = true;
}
else
{
$this->valid = false;
$this->_setError(1, "Session Highjacking Attempted !!!");
$this->_destroyInvalid();
}
}
else
{
srand((double)microtime() * 1000000);
$this->writeSessionVar('Config.rand', rand());
$this->writeSessionVar("Config.ip", $this->ip);
$this->writeSessionVar("Config.time", $this->sessionTime);
$this->writeSessionVar("Config.userAgent", $this->userAgent);
$this->valid = true;
}
}
else
{
if(!$this->readSessionVar("Config"))
{
srand((double)microtime() * 1000000);
$this->writeSessionVar('Config.rand', rand());
$this->writeSessionVar("Config.ip", $this->ip);
$this->writeSessionVar("Config.userAgent", $this->userAgent);
}
$this->valid = true;
$this->_setError(1, "Session is valid");
}
if($this->security == 'high')

View file

@ -44,42 +44,42 @@
class AjaxHelper extends Helper
{
/**
/**
* Included helpers.
*
* @var array
*/
var $helpers = array('Html', 'Javascript');
/**
/**
* Enter description here...
*
* @var array
*/
var $callbacks = array('uninitialized', 'loading', 'loaded', 'interactive', 'complete');
/**
/**
* Enter description here...
*
* @var array
*/
var $ajaxOptions = array('method','position','form','parameters','evalScripts', 'asynchronous', 'onComplete', 'onUninitialized', 'onLoading', 'onLoaded', 'onInteractive');
/**
/**
* Enter description here...
*
* @var array
*/
var $dragOptions = array('handle', 'revert', 'constraint', 'change');
/**
/**
* Enter description here...
*
* @var array
*/
var $dropOptions = array('accept', 'containment', 'overlap', 'greedy', 'hoverclass', 'onHover', 'onDrop');
/**
/**
* Enter description here...
*
* @var array
@ -87,7 +87,7 @@ class AjaxHelper extends Helper
var $sortOptions = array('tag', 'only', 'overlap', 'constraint', 'containment', 'handle', 'hoverClass', 'ghosting', 'dropOnEmpty', 'onUpdate', 'onChange');
/**
/**
* Returns link to remote action
*
* Returns a link to a remote action defined by <i>options[url]</i>
@ -162,7 +162,7 @@ class AjaxHelper extends Helper
}
}
/**
/**
* Creates JavaScript function for remote AJAX call
*
* This function creates the javascript needed to make a remote call
@ -200,7 +200,7 @@ class AjaxHelper extends Helper
return $func;
}
/**
/**
* Periodically call remote url via AJAX.
*
* Periodically calls the specified url (<i>options[url]</i>) every <i>options[frequency]</i> seconds (default is 10).
@ -217,7 +217,7 @@ class AjaxHelper extends Helper
return $this->Javascript->codeBlock($code);
}
/**
/**
* Returns form tag that will submit using Ajax.
*
* Returns a form tag that will submit using XMLHttpRequest in the background instead of the regular
@ -237,7 +237,7 @@ class AjaxHelper extends Helper
$this->remoteFunction($options) . "; return false;}");
}
/**
/**
* Returns a button input tag that will submit using Ajax
*
* Returns a button input tag that will submit form using XMLHttpRequest in the background instead of regular
@ -258,7 +258,7 @@ class AjaxHelper extends Helper
return $this->Html->tag("input", $options['html'], false);
}
/**
/**
* Observe field and call ajax on change.
*
* Observes the field with the DOM ID specified by <i>field_id</i> and makes
@ -295,7 +295,7 @@ class AjaxHelper extends Helper
return $this->Javascript->codeBlock($this->_buildObserver('Form.Element.Observer', $field_id, $options));
}
/**
/**
* Observe entire form and call ajax on change.
*
* Like @see observeField(), but operates on an entire form identified by the
@ -316,7 +316,7 @@ class AjaxHelper extends Helper
return $this->Javascript->codeBlock($this->_buildObserver('Form.Observer', $field_id, $options));
}
/**
/**
* Create a text field with Autocomplete.
*
* Creates an autocomplete field with the given ID and options.
@ -359,14 +359,20 @@ class AjaxHelper extends Helper
$this->Javascript->codeBlock("new Ajax.Autocompleter('" . $options['id'] . "', '" .
$divOptions['id'] . "', '" . $this->Html->url($url) . "', " . $this->_optionsForAjax($ajaxOptions) . ");");
}
/**
* Enter description here...
*
* @param unknown_type $id
* @param unknown_type $options
* @return unknown
*/
function drag($id, $options = array())
{
$options = $this->_optionsForDraggable($options);
return $this->Javascript->codeBlock("new Draggable('$id'$options);");
}
/**
/**
* Enter description here...
*
* @param array $options
@ -379,10 +385,13 @@ class AjaxHelper extends Helper
return $this->_buildOptions($options, $this->dragOptions);
}
/**
/**
* For a reference on the options for this function, check out
* http://wiki.script.aculo.us/scriptaculous/show/Droppables.add
*
* @param unknown_type $id
* @param unknown_type $options
* @return unknown
*/
function drop($id, $options = array())
{
@ -390,6 +399,12 @@ class AjaxHelper extends Helper
return $this->Javascript->codeBlock("Droppables.add('$id'$options);");
}
/**
* Enter description here...
*
* @param unknown_type $options
* @return unknown
*/
function _optionsForDroppable ($options)
{
$options = $this->_optionsToString($options, array('accept','overlap','hoverclass'));
@ -397,18 +412,27 @@ class AjaxHelper extends Helper
return $this->_buildOptions($options, $this->dropOptions);
}
/**
* Enter description here...
*
* @param unknown_type $id
* @param unknown_type $options
* @param unknown_type $ajaxOptions
* @return unknown
*/
function dropRemote($id, $options = array(), $ajaxOptions = array())
{
$options['onDrop'] = "function(element){" . $this->remoteFunction($ajaxOptions) . "}";
}
/**
/**
* Makes a list or group of floated objects sortable.
*
*
* @param string $id DOM ID of parent
* @param array $options Array of options to control sort.http://wiki.script.aculo.us/scriptaculous/show/Sortable.create
* @link http://wiki.script.aculo.us/scriptaculous/show/Sortable.create
* @return unknown
*/
function sortable($id, $options = array())
@ -422,15 +446,26 @@ class AjaxHelper extends Helper
return $this->Javascript->codeBlock("Sortable.create('$id'$options);");
}
/**
* Enter description here...
*
* @param unknown_type $options
* @return unknown
* @access private
*/
function _optionsForSortable ($options)
{
$options = $this->_optionsToString($options, array('handle','tag','constraint','ghosting'));
return $this->_buildOptions($options, $this->sortOptions);
}
/**
* Javascript helper function (private).
/**
* Javascript helper function.
*
* @param unknown_type $options
* @return unknown
* @access private
*/
function _optionsForAjax ($options = array())
{
@ -466,6 +501,14 @@ class AjaxHelper extends Helper
}
/**
* Enter description here...
*
* @param unknown_type $options
* @param unknown_type $acceptable
* @return unknown
* @access private
*/
function _buildOptions ($options, $acceptable) {
if(is_array($options))
{
@ -487,13 +530,14 @@ class AjaxHelper extends Helper
}
}
/**
/**
* Enter description here... Return JavaScript text for ...
*
* @param string $klass Name of JavaScript class
* @param string $name
* @param array $options
* @return string Formatted JavaScript
* @access private
*/
function _buildObserver ($klass, $name, $options=null)
{
@ -509,11 +553,12 @@ class AjaxHelper extends Helper
return $javascript;
}
/**
/**
* Enter description here... Return JavaScript text for ...
*
* @param array $options
* @return array
* @access private
*/
function _buildCallbacks($options)
{
@ -530,6 +575,14 @@ class AjaxHelper extends Helper
return $callbacks;
}
/**
* Enter description here...
*
* @param unknown_type $options
* @param unknown_type $stringOpts
* @return unknown
* @access private
*/
function _optionsToString ($options, $stringOpts = array())
{
foreach ($stringOpts as $option)

View file

@ -360,7 +360,6 @@ class FormHelper extends Helper
function generateSubmitDiv($displayText, $htmlOptions = null)
{
return $this->divTag( 'submit', $this->Html->submitTag( $displayText, $htmlOptions) );
}
/**
@ -373,27 +372,30 @@ class FormHelper extends Helper
function generateFields( $fields, $readOnly = false )
{
$strFormFields = '';
foreach( $fields as $field )
{
if( isset( $field['type'] ) )
if(isset( $field['type']))
{
if(!isset($field['required']))
{
// initialize some optional parameters to avoid the notices
if( !isset($field['required'] ) )
$field['required'] = false;
if( !isset( $field['errorMsg'] ) )
}
if(!isset( $field['errorMsg']))
{
$field['errorMsg'] = null;
if( !isset( $field['htmlOptions'] ) )
}
if(!isset( $field['htmlOptions']))
{
$field['htmlOptions'] = array();
}
if( $readOnly )
{
$field['htmlOptions']['READONLY'] = "readonly";
}
switch( $field['type'] )
{
case "input" :
// If the size has not been set, initialize it to 40.
if( !isset( $field['size'] ) )
{
$field['size'] = 40;
@ -405,66 +407,71 @@ class FormHelper extends Helper
break;
case "select";
case "selectMultiple";
{
if( "selectMultiple" == $field['type'] )
{
$field['selectAttr']['multiple'] = 'multiple';
$field['selectAttr']['class'] = 'selectMultiple';
}
// If the selected attribute has not been set, initialize it to null.
if( !isset( $field['selected'] ) )
if(!isset( $field['selected']))
{
$field['selected'] = null;
if( !isset( $field['selectAttr'] ) )
$field['selectAttr'] = null;
if( !isset( $field['optionsAttr'] ) )
$field['optionsAttr'] = null;
if( $readOnly )
$field['selectAttr']['DISABLED'] = true;
$strFormFields = $strFormFields.$this->generateSelectDiv( $field['tagName'], $field['prompt'], $field['options'], $field['selected'], $field['selectAttr'], $field['optionsAttr'], $field['required'], $field['errorMsg'] );
}
if(!isset( $field['selectAttr']))
{
$field['selectAttr'] = null;
}
if(!isset( $field['optionsAttr']))
{
$field['optionsAttr'] = null;
}
if($readOnly)
{
$field['selectAttr']['DISABLED'] = true;
}
$strFormFields = $strFormFields.$this->generateSelectDiv( $field['tagName'], $field['prompt'], $field['options'], $field['selected'], $field['selectAttr'], $field['optionsAttr'], $field['required'], $field['errorMsg'] );
break;
case "area";
if(!isset( $field['rows']))
{
if( !isset( $field['rows'] ) )
$field['rows'] = 10;
if( !isset( $field['cols'] ) )
$field['cols'] = 60;
$strFormFields = $strFormFields.$this->generateAreaDiv( $field['tagName'], $field['prompt'], $field['required'], $field['errorMsg'], $field['cols'], $field['rows'], $field['htmlOptions'] );
}
if(!isset( $field['cols']))
{
$field['cols'] = 60;
}
$strFormFields = $strFormFields.$this->generateAreaDiv( $field['tagName'], $field['prompt'], $field['required'], $field['errorMsg'], $field['cols'], $field['rows'], $field['htmlOptions'] );
break;
case "fieldset";
$strFieldsetFields = $this->generateFields( $field['fields'] );
$strFieldsetFields = $this->generateFields( $field['fields'] );
$strFieldSet = sprintf( '
<fieldset>
<legend>%s</legend>
<div class="notes">
<h4>%s</h4>
<p class="last">%s</p>
</div>
%s
</fieldset>', $field['legend'], $field['noteHeading'], $field['note'], $strFieldsetFields );
<fieldset><legend>%s</legend><div class="notes"><h4>%s</h4><p class="last">%s</p></div>%s</fieldset>',
$field['legend'], $field['noteHeading'], $field['note'], $strFieldsetFields );
$strFormFields = $strFormFields.$strFieldSet;
break;
case "hidden";
$strFormFields = $strFormFields . $this->Html->hiddenTag( $field['tagName']);
break;
case "date":
if( !isset( $field['selected']))
{
$field['selected'] = null;
}
$strFormFields = $strFormFields.$this->generateDate( $field['tagName'], $field['prompt'], null, null, null, null, $field['selected']);
break;
case "datetime":
if( !isset( $field['selected']))
{
$field['selected'] = null;
}
$strFormFields = $strFormFields.$this->generateDateTime( $field['tagName'], $field['prompt'], '','','', '', $field['selected']);
break;
default:
//bugbug: i don't know how to put out a notice that an unknown type was entered.
break;
} // end switch $field['type']
} // end if isset $field['type']
}
}
}
return $strFormFields;
}
}
?>

View file

@ -608,7 +608,7 @@ class HtmlHelper extends Helper
if ($error == $this->tagIsInvalid($this->model, $this->field))
{
return sprintf(SHORT_ERROR_MESSAGE, is_array($text)? (empty($text[$error-1])? 'Error in field': $text[$error-1]): $text);
return sprintf('<div class="error_message">%s</div>', is_array($text)? (empty($text[$error-1])? 'Error in field': $text[$error-1]): $text);
}
else
{

View file

@ -28,34 +28,37 @@
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
?>
<?php $controller = Inflector::camelize($this->name)."Controller"; ?>
<h1>Missing Method in <?php echo $controller;?></h1>
<p class="error">You are seeing this error because the action <em><?php echo $this->controller->missingAction;?></em>
<p class="error">You are seeing this error because the action <em><?php echo $action;?></em>
is not defined in controller <em><?php echo $controller;?></em>
</p>
<p>
<span class="notice"><strong>Notice:</strong> this error is being rendered by the <code>app/views/errors/missing_action.thtml</code>
<span class="notice"><strong>Notice:</strong> this error is being rendered by the <strong>app/views/errors/missing_action.thtml</strong>
view file, a user-customizable error page for handling invalid action dispatches.</span>
</p>
<p>
<strong>Fatal</strong>: Create Method:
</p>
<p>&lt;?php<br />
&nbsp;&nbsp;&nbsp;&nbsp;class <?php echo $controller;?> extends AppController<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function <?php echo $action;?>()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
?&gt;<br />
</p>
<p>
<?php echo "<pre>&lt;?php\n\nclass " . $controller ." extends AppController {\n
function ".$this->controller->missingAction."()
{
}
}\n?&gt;</pre>"; ?>
in file : <?php echo "app".DS."controllers".DS.Inflector::underscore($controller).".php"; ?>
</p>
<p>
<strong>Error</strong>: Unable to execute action <em><?php echo $this->controller->missingAction;?></em> in
<strong>Error</strong>: Unable to execute action <em><?php echo $action;?></em> in
<em><?php echo $controller;?></em>
</p>

View file

@ -30,7 +30,7 @@
?>
<h1>Requires a Database Connection</h1>
<p class="error">Missing Database Connection: Model <?php echo $this->controller->missingConnection;?> requires a database connection
<p class="error">Missing Database Connection: Model <?php echo $model;?> requires a database connection
</p>
<p>

View file

@ -29,8 +29,7 @@
*/
?>
<h1>Missing controller</h1>
<?php $missing = $this->controller->missingController; ?>
<p class="error">You are seeing this error because controller <em><?php echo $missing;?></em>
<p class="error">You are seeing this error because controller <em><?php echo $controller;?></em>
could not be found.
</p>
@ -40,21 +39,26 @@ view file, a user-customizable error page for handling invalid controller dispat
</p>
<p>
<strong>Fatal</strong>: Unable to load controller <em><?php echo $missing;?></em>
<strong>Fatal</strong>: Unable to load controller <em><?php echo $controller;?></em>
</p>
<p>
<strong>Fatal</strong>: Create Class:
</p>
<p>
<?php echo "<pre>&lt;?php\n\nclass " . $missing ." extends AppController {\n}\n\n?&gt;</pre>"; ?>
in file : <?php echo "app".DS."controllers".DS.Inflector::underscore($missing).".php"; ?>
<p>&lt;?php<br />
&nbsp;&nbsp;&nbsp;&nbsp;class <?php echo $controller;?> extends AppController<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
?&gt;<br />
</p>
in file : <?php echo "app".DS."controllers".DS.Inflector::underscore($controller).".php"; ?>
</p>
<?php if (DEBUG>1):?>
<h2>Controller dump:</h2>
<pre>
<?php
unset($this->db);
print_r($this);
print_r($this->controller);
?>
</pre>
<?php endif;?>

View file

@ -28,9 +28,8 @@
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
?>
<?php $missing = $this->controller->missingTable;?>
<h1>Missing Database Table</h1>
<p class="error">No Database table for model <?php echo $missing;?> (expected "<?php echo $this->controller->missingTableName;?>"), create it first.
<p class="error">No Database table for model <?php echo $model;?> (expected "<?php echo $table;?>"), create it first.
</p>
<p>
<span class="notice"><strong>Notice:</strong> this error is being rendered by the <code>app/views/errors/missing_table.thtml</code>

View file

@ -31,8 +31,8 @@
<h1>Missing view</h1>
<p class="error">You are seeing this error because the view <em><?php echo $this->missingView;?></em>
for action <em><?php echo $this->params['action'];?></em>
in controller <em><?php echo Inflector::camelize($this->name);?></em> could not be found.
for action <em><?php echo $action;?></em>
in controller <em><?php echo $controller;?></em> could not be found.
</p>
<p>
@ -42,7 +42,7 @@ view file, a user-customizable error page for handling missing/invalid views dur
<p>
<strong>Fatal</strong>: Unable to load view file <em><?php echo $this->missingView;?></em> for
action <em><?php echo $this->missingView;?>::<?php echo $this->params['action'];?></em>
action <em><?php echo $this->missingView;?>::<?php echo $action;?></em>
</p>
<?php if (DEBUG>1):?>

View file

@ -28,10 +28,8 @@
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
?>
<?php $controller = Inflector::camelize($this->name)."Controller"; ?>
<h1>Private Method in <?php echo $controller;?></h1>
<p class="error">You are seeing this error because the action <em><?php echo $this->controller->privateAction;?></em>
<p class="error">You are seeing this error because the private class method <em><?php echo $action;?></em>
should not be accessed directly
</p>

View file

@ -28,10 +28,10 @@
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/
?>
<p style="background:#DBA941;padding:4px;font-size: 16px;">Your database configuration file is <?php echo file_exists(CONFIGS.'database.php') ? 'present.' . $filePresent = ' ' : 'not present.';?></p>
<?php $db = DboFactory::getInstance(); ?>
<p style="background:#DBA941;padding:4px;font-size: 16px;">Your database configuration file is <?php echo file_exists(CONFIGS.'database.php') ?' present.' . $filePresent = ' ' : ' not present.'; ?></p>
<?php $db = ConnectionManager::getInstance(); ?>
<?php if (!empty($filePresent)):?>
<p style="background:#DBA941;padding:4px;font-size: 16px;">Cake<?php echo $db->connected ? ' is able to ' : ' is not able to ';?>connect to the database.</p>
<p style="background:#DBA941;padding:4px;font-size: 16px;">Cake<?php echo $db->getDataSource('default')->connected ? ' is able to' : ' is not able to';?> connect to the database.</p>
<br />
<?php endif; ?>
<h1>Take a bite out of Cake<em>PHP</em> Beta</h1>

View file

@ -52,9 +52,9 @@ else
<?php
if($type == 'Edit')
{
echo "<li>".$html->linkTo('Delete '.Inflector::humanize($modelName), '/'.$this->viewPath.'/destroy/'.$data[$modelKey][$this->controller->{$modelName}->primaryKey])."</li>";
echo "<li>".$html->link('Delete '.Inflector::humanize($modelName), '/'.$this->viewPath.'/destroy/'.$data[$modelKey][$this->controller->{$modelName}->primaryKey])."</li>";
}
echo "<li>".$html->linkTo('List '.Inflector::humanize($modelName), '/'.$this->viewPath.'/index')."</li>";
echo "<li>".$html->link('List '.Inflector::humanize($modelName), '/'.$this->viewPath.'/index')."</li>";
if($type == 'Edit')
{
@ -62,7 +62,7 @@ if($type == 'Edit')
{
if( isset( $value['foreignKey'] ) )
{
echo "<li>".$html->linkTo( "View ".Inflector::humanize($value['controller']), "/".Inflector::underscore($value['controller'])."/show/".$data[$modelKey][$field] )."</li>";
echo "<li>".$html->link( "View ".Inflector::humanize($value['controller']), "/".Inflector::underscore($value['controller'])."/show/".$data[$modelKey][$field] )."</li>";
}
}
}

View file

@ -62,8 +62,7 @@
// this is a foreign key, figure out what the display field should be for this model.
$otherModelKey = Inflector::underscore($value['modelKey']);
$otherControllerName = $value['controller'];
$registry = ClassRegistry::getInstance();
$otherModelObject = $registry->getObject( $otherModelKey );
$otherModelObject = ClassRegistry::getObject( $otherModelKey );
$alias = array_search($value['table'],$this->controller->{$model}->alias);
if( is_object($otherModelObject) )
{
@ -71,16 +70,16 @@
} else{
$displayText = $row[$alias][$field];
}
echo $html->linkTo( $displayText, "/".Inflector::underscore($otherControllerName)."/show/".$row[$modelKey][$field] );
echo $html->link( $displayText, "/".Inflector::underscore($otherControllerName)."/show/".$row[$modelKey][$field] );
} else {
echo $row[$modelKey][$field];
} ?>
</td>
<?php } // end for each $fieldNames as $field=>value ?>
<td class="listactions"><?php echo $html->linkTo('View',"/".$this->viewPath."/show/{$row[$modelKey][$this->controller->{$model}->primaryKey]}/")?>
<?php echo $html->linkTo('Edit',"/".$this->viewPath."/edit/{$row[$modelKey][$this->controller->{$model}->primaryKey]}/")?>
<?php echo $html->linkTo('Delete',"/".$this->viewPath."/destroy/{$row[$modelKey][$this->controller->{$model}->primaryKey]}/")?>
<td class="listactions"><?php echo $html->link('View',"/".$this->viewPath."/show/{$row[$modelKey][$this->controller->{$model}->primaryKey]}/")?>
<?php echo $html->link('Edit',"/".$this->viewPath."/edit/{$row[$modelKey][$this->controller->{$model}->primaryKey]}/")?>
<?php echo $html->link('Delete',"/".$this->viewPath."/destroy/{$row[$modelKey][$this->controller->{$model}->primaryKey]}/")?>
</td>
</tr>
@ -90,7 +89,7 @@
</table>
<ul class="actions">
<li><?php echo $html->linkTo('New '.$humanSingularName, '/'.$this->viewPath.'/add'); ?></li>
<li><?php echo $html->link('New '.$humanSingularName, '/'.$this->viewPath.'/add'); ?></li>
</ul>

View file

@ -38,7 +38,7 @@
</form>
<ul class='actions'>
<?php
echo "<li>".$html->linkTo('List '.Inflector::humanize($this->name), '/'.$this->viewPath.'/index')."</li>";
echo "<li>".$html->link('List '.Inflector::humanize($this->name), '/'.$this->viewPath.'/index')."</li>";
?>
</ul>

View file

@ -30,8 +30,7 @@
<?php
$modelName = Inflector::singularize($this->name);
$modelKey = Inflector::underscore($modelName);
$registry =& ClassRegistry::getInstance();
$objModel = $registry->getObject($modelKey);
$objModel = ClassRegistry::getObject($modelKey);
?>
<h1>Show <?php echo Inflector::humanize($modelName)?></h1>
@ -43,14 +42,14 @@
if(isset($value['foreignKey']))
{
$alias = array_search($value['table'],$objModel->alias);
$otherModelObject = $registry->getObject(Inflector::underscore($objModel->tableToModel[$value['table']]));
$otherModelObject = ClassRegistry::getObject(Inflector::underscore($objModel->tableToModel[$value['table']]));
$displayField = $otherModelObject->getDisplayField();
$displayText = $data[$alias][$displayField];
if(!empty($data[$objModel->tableToModel[$objModel->table]][$field]))
if(!empty($data[$objModel->tableToModel[$objModel->source]][$field]))
{
echo "<dd>".$html->linkTo($displayText, '/'.Inflector::underscore($value['controller']).'/show/'
.$data[$objModel->tableToModel[$objModel->table]][$field] )."</dd>";
echo "<dd>".$html->link($displayText, '/'.Inflector::underscore($value['controller']).'/show/'
.$data[$objModel->tableToModel[$objModel->source]][$field] )."</dd>";
}
else
{
@ -60,9 +59,9 @@
else
{
// this is just a plain old field.
if( !empty($data[$objModel->tableToModel[$objModel->table]][$field]))
if( !empty($data[$objModel->tableToModel[$objModel->source]][$field]))
{
echo "<dd>".$data[$objModel->tableToModel[$objModel->table]][$field]."</dd>";
echo "<dd>".$data[$objModel->tableToModel[$objModel->source]][$field]."</dd>";
}
else
{
@ -75,14 +74,16 @@
</dl>
<ul class='actions'>
<?php
echo "<li>".$html->linkTo('Edit '.Inflector::humanize($objModel->name), '/'.$this->viewPath.'/edit/'.$data[$objModel->tableToModel[$objModel->table]][$this->controller->{$modelName}->primaryKey])."</li>";
echo "<li>".$html->linkTo('Delete '.Inflector::humanize($objModel->name), '/'.$this->viewPath.'/destroy/'.$data[$objModel->tableToModel[$objModel->table]][$this->controller->{$modelName}->primaryKey])."</li>";
echo "<li>".$html->linkTo('List '.Inflector::humanize($objModel->name), '/'.$this->viewPath.'/index')."</li>";
echo "<li>".$html->linkTo('New '.Inflector::humanize($objModel->name), '/'.$this->viewPath.'/add')."</li>";
foreach( $fieldNames as $field => $value ) {
echo "<li>".$html->link('Edit '.Inflector::humanize($objModel->name), '/'.$this->viewPath.'/edit/'.$data[$objModel->tableToModel[$objModel->source]][$this->controller->{$modelName}->primaryKey])."</li>";
echo "<li>".$html->link('Delete '.Inflector::humanize($objModel->name), '/'.$this->viewPath.'/destroy/'.$data[$objModel->tableToModel[$objModel->source]][$this->controller->{$modelName}->primaryKey])."</li>";
echo "<li>".$html->link('List '.Inflector::humanize($objModel->name), '/'.$this->viewPath.'/index')."</li>";
echo "<li>".$html->link('New '.Inflector::humanize($objModel->name), '/'.$this->viewPath.'/add')."</li>";
foreach( $fieldNames as $field => $value )
{
if( isset( $value['foreignKey'] ) )
{
echo "<li>".$html->linkTo( "View ".Inflector::humanize($value['controller']), "/".Inflector::underscore($value['controller'])."/show/".$data[$alias][$otherModelObject->primaryKey] )."</li>";
echo "<li>".$html->link( "List ".Inflector::humanize($value['controller']), "/".Inflector::underscore($value['controller'])."/index/")."</li>";
}
}
?>
@ -90,10 +91,10 @@
<!--hasOne relationships -->
<?php
foreach ($objModel->_oneToOne as $relation)
foreach ($objModel->hasOne as $association => $relation)
{
list($association, $model, $value) = $relation;
$otherModelName = $objModel->tableToModel[$objModel->{$model}->table];
$model = $relation['className'];
$otherModelName = $objModel->tableToModel[$objModel->{$model}->source];
$controller = Inflector::pluralize($model);
echo "<div class='related'><H2>Related ".Inflector::humanize($association)."</H2>";
@ -113,26 +114,17 @@
}
echo "</dl>";
echo "<ul class='actions'><li>".$html->linkTo('Edit '.Inflector::humanize($association),"/".Inflector::underscore($controller)."/edit/{$data[$association][$objModel->{$model}->primaryKey]}")."</li></ul></div>";
echo "<ul class='actions'><li>".$html->link('Edit '.Inflector::humanize($association),"/".Inflector::underscore($controller)."/edit/{$data[$association][$objModel->{$model}->primaryKey]}")."</li></ul></div>";
}
?>
<!-- HAS MANY AND HASANDBELONGSTOMANY -->
<?php
$relations = array();
foreach( $objModel->_oneToMany as $relation )
{
$relations[] = $relation;
} // end loop through onetomany relations.
foreach( $objModel->_manyToMany as $relation )
$relations = array_merge($objModel->hasMany, $objModel->hasAndBelongsToMany);
foreach($relations as $association => $relation)
{
$relations[] = $relation;
} // end loop through manytomany relations.
foreach( $relations as $relation )
{
list($association, $model, $value) = $relation;
$model = $relation['className'];
$count = 0;
$otherModelName = Inflector::singularize($model);
$controller = Inflector::pluralize($model);
@ -163,9 +155,9 @@
echo "<td>".$value."</td>";
}
?>
<td class="listactions"><?php echo $html->linkTo('View',"/".Inflector::underscore($controller)."/show/{$row[$this->controller->{$modelName}->{$association}->primaryKey]}/")?>
<?php echo $html->linkTo('Edit',"/".Inflector::underscore($controller)."/edit/{$row[$this->controller->{$modelName}->{$association}->primaryKey]}/")?>
<?php echo $html->linkTo('Delete',"/".Inflector::underscore($controller)."/destroy/{$row[$this->controller->{$modelName}->{$association}->primaryKey]}/")?>
<td class="listactions"><?php echo $html->link('View',"/".Inflector::underscore($controller)."/show/{$row[$this->controller->{$modelName}->{$association}->primaryKey]}/")?>
<?php echo $html->link('Edit',"/".Inflector::underscore($controller)."/edit/{$row[$this->controller->{$modelName}->{$association}->primaryKey]}/")?>
<?php echo $html->link('Delete',"/".Inflector::underscore($controller)."/destroy/{$row[$this->controller->{$modelName}->{$association}->primaryKey]}/")?>
</td>
<?php
echo "</tr>";
@ -178,7 +170,7 @@
<?php
// add a link to create a new relation.
echo "<li>".$html->linkTo('New '.Inflector::humanize($association),"/".Inflector::underscore($controller)."/add/")."</li>";
echo "<li>".$html->link('New '.Inflector::humanize($association),"/".Inflector::underscore($controller)."/add/")."</li>";
?>
</ul></div>

View file

@ -324,11 +324,11 @@ class View extends Object
// app/view/errors/missing_view.thtml view is missing!
if (DEBUG)
{
trigger_error(sprintf(ERROR_NO_VIEW, $action, $viewFileName), E_USER_ERROR);
trigger_error(sprintf(__("No template file for view %s (expected %s), create it first'"), $action, $viewFileName), E_USER_ERROR);
}
else
{
$this->error('404', 'Not found', sprintf(ERROR_404, '', "missing view \"{$action}\""));
$this->error('404', 'Not found', sprintf("The requested address %s was not found on this server.", '', "missing view \"{$action}\""));
}
die();
@ -358,7 +358,7 @@ class View extends Object
else
{
$out = $this->_render($viewFileName, $this->_viewVars, false);
trigger_error(sprintf(ERROR_IN_VIEW, $viewFileName, $out), E_USER_ERROR);
trigger_error(sprintf(__("Error in view %s, got: <blockquote>%s</blockquote>"), $viewFileName, $out), E_USER_ERROR);
}
return true;
@ -418,7 +418,7 @@ class View extends Object
if ($out === false)
{
$out = $this->_render($layout_fn, $data_for_layout, false);
trigger_error(sprintf(ERROR_IN_LAYOUT, $layout_fn, $out), E_USER_ERROR);
trigger_error(sprintf(__("Error in layout %s, got: <blockquote>%s</blockquote>"), $layout_fn, $out), E_USER_ERROR);
return false;
}
else
@ -428,7 +428,7 @@ class View extends Object
}
else
{
trigger_error(sprintf(ERROR_NO_LAYOUT, $this->layout, $layout_fn), E_USER_ERROR);
trigger_error(sprintf(__("Could not find layout %s (expected %s), create it first"), $this->layout, $layout_fn), E_USER_ERROR);
return false;
}
}
@ -604,9 +604,14 @@ class View extends Object
* @return array
*/
function &_loadHelpers(&$loaded, $helpers)
{
static $tags;
if(empty($tags))
{
$helperTags = new Helper();
$tags = $helperTags->loadConfig();
}
foreach ($helpers as $helper)
{
$helperCn = $helper.'Helper';

View file

@ -71,9 +71,10 @@ uses ('controller'.DS.'components'.DS.'dbacl'.DS.'models'.DS.'acoaction');
uses ('controller'.DS.'components'.DS.'dbacl'.DS.'models'.DS.'aro');
//Get and format args: first arg is the name of the script.
$wasted = array_shift($_SERVER['argv']);
$command = array_shift($_SERVER['argv']);
$args = $_SERVER['argv'];
$serverArgs = env('argv');
$wasted = array_shift($serverArgs);
$command = array_shift($serverArgs);
$args = $serverArgs;
$aclCLI = new AclCLI ($command, $args);