Merging fixes and enhancements into trunk

Revision: [1985]
Changed DboSource?::order() to allow passing an array in the order param

Revision: [1984]
Reverting changes from [1983]

Revision: [1983]
Merging change from [1966] and [1967]

Revision: [1982]
Adding fix for DboSource::order().
This allows setting the order in the find methods.

Revision: [1981]
cleaned up code

Revision: [1980]
Corrected the array keys in the regex I added

Revision: [1979]
Added check to DboMysql::value() that does not add quotes around a numerical value.
Refactored DboSource::conditions() adding better regex. 

Revision: [1978]
Added check for LIKE in a condition array this fixes the = being added.

Revision: [1977]
Added fix for Ticket #392

Revision: [1976]
Adding changes suggested in Ticket #381.
These have not been fully tested.

Revision: [1975]
Added fix for Ticket #391

Revision: [1974]
Added patch from Ticket #390

Revision: [1973]
Adding patch from Ticket #386

Revision: [1972]
Added patch from Ticket #385.
Changed wording of a comment.

Revision: [1971]
Added patch from Ticket #383

Revision: [1970]
Adding fix for Ticket #395

Revision: [1969]
Adding more detailed comment to path defines

Revision: [1968]
Making a few more changes to the path settings

Revision: [1965]
fixing path issue with loading PagesController

Revision: [1964]
Added model method for getting column types by field

Revision: [1963]
Corrected paths to the tmp directory.
Making a few more changes to the defines in index.php

Revision: [1962]
Moving tmp directory to app

Revision: [1961]
Starting separation of core from the application.

Revision: [1960]
Adding vendors directory to app directory

Revision: [1959]
Finished support for recursive associations.  Still needs some testing...

Revision: [1958]
Adding fix for Ticket #387, and automagic id's for form inputs

Revision: [1957]

Revision: [1956]
Adding fix for error reported in Google Group: http://groups.google.com/group/cake-php/browse_thread/thread/395593a3cea34174

Revision: [1955]
Adding fix for Controller::referer()

git-svn-id: https://svn.cakephp.org/repo/trunk/cake@1986 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
phpnut 2006-02-16 09:29:28 +00:00
parent 40f3a01d1e
commit 818806195f
18 changed files with 347 additions and 221 deletions

View file

@ -6,4 +6,4 @@
// +---------------------------------------------------------------------------------------------------+ // // +---------------------------------------------------------------------------------------------------+ //
/////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////
0.10.8.1954 0.10.8.1986

View file

@ -28,28 +28,50 @@
* @license http://www.opensource.org/licenses/mit-license.php The MIT License * @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
* Get Cake's root directory * These defines should only be edited if you have cake installed in
* a directory layout other than the way it is distributed.
* Each define has a commented line of code that explains what you would change.
*
*/ */
if (!defined('DS'))
{
define('DS', DIRECTORY_SEPARATOR);
}
if (!defined('ROOT')) if (!defined('ROOT'))
{ {
define('ROOT', dirname(dirname(dirname(__FILE__))).DS); //define('ROOT', 'FULL PATH TO DIRECTORY WHERE APP DIRECTORY IS LOCATED DO NOT ADD A TRAILING DIRECTORY SEPARATOR';
define('ROOT', dirname(dirname(dirname(__FILE__))));
} }
if (!defined('APP_DIR')) if (!defined('APP_DIR'))
{ {
//define('APP_DIR', 'DIRECTORY NAME OF APPLICATION';
define ('APP_DIR', basename(dirname(dirname(__FILE__)))); define ('APP_DIR', basename(dirname(dirname(__FILE__))));
} }
/**
* This only needs to be changed if the cake installed libs are located
* outside of the distributed directory structure.
*/
if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
//define ('CAKE_CORE_INCLUDE_PATH', FULL PATH TO DIRECTORY WHERE CAKE CORE IS INSTALLED DO NOT ADD A TRAILING DIRECTORY SEPARATOR';
define('CAKE_CORE_INCLUDE_PATH', ROOT);
}
///////////////////////////////
//DO NOT EDIT BELOW THIS LINE//
///////////////////////////////
if (!defined('DS'))
{
define('DS', DIRECTORY_SEPARATOR);
}
if (!defined('WEBROOT_DIR')) if (!defined('WEBROOT_DIR'))
{ {
define ('WEBROOT_DIR', basename(dirname(__FILE__))); define ('WEBROOT_DIR', basename(dirname(__FILE__)));
} }
require_once ROOT.'cake'.DS.'bootstrap.php';
ini_set('include_path',ini_get('include_path').PATH_SEPARATOR.CAKE_CORE_INCLUDE_PATH.PATH_SEPARATOR.ROOT.DS.APP_DIR.DS);
require_once 'cake'.DS.'bootstrap.php';
?> ?>

View file

@ -247,15 +247,16 @@ function loadController ($name)
{ {
$controller_fn = CONTROLLERS.$name.'_controller.php'; $controller_fn = CONTROLLERS.$name.'_controller.php';
} }
elseif(file_exists(LIBS.'controller'.DS.$name.'_controller.php')) elseif($controller_fn = fileExistsInPath(LIBS.'controller'.DS.$name.'_controller.php'))
{ {
$controller_fn = LIBS.'controller'.DS.$name.'_controller.php';
} }
else else
{ {
$controller_fn = false; return false;
} }
return file_exists($controller_fn)? require_once($controller_fn): false; require_once($controller_fn);
return true;
} }
else else
{ {
@ -302,6 +303,10 @@ function loadPluginController ($plugin, $controller)
return true; return true;
} }
} }
else
{
return true;
}
} }
/** /**
@ -915,4 +920,18 @@ function LogError ($message)
CakeLog::write('error', str_replace($bad, $good, $message)); CakeLog::write('error', str_replace($bad, $good, $message));
} }
function fileExistsInPath ($file)
{
$paths = explode(PATH_SEPARATOR, get_include_path());
foreach ($paths as $path)
{
$fullPath = $path . DIRECTORY_SEPARATOR . $file;
if (file_exists($fullPath))
{
return $fullPath;
}
}
return false;
}
?> ?>

View file

@ -33,9 +33,9 @@
/** /**
* Configuration, directory layout and standard libraries * Configuration, directory layout and standard libraries
*/ */
require_once ROOT.'cake'.DS.'basics.php'; require_once 'cake'.DS.'basics.php';
require_once ROOT.APP_DIR.DS.'config'.DS.'core.php'; require_once ROOT.DS.APP_DIR.DS.'config'.DS.'core.php';
require_once ROOT.'cake'.DS.'config'.DS.'paths.php'; require_once 'cake'.DS.'config'.DS.'paths.php';
require_once LIBS.'object.php'; require_once LIBS.'object.php';
require_once LIBS.'session.php'; require_once LIBS.'session.php';
require_once LIBS.'security.php'; require_once LIBS.'security.php';

View file

@ -36,65 +36,65 @@
*/ */
if(!defined('ROOT')) if(!defined('ROOT'))
{ {
define ('ROOT', '../'); define ('ROOT', '../');
} }
if(!defined('WEBROOT_DIR')) if(!defined('WEBROOT_DIR'))
{ {
define ('WEBROOT_DIR', 'webroot'); define ('WEBROOT_DIR', 'webroot');
} }
/** /**
* Path to the application's directory. * Path to the application's directory.
*/ */
define ('CAKE', ROOT.'cake'.DS); define ('CAKE', 'cake'.DS);
/** /**
* Path to the application's directory. * Path to the application's directory.
*/ */
define ('APP', ROOT.APP_DIR.DS); define ('APP', ROOT.DS.APP_DIR.DS);
/** /**
* Path to the application's models directory. * Path to the application's models directory.
*/ */
define ('MODELS', APP.'models'.DS); define ('MODELS', APP.'models'.DS);
/** /**
* Path to the application's controllers directory. * Path to the application's controllers directory.
*/ */
define ('CONTROLLERS', APP.'controllers'.DS); define ('CONTROLLERS', APP.'controllers'.DS);
/** /**
* Path to the application's controllers directory. * Path to the application's controllers directory.
*/ */
define ('COMPONENTS', CONTROLLERS.'components'.DS); define ('COMPONENTS', CONTROLLERS.'components'.DS);
/** /**
* Path to the application's views directory. * Path to the application's views directory.
*/ */
define ('VIEWS', APP.'views'.DS); define ('VIEWS', APP.'views'.DS);
/** /**
* Path to the application's helpers directory. * Path to the application's helpers directory.
*/ */
define ('HELPERS', VIEWS.'helpers'.DS); define ('HELPERS', VIEWS.'helpers'.DS);
/** /**
* Path to the application's view's layouts directory. * Path to the application's view's layouts directory.
*/ */
define ('LAYOUTS', VIEWS.'layouts'.DS); define ('LAYOUTS', VIEWS.'layouts'.DS);
/** /**
* Path to the application's view's elements directory. * Path to the application's view's elements directory.
* It's supposed to hold pieces of PHP/HTML that are used on multiple pages * It's supposed to hold pieces of PHP/HTML that are used on multiple pages
* and are not linked to a particular layout (like polls, footers and so on). * and are not linked to a particular layout (like polls, footers and so on).
*/ */
define ('ELEMENTS', VIEWS.'elements'.DS); define ('ELEMENTS', VIEWS.'elements'.DS);
/** /**
* Path to the configuration files directory. * Path to the configuration files directory.
*/ */
define ('CONFIGS', APP.'config'.DS); define ('CONFIGS', APP.'config'.DS);
/** /**
* Path to the libs directory. * Path to the libs directory.
@ -104,67 +104,67 @@ define ('INFLECTIONS', CAKE.'config'.DS.'inflections'.DS);
/** /**
* Path to the libs directory. * Path to the libs directory.
*/ */
define ('LIBS', CAKE.'libs'.DS); define ('LIBS', CAKE.'libs'.DS);
/** /**
* Path to the logs directory. * Path to the logs directory.
*/ */
define ('LOGS', ROOT.'logs'.DS); define ('LOGS', ROOT.DS.'logs'.DS);
/** /**
* Path to the modules directory. * Path to the modules directory.
*/ */
define ('MODULES', ROOT.'modules'.DS); define ('MODULES', ROOT.DS.'modules'.DS);
/** /**
* Path to the public directory. * Path to the public directory.
*/ */
define ('WWW_ROOT', APP.WEBROOT_DIR.DS); define ('WWW_ROOT', APP.WEBROOT_DIR.DS);
/** /**
* Path to the public directory. * Path to the public directory.
*/ */
define ('CSS', WWW_ROOT.'css'.DS); define ('CSS', WWW_ROOT.'css'.DS);
/** /**
* Path to the public directory. * Path to the public directory.
*/ */
define ('JS', WWW_ROOT.'js'.DS); define ('JS', WWW_ROOT.'js'.DS);
/** /**
* Path to the scripts direcotry. * Path to the scripts direcotry.
*/ */
define('SCRIPTS', CAKE.'scripts'.DS); define('SCRIPTS', CAKE.'scripts'.DS);
/** /**
* Path to the tests directory. * Path to the tests directory.
*/ */
define ('TESTS', ROOT.'tests'.DS); define ('TESTS', ROOT.DS.'tests'.DS);
/** /**
* Path to the controller test directory. * Path to the controller test directory.
*/ */
define ('CONTROLLER_TESTS',TESTS.APP_DIR.DS.'controllers'.DS); define ('CONTROLLER_TESTS', TESTS.APP_DIR.DS.'controllers'.DS);
/** /**
* Path to the helpers test directory. * Path to the helpers test directory.
*/ */
define ('HELPER_TESTS', TESTS.APP_DIR.DS.'helpers'.DS); define ('HELPER_TESTS', TESTS.APP_DIR.DS.'helpers'.DS);
/** /**
* Path to the models' test directory. * Path to the models' test directory.
*/ */
define ('MODEL_TESTS', TESTS.APP_DIR.DS.'models'.DS); define ('MODEL_TESTS', TESTS.APP_DIR.DS.'models'.DS);
/** /**
* Path to the lib test directory. * Path to the lib test directory.
*/ */
define ('LIB_TESTS', TESTS.'libs'.DS); define ('LIB_TESTS', TESTS.'libs'.DS);
/** /**
* Path to the temporary files directory. * Path to the temporary files directory.
*/ */
define ('TMP', ROOT.'tmp'.DS); define ('TMP', APP.'tmp'.DS);
/** /**
* Path to the cache files directory. It can be shared between hosts in a multi-server setup. * Path to the cache files directory. It can be shared between hosts in a multi-server setup.
@ -174,14 +174,14 @@ define('CACHE', TMP.'cache'.DS);
/** /**
* Path to the vendors directory. * Path to the vendors directory.
*/ */
define ('VENDORS', ROOT.'vendors'.DS); define ('VENDORS', ROOT.DS.'vendors'.DS);
/** /**
* Path to the Pear directory * Path to the Pear directory
* The purporse is to make it easy porting Pear libs into Cake * The purporse is to make it easy porting Pear libs into Cake
* without setting the include_path PHP variable. * without setting the include_path PHP variable.
*/ */
define ('PEAR', VENDORS.'Pear'.DS); define ('PEAR', VENDORS.'Pear'.DS);
/** /**
* Full url prefix * Full url prefix
@ -203,17 +203,17 @@ unset($httpHost);
/** /**
* Web path to the public images directory. * Web path to the public images directory.
*/ */
define ('IMAGES_URL', 'img/'); define ('IMAGES_URL', 'img/');
/** /**
* Web path to the CSS files directory. * Web path to the CSS files directory.
*/ */
define ('CSS_URL', 'css/'); define ('CSS_URL', 'css/');
/** /**
* Web path to the js files directory. * Web path to the js files directory.
*/ */
define ('JS_URL', 'js/'); define ('JS_URL', 'js/');
?> ?>

View file

@ -99,9 +99,9 @@ class Component extends Object
{ {
$componentFn = COMPONENTS.$componentFn; $componentFn = COMPONENTS.$componentFn;
} }
else if(file_exists(LIBS.'controller'.DS.'components'.DS.$componentFn)) else if($componentFn = fileExistsInPath(LIBS.'controller'.DS.'components'.DS.$componentFn))
{ {
$componentFn = LIBS.'controller'.DS.'components'.DS.$componentFn;
} }
$componentCn = $component.'Component'; $componentCn = $component.'Component';

View file

@ -454,9 +454,9 @@ class Controller extends Object
$ref = env('HTTP_REFERER'); $ref = env('HTTP_REFERER');
$base = FULL_BASE_URL . $this->webroot; $base = FULL_BASE_URL . $this->webroot;
if ($ref != null && defined(FULL_BASE_URL)) if ($ref != null && (defined(FULL_BASE_URL) || FULL_BASE_URL))
{ {
if (strpos(env('HTTP_REFERER'), $base) == 0) if (strpos($ref, $base) === 0)
{ {
return substr($ref, strlen($base) - 1); return substr($ref, strlen($base) - 1);
} }
@ -594,7 +594,7 @@ class Controller extends Object
$fieldNames[ $tabl['name'] ]['prompt'] = Inflector::humanize($alias.$niceName); $fieldNames[ $tabl['name'] ]['prompt'] = Inflector::humanize($alias.$niceName);
$fieldNames[ $tabl['name'] ]['model'] = $fkNames[1]; $fieldNames[ $tabl['name'] ]['model'] = $fkNames[1];
$fieldNames[ $tabl['name'] ]['modelKey'] = $this->{$model}->tableToModel[$fieldNames[ $tabl['name'] ]['table']]; $fieldNames[ $tabl['name'] ]['modelKey'] = $this->{$model}->tableToModel[$fieldNames[ $tabl['name'] ]['table']];
$fieldNames[ $tabl['name'] ]['controller'] = Inflector::pluralize($this->{$model}->tableToModel[Inflector::pluralize($fkNames[0])]); $fieldNames[ $tabl['name'] ]['controller'] = Inflector::pluralize($this->{$model}->tableToModel[$fkNames[0]]);
$fieldNames[ $tabl['name'] ]['foreignKey'] = true; $fieldNames[ $tabl['name'] ]['foreignKey'] = true;
} }
else if( 'created' != $tabl['name'] && 'updated' != $tabl['name'] ) else if( 'created' != $tabl['name'] && 'updated' != $tabl['name'] )

View file

@ -117,7 +117,7 @@ class ConnectionManager extends Object
} }
$tail = 'dbo'.DS.$filename.'.php'; $tail = 'dbo'.DS.$filename.'.php';
if (file_exists(LIBS.'model'.DS.$tail)) if (fileExistsInPath(LIBS.'model'.DS.$tail))
{ {
require_once(LIBS.'model'.DS.$tail); require_once(LIBS.'model'.DS.$tail);
} }

View file

@ -395,14 +395,14 @@ class DboSource extends DataSource
{ {
if (true === $this->generateSelfAssociationQuery($model, $linkModel, $type, $assoc, $assocData, $queryData, false, $null)) if (true === $this->generateSelfAssociationQuery($model, $linkModel, $type, $assoc, $assocData, $queryData, false, $null))
{ {
$linkedModels[] = $type.$assoc; $linkedModels[] = $type.'/'.$assoc;
} }
} }
else else
{ {
if (true === $this->generateAssociationQuery($model, $linkModel, $type, $assoc, $assocData, $queryData, false, $null)) if (true === $this->generateAssociationQuery($model, $linkModel, $type, $assoc, $assocData, $queryData, false, $null))
{ {
$linkedModels[] = $type.$assoc; $linkedModels[] = $type.'/'.$assoc;
} }
} }
} }
@ -419,62 +419,15 @@ class DboSource extends DataSource
{ {
foreach($model->{$type} as $assoc => $assocData) foreach($model->{$type} as $assoc => $assocData)
{ {
if (!in_array($type.$assoc, $linkedModels)) if (!in_array($type.'/'.$assoc, $linkedModels))
{ {
$linkModel =& $model->{$assocData['className']}; $linkModel =& $model->{$assocData['className']};
$this->queryAssociation($model, $linkModel, $type, $assoc, $assocData, $array, true, $resultSet); $this->queryAssociation($model, $linkModel, $type, $assoc, $assocData, $array, true, $resultSet, $model->recursive);
} else {
if ($model->recursive > 1 && $linkModel->recursive > 0) // Fetch recursively on belongsTo and hasOne
if ($model->recursive > 1)
{ {
foreach($linkModel->__associations as $type1) //$this->queryAssociation($model, $linkModel, $type, $assoc, $assocData, $array, true, $resultSet, $model->recursive - 1);
{
foreach($linkModel->{$type1} as $assoc1 => $assocData1)
{
$deepModel =& $linkModel->{$assocData1['className']};
if ($assoc1 != $model->name)
{
foreach ($resultSet as $i => $data)
{
if (isset($data[$linkModel->name]))
{
foreach ($resultSet[$i][$linkModel->name] as $value)
{
$datas[][$linkModel->name] = $value[$linkModel->primaryKey];
$fetch = $this->queryDeepAssociation($linkModel, $deepModel, $type1, $assoc1, $assocData1, $array, true, $datas);
unset($datas);
if (!empty($fetch[0]))
{
foreach ($fetch as $j => $row1)
{
if(!empty($row1))
{
foreach ($resultSet as $valueResult => $endResult)
{
$count = 0;
foreach ($endResult[$linkModel->name] as $keyCheck)
{
foreach ($row1 as $mas)
{
if($keyCheck[$linkModel->primaryKey] == $mas[$deepModel->name][$assocData1['foreignKey']])
{
$resultSet[$i][$linkModel->name][$count][$deepModel->name][] = $mas[$deepModel->name];
}
}
$count++;
}
}
}
}
}
unset($fetch);
}
}
}
}
}
}
} }
} }
} }
@ -488,20 +441,6 @@ class DboSource extends DataSource
return $resultSet; return $resultSet;
} }
function queryDeepAssociation(&$model, &$linkModel, $type, $association, $assocData, &$queryData, $external = false, &$resultSet)
{
$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);
}
return $fetch;
}
}
/** /**
* Enter description here... * Enter description here...
* *
@ -515,7 +454,7 @@ class DboSource extends DataSource
* @param unknown_type $resultSet * @param unknown_type $resultSet
* @param integer $recursive Number of levels of association * @param integer $recursive Number of levels of association
*/ */
function queryAssociation(&$model, &$linkModel, $type, $association, $assocData, &$queryData, $external = false, &$resultSet) function queryAssociation(&$model, &$linkModel, $type, $association, $assocData, &$queryData, $external = false, &$resultSet, $recursive)
{ {
$query = $this->generateAssociationQuery($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet); $query = $this->generateAssociationQuery($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet);
if ($query) if ($query)
@ -527,21 +466,58 @@ class DboSource extends DataSource
if (!empty($fetch) && is_array($fetch)) if (!empty($fetch) && is_array($fetch))
{ {
if (isset($fetch[0][$association])) if ($recursive > 0)
{ {
foreach ($fetch as $j => $row) foreach($linkModel->__associations as $type1)
{ {
$resultSet[$i][$association][$j] = $row[$association]; if ($recursive > 1)
} {
} foreach($linkModel->{$type1} as $assoc1 => $assocData1)
else {
{ $deepModel =& $linkModel->{$assocData1['className']};
$plural = Inflector::pluralize($association); if ($deepModel->name != $model->name)
foreach ($fetch as $j => $row) {
{ $this->queryAssociation($linkModel, $deepModel, $type1, $assoc1, $assocData1, $queryData, true, $fetch, $recursive - 1);
$resultSet[$i][$plural][$j] = $row[$plural]; }
}
}
} }
} }
$this->__mergeAssociation($resultSet[$i], $fetch, $association, $type);
}
}
}
}
function __mergeAssociation(&$data, $merge, $association, $type)
{
if (isset($merge[0]) && !isset($merge[0][$association]))
{
$association = Inflector::pluralize($association);
}
if ($type == 'belongsTo' || $type == 'hasOne')
{
if (isset($merge[$association]))
{
$data[$association] = $merge[$association][0];
}
else
{
$data[$association] = $merge[0][$association];
}
}
else
{
foreach ($merge as $i => $row)
{
if (count($row) == 1)
{
$data[$association][] = $row[$association];
}
else
{
$data[$association][] = $row;
} }
} }
} }
@ -726,11 +702,12 @@ class DboSource extends DataSource
case 'belongsTo': case 'belongsTo':
if ($external) if ($external)
{ {
$conditions = $assocData['conditions'];
$sql = 'SELECT * FROM '.$this->name($linkModel->table).' AS '.$this->name($alias); $sql = 'SELECT * FROM '.$this->name($linkModel->table).' AS '.$this->name($alias);
$conditions = $assocData['conditions'];
$condition = $linkModel->escapeField($assocData['foreignKey']); $condition = $linkModel->escapeField($linkModel->primaryKey);
$condition .= '={$__cake_id__$}'; $condition .= '={$__cake_id__$}';
if (is_array($conditions)) if (is_array($conditions))
{ {
$conditions[] = $condition; $conditions[] = $condition;
@ -743,8 +720,11 @@ class DboSource extends DataSource
} }
$conditions .= $condition; $conditions .= $condition;
} }
$sql .= $this->conditions($queryData['conditions']) . $this->order($queryData['order']); $sql .= $this->conditions($conditions) . $this->order($assocData['order']);
$sql .= $this->limit($queryData['limit']); if (isset($assocData['limit']))
{
$sql .= $this->limit($assocData['limit']);
}
return $sql; return $sql;
} }
else if($joinedOnSelf != true) else if($joinedOnSelf != true)
@ -995,7 +975,7 @@ class DboSource extends DataSource
} }
$count = count($fields); $count = count($fields);
if ($count > 1 && $fields[0] != '*') if ($count >= 1 && $fields[0] != '*' && strpos($fields[0], 'COUNT(*)') === false)
{ {
for ($i = 0; $i < $count; $i++) for ($i = 0; $i < $count; $i++)
{ {
@ -1041,27 +1021,27 @@ class DboSource extends DataSource
$out = array(); $out = array();
foreach ($conditions as $key => $value) foreach ($conditions as $key => $value)
{ {
// Treat multiple values as an IN condition. if (is_array($value))
if (is_array($value)) {
{ $data = $key . ' IN (';
$data = $key . ' IN ('; foreach ($value as $valElement)
foreach ($value as $valElement) {
{ $data .= $this->value($valElement) . ', ';
$data .= $this->value($valElement) . ', '; }
} $data[strlen($data)-2] = ')';
// Remove trailing ',' and complete clause. }
$data[strlen($data)-2] = ')'; elseif (preg_match('/(?P<expression>LIKE\\x20|=\\x20|>\\x20|<\\x20|<=\\x20|>=\\x20|<>\\x20)(?P<value>.*)/i', $value, $match))
} {
else $data = $this->name($key) . ' '.$match['expression'].' '. $this->value($match['value']);
{ }
if (($value != '{$__cake_id__$}') && ($value != '{$__cake_foreignKey__$}')) else
{
if (($value != '{$__cake_id__$}') && ($value != '{$__cake_foreignKey__$}'))
{ {
$value = $this->value($value); $value = $this->value($value);
} }
$data = $this->name($key) . '=';
//$slashedValue = $this->value($value);
//TODO: Remove the = below so LIKE and other compares can be used
$data = $key . '=';
if ($value === null) if ($value === null)
{ {
$data .= 'null'; $data .= 'null';
@ -1070,7 +1050,7 @@ class DboSource extends DataSource
{ {
$data .= $value; $data .= $value;
} }
} }
$out[] = $data; $out[] = $data;
} }
return ' WHERE ' . join(' AND ', $out); return ' WHERE ' . join(' AND ', $out);
@ -1096,13 +1076,39 @@ class DboSource extends DataSource
* @param string $dir Direction (ASC or DESC) * @param string $dir Direction (ASC or DESC)
* @return string ORDER BY clause * @return string ORDER BY clause
*/ */
function order ($key, $dir = '') function order ($keys, $dir = '')
{ {
if (trim($key) == '') if (empty($keys))
{ {
return ''; return '';
} }
return ' ORDER BY '.$key.' '.$dir;
if(is_array($keys))
{
foreach($keys as $key => $value)
{
if(is_numeric($key))
{
$key = $value;
$value = null;
}
else
{
$value= ' '.$value;
}
$order[] = $this->name($key).$value;
}
return ' ORDER BY '.join(',', $order);
}
else
{
if (preg_match('/(?P<direction>\\x20ASC|\\x20DESC)/', $keys, $match))
{
$dir = $match['direction'];
$keys = preg_replace('/'.$match['direction'].'/', '', $keys);
}
return ' ORDER BY '.$this->name($keys).$dir;
}
} }
/** /**
@ -1116,7 +1122,6 @@ class DboSource extends DataSource
{ {
$this->showLog(); $this->showLog();
} }
//$this->disconnect();
$this->_conn = NULL; $this->_conn = NULL;
$this->connected = false; $this->connected = false;
} }

View file

@ -218,7 +218,7 @@ class DboMysql extends DboSource
* @param string $tableName Name of database table to inspect * @param string $tableName Name of database table to inspect
* @return array Fields in table. Keys are name and type * @return array Fields in table. Keys are name and type
*/ */
function &describe (&$model) function describe (&$model)
{ {
$cache = parent::describe($model); $cache = parent::describe($model);
if ($cache != null) if ($cache != null)
@ -238,7 +238,7 @@ class DboMysql extends DboSource
} }
if (isset($column[0])) if (isset($column[0]))
{ {
$fields[] = array('name' => $column[0]['Field'], 'type' => $column[0]['Type']); $fields[] = array('name' => $column[0]['Field'], 'type' => $column[0]['Type'], 'null' => $column[0]['Null']);
} }
} }
$this->__cacheDescription($model->table, $fields); $this->__cacheDescription($model->table, $fields);
@ -291,7 +291,14 @@ class DboMysql extends DboSource
{ {
$data = mysql_real_escape_string($data, $this->connection); $data = mysql_real_escape_string($data, $this->connection);
} }
$return = "'" . $data . "'"; if(!is_numeric($data))
{
$return = "'" . $data . "'";
}
else
{
$return = $data;
}
return $return; return $return;
} }

View file

@ -45,7 +45,6 @@ uses('model'.DS.'datasources'.DS.'dbo_source');
class DboPostgres extends DboSource class DboPostgres extends DboSource
{ {
var $description = "PostgreSQL DBO Driver"; var $description = "PostgreSQL DBO Driver";
var $_baseConfig = array('persistent' => true, var $_baseConfig = array('persistent' => true,
@ -53,8 +52,7 @@ class DboPostgres extends DboSource
'login' => 'root', 'login' => 'root',
'password' => '', 'password' => '',
'database' => 'cake', 'database' => 'cake',
'port' => 3306 'port' => 3306);
);
var $columns = array( var $columns = array(
'primary_key' => array('name' => 'serial primary key'), 'primary_key' => array('name' => 'serial primary key'),
@ -67,10 +65,8 @@ class DboPostgres extends DboSource
'time' => array('name' => 'time'), 'time' => array('name' => 'time'),
'date' => array('name' => 'date'), 'date' => array('name' => 'date'),
'binary' => array('name' => 'bytea'), 'binary' => array('name' => 'bytea'),
'boolean' => array('name' => 'boolean') 'boolean' => array('name' => 'boolean'),
); 'number' => array('name' => 'numeric'));
/** /**
* Connects to the database using options in the given configuration array. * Connects to the database using options in the given configuration array.
@ -119,10 +115,6 @@ class DboPostgres extends DboSource
function query () function query ()
{ {
$args = func_get_args(); $args = func_get_args();
echo "<pre>";
print_r($args);
echo "</pre>";
die();
if (count($args) == 1) if (count($args) == 1)
{ {
return $this->fetchAll($args[0]); return $this->fetchAll($args[0]);
@ -130,13 +122,13 @@ class DboPostgres extends DboSource
elseif (count($args) > 1 && strpos($args[0], 'findBy') === 0) elseif (count($args) > 1 && strpos($args[0], 'findBy') === 0)
{ {
$field = Inflector::underscore(str_replace('findBy', '', $args[0])); $field = Inflector::underscore(str_replace('findBy', '', $args[0]));
$query = '`' . $args[2]->name . '`.`' . $field . '` = ' . $this->value($args[1][0]); $query = '"' . $args[2]->name . '"."' . $field . '" = ' . $this->value($args[1][0]);
return $args[2]->find($query); return $args[2]->find($query);
} }
elseif (count($args) > 1 && strpos($args[0], 'findAllBy') === 0) elseif (count($args) > 1 && strpos($args[0], 'findAllBy') === 0)
{ {
$field = Inflector::underscore(str_replace('findAllBy', '', $args[0])); $field = Inflector::underscore(str_replace('findAllBy', '', $args[0]));
$query = '`' . $args[2]->name . '`.`' . $field . '` = ' . $this->value($args[1][0]); $query = '"' . $args[2]->name . '"."' . $field . '" = ' . $this->value($args[1][0]);
return $args[2]->findAll($query); return $args[2]->findAll($query);
} }
} }
@ -146,9 +138,10 @@ class DboPostgres extends DboSource
* *
* @return array The fetched row as an array * @return array The fetched row as an array
*/ */
function fetchRow () function fetchRow ($assoc = false)
{ {
return pg_fetch_array($this->_result); $assoc = ($assoc === false) ? PGSQL_BOTH : PGSQL_ASSOC;
return pg_fetch_array($this->_result, null, $assoc);
} }
/** /**
@ -158,29 +151,23 @@ class DboPostgres extends DboSource
*/ */
function listSources () function listSources ()
{ {
$sql = "SELECT a.relname AS name $sql = "SELECT table_name as name FROM information_schema.tables WHERE table_schema = 'public';";
FROM pg_class a, pg_user b
WHERE ( relkind = 'r') and relname !~ '^pg_' AND relname !~ '^sql_'
AND relname !~ '^xin[vx][0-9]+' AND b.usesysid = a.relowner
AND NOT (EXISTS (SELECT viewname FROM pg_views WHERE viewname=a.relname));";
$this->execute($sql); $result = $this->query($sql);
$result = $this->fetchRow();
if (!$result) if (!$result)
{ {
return null; return null;
} }
else else
{ {
$tables = array(); $tables = array();
$tables[] = $result['name']; foreach ($result as $item)
while ($row = $this->fetchRow()) {
{ $tables[] = $item['name'];
$tables[] = $row['name']; }
} return $tables;
return $tables; }
}
} }
/** /**
@ -203,6 +190,28 @@ class DboPostgres extends DboSource
return $fields; return $fields;
} }
/**
* Returns an array of the fields in given table name.
*
* @param string $tableName Name of database table to inspect
* @return array Fields in table. Keys are name and type
*/
function &describe (&$model)
{
$cache = parent::describe($model);
if ($cache != null)
{
return $cache;
}
$fields = false;
$fields = $this->query("SELECT column_name as name, data_type as type FROM information_schema.columns WHERE table_name =".$this->name($model->table));
$this->__cacheDescription($model->table, $fields);
return $fields;
}
/** /**
* Returns a quoted and escaped string of $data for use in an SQL statement. * Returns a quoted and escaped string of $data for use in an SQL statement.
* *

View file

@ -586,6 +586,23 @@ class Model extends Object
return $this->_tableInfo; return $this->_tableInfo;
} }
/**
* Returns an associative array of field names and column types.
*
* @return array
*/
function getColumnTypes ()
{
$columns = $this->loadInfo();
$columns = $columns->value;
$cols = array();
foreach($columns as $col) {
$cols[$col['name']] = $col['type'];
}
return $cols;
}
/** /**
* Returns true if given field name exists in this Model's database table. * Returns true if given field name exists in this Model's database table.
* Starts by loading the metadata into the private property table_info if that is not already set. * Starts by loading the metadata into the private property table_info if that is not already set.
@ -836,6 +853,7 @@ class Model extends Object
if(!$this->id > 0 && isset($newID)) if(!$this->id > 0 && isset($newID))
{ {
$this->__insertID = $newID;
$this->id = $newID; $this->id = $newID;
} }

View file

@ -583,6 +583,23 @@ class Model extends Object
return $this->_tableInfo; return $this->_tableInfo;
} }
/**
* Returns an associative array of field names and column types.
*
* @return array
*/
function getColumnTypes ()
{
$columns = $this->loadInfo();
$columns = $columns->value;
$cols = array();
foreach($columns as $col) {
$cols[$col['name']] = $col['type'];
}
return $cols;
}
/** /**
* Returns true if this Model has given field in its database table. * Returns true if this Model has given field in its database table.
* *
@ -832,6 +849,7 @@ class Model extends Object
if(!$this->id > 0 && isset($newID)) if(!$this->id > 0 && isset($newID))
{ {
$this->__insertID = $newID;
$this->id = $newID; $this->id = $newID;
} }

View file

@ -80,7 +80,7 @@ class Helper extends Object
function loadConfig() function loadConfig()
{ {
return $this->readConfigFile(CAKE.'config'.DS.'tags.ini.php'); return $this->readConfigFile($config = fileExistsInPath(CAKE.'config'.DS.'tags.ini.php'));
} }
/** /**

View file

@ -85,8 +85,8 @@ class FormHelper extends Helper
if( $error == $this->Html->tagIsInvalid( $this->Html->model, $this->Html->field) ) if( $error == $this->Html->tagIsInvalid( $this->Html->model, $this->Html->field) )
{ {
return true; return true;
} }
else else
{ {
return false; return false;
} }
@ -137,7 +137,7 @@ class FormHelper extends Helper
* @param string $errorMsg Text that will appear if an error has occurred. * @param string $errorMsg Text that will appear if an error has occurred.
* @param int $size Size attribute for INPUT element * @param int $size Size attribute for INPUT element
* @param array $htmlOptions HTML options array. * @param array $htmlOptions HTML options array.
* @return string The formatted INPUT element, with a label and wrapped in a div. * @return string The formatted INPUT element, with a label and wrapped in a div.
*/ */
function generateInputDiv($tagName, $prompt, $required=false, $errorMsg=null, $size=20, $htmlOptions=null ) function generateInputDiv($tagName, $prompt, $required=false, $errorMsg=null, $size=20, $htmlOptions=null )
{ {
@ -214,7 +214,7 @@ class FormHelper extends Helper
* @param array $htmlOptions HTML options array * @param array $htmlOptions HTML options array
* @return string Date option wrapped in a div. * @return string Date option wrapped in a div.
*/ */
function generateDate($tagName, $prompt, $required=false, $errorMsg=null, $size=20, $htmlOptions=null, $selected ) function generateDate($tagName, $prompt, $required=false, $errorMsg=null, $size=20, $htmlOptions=null, $selected=null )
{ {
$htmlOptions['id'] = strtolower(str_replace('/', '_',$tagName));; $htmlOptions['id'] = strtolower(str_replace('/', '_',$tagName));;
$str = $this->Html->dateTimeOptionTag( $tagName, 'MDY' , 'NONE', $selected, $htmlOptions); $str = $this->Html->dateTimeOptionTag( $tagName, 'MDY' , 'NONE', $selected, $htmlOptions);

View file

@ -290,7 +290,14 @@ class HtmlHelper extends Helper
if ($this->tagIsInvalid($this->model, $this->field)) if ($this->tagIsInvalid($this->model, $this->field))
{ {
$htmlAttributes['class'] = 'form_error'; if (isset($htmlAttributes['class']) && trim($htmlAttributes['class']) != "")
{
$htmlAttributes['class'] .= ' form_error';
}
else
{
$htmlAttributes['class'] = 'form_error';
}
} }
return $this->output(sprintf($this->tags['textarea'], $this->model,$this->field, return $this->output(sprintf($this->tags['textarea'], $this->model,$this->field,
@ -450,9 +457,21 @@ class HtmlHelper extends Helper
$htmlAttributes['type'] = 'text'; $htmlAttributes['type'] = 'text';
} }
if (!isset($htmlAttributes['id']))
{
$htmlAttributes['id'] = $this->model.Inflector::camelize($this->field);
}
if ($this->tagIsInvalid($this->model, $this->field)) if ($this->tagIsInvalid($this->model, $this->field))
{ {
$htmlAttributes['class'] = 'form_error'; if (isset($htmlAttributes['class']) && trim($htmlAttributes['class']) != "")
{
$htmlAttributes['class'] .= ' form_error';
}
else
{
$htmlAttributes['class'] = 'form_error';
}
} }
return $this->output(sprintf($this->tags['input'], $this->model, $this->field, return $this->output(sprintf($this->tags['input'], $this->model, $this->field,

View file

@ -281,7 +281,7 @@ class View extends Object
return $this->pluginView($action, $layout); return $this->pluginView($action, $layout);
} }
if (!is_file($viewFileName)) if (!is_file($viewFileName) && !$viewFileName = fileExistsInPath($viewFileName))
{ {
if (strtolower(get_class($this)) == 'template') if (strtolower(get_class($this)) == 'template')
{ {
@ -306,9 +306,8 @@ class View extends Object
{ {
$missingViewFileName = VIEWS.$viewDir.DS.$errorAction.$this->ext; $missingViewFileName = VIEWS.$viewDir.DS.$errorAction.$this->ext;
} }
elseif(file_exists(LIBS.'view'.DS.'templates'.DS.$viewDir.DS.$errorAction.'.thtml')) elseif($missingViewFileName = fileExistsInPath(LIBS.'view'.DS.'templates'.DS.$viewDir.DS.$errorAction.'.thtml'))
{ {
$missingViewFileName = LIBS.'view'.DS.'templates'.DS.$viewDir.DS.$errorAction.'.thtml';
} }
else else
{ {
@ -535,20 +534,19 @@ class View extends Object
{ {
$viewFileName = VIEWS.'errors'.DS.$this->subDir.$type.$action.$this->ext; $viewFileName = VIEWS.'errors'.DS.$this->subDir.$type.$action.$this->ext;
} }
elseif(file_exists(LIBS.'view'.DS.'templates'.DS.'errors'.DS.$type.$action.'.thtml')) elseif($viewFileName = fileExistsInPath(LIBS.'view'.DS.'templates'.DS.'errors'.DS.$type.$action.'.thtml'))
{ {
$viewFileName = LIBS.'view'.DS.'templates'.DS.'errors'.DS.$type.$action.'.thtml';
} }
elseif(file_exists(LIBS.'view'.DS.'templates'.DS.$this->viewPath.DS.$type.$action.'.thtml')) elseif($viewFileName = fileExistsInPath(LIBS.'view'.DS.'templates'.DS.$this->viewPath.DS.$type.$action.'.thtml'))
{ {
$viewFileName = LIBS.'view'.DS.'templates'.DS.$this->viewPath.DS.$type.$action.'.thtml';
} }
$viewPath = explode(DS, $viewFileName); $viewPath = explode(DS, $viewFileName);
$i = array_search('..', $viewPath); $i = array_search('..', $viewPath);
unset($viewPath[$i-1]); unset($viewPath[$i-1]);
unset($viewPath[$i]); unset($viewPath[$i]);
$return = '/'.implode('/', $viewPath); $return = '/'.implode('/', $viewPath);
return $return; return $return;
} }
@ -585,9 +583,8 @@ class View extends Object
{ {
$layoutFileName = LAYOUTS.$this->subDir.$type."{$this->layout}$this->ext"; $layoutFileName = LAYOUTS.$this->subDir.$type."{$this->layout}$this->ext";
} }
elseif(file_exists(LIBS.'view'.DS.'templates'.DS."layouts".DS.$type."{$this->layout}.thtml")) elseif($layoutFileName = fileExistsInPath(LIBS.'view'.DS.'templates'.DS."layouts".DS.$type."{$this->layout}.thtml"))
{ {
$layoutFileName = LIBS.'view'.DS.'templates'.DS."layouts".DS.$type."{$this->layout}.thtml";
} }
return $layoutFileName; return $layoutFileName;
} }
@ -684,9 +681,9 @@ class View extends Object
{ {
$helperFn = HELPERS.$helperFn; $helperFn = HELPERS.$helperFn;
} }
else if(file_exists(LIBS.'view'.DS.'helpers'.DS.$helperFn)) else if($helperFn = fileExistsInPath(LIBS.'view'.DS.'helpers'.DS.$helperFn))
{ {
$helperFn = LIBS.'view'.DS.'helpers'.DS.$helperFn;
} }
if (is_file($helperFn)) if (is_file($helperFn))
{ {

View file

@ -3,7 +3,7 @@
/** /**
* Requests collector. * Requests collector.
* *
* This file collects requests if: * This file collects requests if:
* - no mod_rewrite is avilable or .htaccess files are not supported * - no mod_rewrite is avilable or .htaccess files are not supported
* - /public is not set as a web root. * - /public is not set as a web root.
@ -11,14 +11,14 @@
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP : Rapid Development Framework <http://www.cakephp.org/> * CakePHP : Rapid Development Framework <http://www.cakephp.org/>
* Copyright (c) 2006, Cake Software Foundation, Inc. * Copyright (c) 2006, Cake Software Foundation, Inc.
* 1785 E. Sahara Avenue, Suite 490-204 * 1785 E. Sahara Avenue, Suite 490-204
* Las Vegas, Nevada 89104 * Las Vegas, Nevada 89104
* *
* Licensed under The MIT License * Licensed under The MIT License
* Redistributions of files must retain the above copyright notice. * Redistributions of files must retain the above copyright notice.
* *
* @filesource * @filesource
* @copyright Copyright (c) 2006, Cake Software Foundation, Inc. * @copyright Copyright (c) 2006, Cake Software Foundation, Inc.
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP Project
* @package cake * @package cake
@ -36,16 +36,28 @@ define ('APP_DIR', 'app');
define ('DS', DIRECTORY_SEPARATOR); define ('DS', DIRECTORY_SEPARATOR);
define ('ROOT', dirname(__FILE__).DS); define ('ROOT', dirname(__FILE__).DS);
require_once ROOT.'cake'.DS.'basics.php'; /**
require_once ROOT.APP_DIR.DS.'config'.DS.'core.php'; * This only needs to be changed if the cake installed libs are located
require_once ROOT.'cake'.DS.'config'.DS.'paths.php'; * outside of the distributed directory structure.
*/
if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
//define ('CAKE_CORE_INCLUDE_PATH', FULL PATH TO DIRECTORY WHERE CAKE CORE IS INSTALLED DO NOT ADD A TRAILING DIRECTORY SEPARATOR';
define('CAKE_CORE_INCLUDE_PATH', ROOT);
}
ini_set('include_path',ini_get('include_path').PATH_SEPARATOR.CAKE_CORE_INCLUDE_PATH.PATH_SEPARATOR.ROOT.DS.APP_DIR.DS);
require_once 'cake'.DS.'basics.php';
require_once 'config'.DS.'core.php';
require_once 'cake'.DS.'config'.DS.'paths.php';
$uri = setUri(); $uri = setUri();
/** /**
* As mod_rewrite (or .htaccess files) is not working, we need to take care * As mod_rewrite (or .htaccess files) is not working, we need to take care
* of what would normally be rewritten, i.e. the static files in /public * of what would normally be rewritten, i.e. the static files in app/webroot/
*/ */
if ($uri === '/' || $uri === '/index.php') if ($uri === '/' || $uri === '/index.php')
{ {