merging 1.3-misc into master

This commit is contained in:
gwoo 2009-05-01 14:05:46 -07:00
parent 1f7eb18107
commit 15518b8c9a
17 changed files with 782 additions and 458 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
app/config
app/tmp app/tmp
vendors vendors

View file

@ -1,5 +1,4 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* This is core configuration file. * This is core configuration file.
* *
@ -7,22 +6,18 @@
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @subpackage cake.app.config * @subpackage cake.app.config
* @since CakePHP(tm) v 0.2.9 * @since CakePHP(tm) v 0.2.9
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
* In this file you set up your database connection details. * In this file you set up your database connection details.

View file

@ -1,27 +1,22 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* Short description for file. * Index
* *
* Long description for file * The Front Controller for handling every request
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @subpackage cake.app.webroot * @subpackage cake.app.webroot
* @since CakePHP(tm) v 0.2.9 * @since CakePHP(tm) v 0.2.9
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License * @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
@ -85,7 +80,7 @@
return; return;
} else { } else {
$Dispatcher = new Dispatcher(); $Dispatcher = new Dispatcher();
$Dispatcher->dispatch($url); $Dispatcher->dispatch();
} }
if (Configure::read() > 0) { if (Configure::read() > 0) {
echo "<!-- " . round(getMicrotime() - $TIME_START, 4) . "s -->"; echo "<!-- " . round(getMicrotime() - $TIME_START, 4) . "s -->";

View file

@ -1,48 +1,35 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* Basic Cake functionality. * Basic Cake functionality.
* *
* Core functions for including other source files, loading models and so forth. * Handles loading of core files needed on every request
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @subpackage cake.cake * @subpackage cake.cake
* @since CakePHP(tm) v 0.2.9 * @since CakePHP(tm) v 0.2.9
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
if (!defined('PHP5')) { if (!defined('PHP5')) {
define('PHP5', (PHP_VERSION >= 5)); define('PHP5', (PHP_VERSION >= 5));
} }
/** require CORE_PATH . 'cake' . DS . 'basics.php';
* Configuration, directory layout and standard libraries $TIME_START = getMicrotime();
*/ require CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php';
if (!isset($bootstrap)) { require LIBS . 'object.php';
require CORE_PATH . 'cake' . DS . 'basics.php'; require LIBS . 'inflector.php';
$TIME_START = getMicrotime(); require LIBS . 'configure.php';
require CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php'; require LIBS . 'set.php';
require LIBS . 'object.php'; require LIBS . 'cache.php';
require LIBS . 'inflector.php'; Configure::getInstance();
require LIBS . 'configure.php'; require CAKE . 'dispatcher.php';
}
require LIBS . 'cache.php';
Configure::getInstance();
$url = null;
App::import('Core', array('Dispatcher'));
?> ?>

View file

@ -375,7 +375,7 @@ class ControllerTask extends Shell {
$actions .= "\t\t\t\$this->flash(__('Invalid {$singularHumanName}', true), array('action'=>'index'));\n"; $actions .= "\t\t\t\$this->flash(__('Invalid {$singularHumanName}', true), array('action'=>'index'));\n";
} }
$actions .= "\t\t}\n"; $actions .= "\t\t}\n";
$actions .= "\t\tif (\$this->{$currentModelName}->del(\$id)) {\n"; $actions .= "\t\tif (\$this->{$currentModelName}->delete(\$id)) {\n";
if ($wannaUseSession) { if ($wannaUseSession) {
$actions .= "\t\t\t\$this->Session->setFlash(__('{$singularHumanName} deleted', true));\n"; $actions .= "\t\t\t\$this->Session->setFlash(__('{$singularHumanName} deleted', true));\n";
$actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n"; $actions .= "\t\t\t\$this->redirect(array('action'=>'index'));\n";

View file

@ -1,26 +1,21 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* Base controller class. * Base controller class.
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @subpackage cake.cake.libs.controller * @subpackage cake.cake.libs.controller
* @since CakePHP(tm) v 0.2.9 * @since CakePHP(tm) v 0.2.9
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
* Include files * Include files
@ -55,7 +50,7 @@ class Controller extends Object {
*/ */
var $here = null; var $here = null;
/** /**
* The webroot of the application. Helpful if your application is placed in a folder under the current domain name. * The webroot of the application.
* *
* @var string * @var string
* @access public * @access public
@ -325,7 +320,8 @@ class Controller extends Object {
if ($this->name === null) { if ($this->name === null) {
$r = null; $r = null;
if (!preg_match('/(.*)Controller/i', get_class($this), $r)) { if (!preg_match('/(.*)Controller/i', get_class($this), $r)) {
die (__("Controller::__construct() : Can not get or parse my own class name, exiting.")); __("Controller::__construct() : Can not get or parse my own class name, exiting.");
$this->_stop();
} }
$this->name = $r[1]; $this->name = $r[1];
} }
@ -395,7 +391,9 @@ class Controller extends Object {
$app = Set::normalize($appVars[$var]); $app = Set::normalize($appVars[$var]);
$this->{$var} = Set::merge($app, $normal); $this->{$var} = Set::merge($app, $normal);
} else { } else {
$this->{$var} = Set::merge($this->{$var}, array_diff($appVars[$var], $this->{$var})); $this->{$var} = Set::merge(
$this->{$var}, array_diff($appVars[$var], $this->{$var})
);
} }
} }
} }
@ -417,7 +415,9 @@ class Controller extends Object {
$app = Set::normalize($appVars[$var]); $app = Set::normalize($appVars[$var]);
$this->{$var} = Set::merge($normal, array_diff_assoc($app, $normal)); $this->{$var} = Set::merge($normal, array_diff_assoc($app, $normal));
} else { } else {
$this->{$var} = Set::merge($this->{$var}, array_diff($appVars[$var], $this->{$var})); $this->{$var} = Set::merge(
$this->{$var}, array_diff($appVars[$var], $this->{$var})
);
} }
} }
} }
@ -462,7 +462,7 @@ class Controller extends Object {
} }
/** /**
* Loads and instantiates models required by this controller. * Loads and instantiates models required by this controller.
* If Controller::persistModel; is true, controller will create cached model instances on first request, * If Controller::persistModel; is true, controller will cache model instances on first request,
* additional request will used cached models. * additional request will used cached models.
* If the model is non existent, it will throw a missing database table error, as Cake generates * If the model is non existent, it will throw a missing database table error, as Cake generates
* dynamic models for the time being. * dynamic models for the time being.
@ -498,13 +498,19 @@ class Controller extends Object {
$this->modelNames[] = $modelClass; $this->modelNames[] = $modelClass;
if (!PHP5) { if (!PHP5) {
$this->{$modelClass} =& ClassRegistry::init(array('class' => $plugin . $modelClass, 'alias' => $modelClass, 'id' => $id)); $this->{$modelClass} =& ClassRegistry::init(array(
'class' => $plugin . $modelClass, 'alias' => $modelClass, 'id' => $id
));
} else { } else {
$this->{$modelClass} = ClassRegistry::init(array('class' => $plugin . $modelClass, 'alias' => $modelClass, 'id' => $id)); $this->{$modelClass} = ClassRegistry::init(array(
'class' => $plugin . $modelClass, 'alias' => $modelClass, 'id' => $id
));
} }
if (!$this->{$modelClass}) { if (!$this->{$modelClass}) {
return $this->cakeError('missingModel', array(array('className' => $modelClass, 'webroot' => '', 'base' => $this->base))); return $this->cakeError('missingModel', array(array(
'className' => $modelClass, 'webroot' => '', 'base' => $this->base
)));
} }
if ($this->persistModel === true) { if ($this->persistModel === true) {
@ -522,7 +528,8 @@ class Controller extends Object {
* Redirects to given $url, after turning off $this->autoRender. * Redirects to given $url, after turning off $this->autoRender.
* Script execution is halted after the redirect. * Script execution is halted after the redirect.
* *
* @param mixed $url A string or array-based URL pointing to another location within the app, or an absolute URL * @param mixed $url A string or array-based URL pointing to another location within the app,
* or an absolute URL
* @param integer $status Optional HTTP status code (eg: 404) * @param integer $status Optional HTTP status code (eg: 404)
* @param boolean $exit If true, exit() will be called after the redirect * @param boolean $exit If true, exit() will be called after the redirect
* @return mixed void if $exit = false. Terminates script if $exit = true * @return mixed void if $exit = false. Terminates script if $exit = true
@ -689,14 +696,17 @@ class Controller extends Object {
return call_user_func_array(array(&$this, $action), $args); return call_user_func_array(array(&$this, $action), $args);
} }
/** /**
* Controller callback to tie into Auth component. Only called when AuthComponent::authorize is set to 'controller'. * Controller callback to tie into Auth component.
* Only called when AuthComponent::authorize is set to 'controller'.
* *
* @return bool true if authorized, false otherwise * @return bool true if authorized, false otherwise
* @access public * @access public
* @link http://book.cakephp.org/view/396/authorize * @link http://book.cakephp.org/view/396/authorize
*/ */
function isAuthorized() { function isAuthorized() {
trigger_error(sprintf(__('%s::isAuthorized() is not defined.', true), $this->name), E_USER_WARNING); trigger_error(sprintf(
__('%s::isAuthorized() is not defined.', true), $this->name
), E_USER_WARNING);
return false; return false;
} }
/** /**
@ -776,8 +786,13 @@ class Controller extends Object {
if (isset($this->$currentModel) && is_a($this->$currentModel, 'Model')) { if (isset($this->$currentModel) && is_a($this->$currentModel, 'Model')) {
$models[] = Inflector::underscore($currentModel); $models[] = Inflector::underscore($currentModel);
} }
if (isset($this->$currentModel) && is_a($this->$currentModel, 'Model') && !empty($this->$currentModel->validationErrors)) { $isValidModel = (
$View->validationErrors[Inflector::camelize($currentModel)] =& $this->$currentModel->validationErrors; isset($this->$currentModel) && is_a($this->$currentModel, 'Model') &&
!empty($this->$currentModel->validationErrors)
);
if ($isValidModel) {
$View->validationErrors[Inflector::camelize($currentModel)] =&
$this->$currentModel->validationErrors;
} }
} }
$models = array_diff(ClassRegistry::keys(), $models); $models = array_diff(ClassRegistry::keys(), $models);
@ -785,7 +800,8 @@ class Controller extends Object {
if (ClassRegistry::isKeySet($currentModel)) { if (ClassRegistry::isKeySet($currentModel)) {
$currentObject =& ClassRegistry::getObject($currentModel); $currentObject =& ClassRegistry::getObject($currentModel);
if (is_a($currentObject, 'Model') && !empty($currentObject->validationErrors)) { if (is_a($currentObject, 'Model') && !empty($currentObject->validationErrors)) {
$View->validationErrors[Inflector::camelize($currentModel)] =& $currentObject->validationErrors; $View->validationErrors[Inflector::camelize($currentModel)] =&
$currentObject->validationErrors;
} }
} }
} }
@ -821,7 +837,8 @@ class Controller extends Object {
} }
if ($default != null) { if ($default != null) {
return $default; $url = Router::url($default, true);
return $url;
} }
return '/'; return '/';
} }
@ -863,9 +880,11 @@ class Controller extends Object {
* Converts POST'ed form data to a model conditions array, suitable for use in a Model::find() call. * Converts POST'ed form data to a model conditions array, suitable for use in a Model::find() call.
* *
* @param array $data POST'ed data organized by model and field * @param array $data POST'ed data organized by model and field
* @param mixed $op A string containing an SQL comparison operator, or an array matching operators to fields * @param mixed $op A string containing an SQL comparison operator, or an array matching operators
* to fields
* @param string $bool SQL boolean operator: AND, OR, XOR, etc. * @param string $bool SQL boolean operator: AND, OR, XOR, etc.
* @param boolean $exclusive If true, and $op is an array, fields not included in $op will not be included in the returned conditions * @param boolean $exclusive If true, and $op is an array, fields not included in $op will not be
* included in the returned conditions
* @return array An array of model conditions * @return array An array of model conditions
* @access public * @access public
* @link http://book.cakephp.org/view/432/postConditions * @link http://book.cakephp.org/view/432/postConditions
@ -940,11 +959,16 @@ class Controller extends Object {
if ($assoc && isset($this->{$object}->{$assoc})) { if ($assoc && isset($this->{$object}->{$assoc})) {
$object = $this->{$object}->{$assoc}; $object = $this->{$object}->{$assoc};
} elseif ($assoc && isset($this->{$this->modelClass}) && isset($this->{$this->modelClass}->{$assoc})) { } elseif (
$assoc && isset($this->{$this->modelClass}) &&
isset($this->{$this->modelClass}->{$assoc}
)) {
$object = $this->{$this->modelClass}->{$assoc}; $object = $this->{$this->modelClass}->{$assoc};
} elseif (isset($this->{$object})) { } elseif (isset($this->{$object})) {
$object = $this->{$object}; $object = $this->{$object};
} elseif (isset($this->{$this->modelClass}) && isset($this->{$this->modelClass}->{$object})) { } elseif (
isset($this->{$this->modelClass}) && isset($this->{$this->modelClass}->{$object}
)) {
$object = $this->{$this->modelClass}->{$object}; $object = $this->{$this->modelClass}->{$object};
} }
} elseif (empty($object) || $object === null) { } elseif (empty($object) || $object === null) {
@ -965,7 +989,11 @@ class Controller extends Object {
} }
if (!is_object($object)) { if (!is_object($object)) {
trigger_error(sprintf(__('Controller::paginate() - can\'t find model %1$s in controller %2$sController', true), $object, $this->name), E_USER_WARNING); trigger_error(sprintf(
__('Controller::paginate() - can\'t find model %1$s in controller %2$sController',
true
), $object, $this->name
), E_USER_WARNING);
return array(); return array();
} }
$options = array_merge($this->params, $this->params['url'], $this->passedArgs); $options = array_merge($this->params, $this->params['url'], $this->passedArgs);
@ -1071,7 +1099,9 @@ class Controller extends Object {
$page = $options['page'] = (integer)$page; $page = $options['page'] = (integer)$page;
if (method_exists($object, 'paginate')) { if (method_exists($object, 'paginate')) {
$results = $object->paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra); $results = $object->paginate(
$conditions, $fields, $order, $limit, $page, $recursive, $extra
);
} else { } else {
$parameters = compact('conditions', 'fields', 'order', 'limit', 'page'); $parameters = compact('conditions', 'fields', 'order', 'limit', 'page');
if ($recursive != $object->recursive) { if ($recursive != $object->recursive) {

View file

@ -1,5 +1,4 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* Scaffold. * Scaffold.
* *
@ -7,25 +6,21 @@
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @subpackage cake.cake.libs.controller * @subpackage cake.cake.libs.controller
* @since Cake v 0.10.0.1076 * @since Cake v 0.10.0.1076
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
* Scaffolding is a set of automatic views, forms and controllers for starting web development work faster. * Scaffolding is a set of automatic actions for starting web development work faster.
* *
* Scaffold inspects your database tables, and making educated guesses, sets up a * Scaffold inspects your database tables, and making educated guesses, sets up a
* number of pages for each of your Models. These pages have data forms that work, * number of pages for each of your Models. These pages have data forms that work,
@ -113,13 +108,23 @@ class Scaffold extends Object {
* @access public * @access public
*/ */
var $plugin = null; var $plugin = null;
/**
* valid session.
*
* @var boolean
* @access public
*/
var $_validSession = null;
/** /**
* List of variables to collect from the associated controller * List of variables to collect from the associated controller
* *
* @var array * @var array
* @access private * @access private
*/ */
var $__passedVars = array('action', 'base', 'webroot', 'layout', 'name', 'viewPath', 'ext', 'params', 'data', 'plugin', 'cacheAction'); var $__passedVars = array(
'action', 'base', 'webroot', 'layout', 'name',
'viewPath', 'ext', 'params', 'data', 'plugin', 'cacheAction'
);
/** /**
* Title HTML element for current scaffolded view * Title HTML element for current scaffolded view
* *
@ -148,14 +153,16 @@ class Scaffold extends Object {
$this->modelKey = $controller->modelKey; $this->modelKey = $controller->modelKey;
if (!is_object($this->controller->{$this->modelClass})) { if (!is_object($this->controller->{$this->modelClass})) {
return $this->cakeError('missingModel', array(array('className' => $this->modelClass, 'webroot' => '', 'base' => $controller->base))); return $this->cakeError('missingModel', array(array(
'className' => $this->modelClass, 'webroot' => '', 'base' => $controller->base
)));
} }
$this->ScaffoldModel =& $this->controller->{$this->modelClass}; $this->ScaffoldModel =& $this->controller->{$this->modelClass};
$this->scaffoldTitle = Inflector::humanize($this->viewPath); $this->scaffoldTitle = Inflector::humanize($this->viewPath);
$this->scaffoldActions = $controller->scaffold; $this->scaffoldActions = $controller->scaffold;
$this->controller->pageTitle = __('Scaffold :: ', true) . Inflector::humanize($this->action) . ' :: ' . $this->scaffoldTitle; $this->controller->pageTitle = __('Scaffold :: ', true)
. Inflector::humanize($this->action) . ' :: ' . $this->scaffoldTitle;
$modelClass = $this->controller->modelClass; $modelClass = $this->controller->modelClass;
$primaryKey = $this->ScaffoldModel->primaryKey; $primaryKey = $this->ScaffoldModel->primaryKey;
$displayField = $this->ScaffoldModel->displayField; $displayField = $this->ScaffoldModel->displayField;
@ -166,13 +173,18 @@ class Scaffold extends Object {
$scaffoldFields = array_keys($this->ScaffoldModel->schema()); $scaffoldFields = array_keys($this->ScaffoldModel->schema());
$associations = $this->__associations(); $associations = $this->__associations();
$this->controller->set(compact('modelClass', 'primaryKey', 'displayField', 'singularVar', 'pluralVar', $this->controller->set(compact(
'singularHumanName', 'pluralHumanName', 'scaffoldFields', 'associations')); 'modelClass', 'primaryKey', 'displayField', 'singularVar', 'pluralVar',
'singularHumanName', 'pluralHumanName', 'scaffoldFields', 'associations'
));
if ($this->controller->view && $this->controller->view !== 'Theme') { if ($this->controller->view && $this->controller->view !== 'Theme') {
$this->controller->view = 'scaffold'; $this->controller->view = 'scaffold';
} }
$this->__scaffold($params); $this->__scaffold($params);
$this->_validSession = (
isset($this->controller->Session) && $this->controller->Session->valid() != false
);
} }
/** /**
* Outputs the content of a scaffold method passing it through the Controller::afterFilter() * Outputs the content of a scaffold method passing it through the Controller::afterFilter()
@ -196,16 +208,23 @@ class Scaffold extends Object {
if (isset($params['pass'][0])) { if (isset($params['pass'][0])) {
$this->ScaffoldModel->id = $params['pass'][0]; $this->ScaffoldModel->id = $params['pass'][0];
} elseif (isset($this->controller->Session) && $this->controller->Session->valid() != false) { } elseif ($this->_validSession) {
$this->controller->Session->setFlash(sprintf(__("No id set for %s::view()", true), Inflector::humanize($this->modelKey))); $this->controller->Session->setFlash(sprintf(
__("No id set for %s::view()", true),
Inflector::humanize($this->modelKey
)));
$this->controller->redirect($this->redirect); $this->controller->redirect($this->redirect);
} else { } else {
return $this->controller->flash(sprintf(__("No id set for %s::view()", true), Inflector::humanize($this->modelKey)), return $this->controller->flash(sprintf(
'/' . Inflector::underscore($this->controller->viewPath)); __("No id set for %s::view()", true), Inflector::humanize($this->modelKey)),
'/' . Inflector::underscore($this->controller->viewPath
));
} }
$this->ScaffoldModel->recursive = 1; $this->ScaffoldModel->recursive = 1;
$this->controller->data = $this->ScaffoldModel->read(); $this->controller->data = $this->ScaffoldModel->read();
$this->controller->set(Inflector::variable($this->controller->modelClass), $this->controller->data); $this->controller->set(
Inflector::variable($this->controller->modelClass), $this->controller->data
);
$this->controller->render($this->action, $this->layout); $this->controller->render($this->action, $this->layout);
$this->_output(); $this->_output();
} elseif ($this->controller->_scaffoldError('view') === false) { } elseif ($this->controller->_scaffoldError('view') === false) {
@ -222,7 +241,9 @@ class Scaffold extends Object {
function __scaffoldIndex($params) { function __scaffoldIndex($params) {
if ($this->controller->_beforeScaffold('index')) { if ($this->controller->_beforeScaffold('index')) {
$this->ScaffoldModel->recursive = 0; $this->ScaffoldModel->recursive = 0;
$this->controller->set(Inflector::variable($this->controller->name), $this->controller->paginate()); $this->controller->set(
Inflector::variable($this->controller->name), $this->controller->paginate()
);
$this->controller->render($this->action, $this->layout); $this->controller->render($this->action, $this->layout);
$this->_output(); $this->_output();
} elseif ($this->controller->_scaffoldError('index') === false) { } elseif ($this->controller->_scaffoldError('index') === false) {
@ -263,11 +284,17 @@ class Scaffold extends Object {
} }
if (!$this->ScaffoldModel->exists()) { if (!$this->ScaffoldModel->exists()) {
if (isset($this->controller->Session) && $this->controller->Session->valid() != false) { if ($this->_validSession) {
$this->controller->Session->setFlash(sprintf(__("Invalid id for %s::edit()", true), Inflector::humanize($this->modelKey))); $this->controller->Session->setFlash(sprintf(
__("Invalid id for %s::edit()", true),
Inflector::humanize($this->modelKey)
));
$this->controller->redirect($this->redirect); $this->controller->redirect($this->redirect);
} else { } else {
return $this->controller->flash(sprintf(__("Invalid id for %s::edit()", true), Inflector::humanize($this->modelKey)), $this->redirect); return $this->controller->flash(sprintf(
__("Invalid id for %s::edit()", true),
Inflector::humanize($this->modelKey)
), $this->redirect);
} }
} }
} }
@ -279,18 +306,26 @@ class Scaffold extends Object {
if ($this->ScaffoldModel->save($this->controller->data)) { if ($this->ScaffoldModel->save($this->controller->data)) {
if ($this->controller->_afterScaffoldSave($action)) { if ($this->controller->_afterScaffoldSave($action)) {
if (isset($this->controller->Session) && $this->controller->Session->valid() != false) { if ($this->_validSession) {
$this->controller->Session->setFlash(sprintf(__('The %1$s has been %2$s', true), Inflector::humanize($this->modelClass), $success)); $this->controller->Session->setFlash(sprintf(
__('The %1$s has been %2$s', true),
Inflector::humanize($this->modelClass), $success
));
$this->controller->redirect($this->redirect); $this->controller->redirect($this->redirect);
} else { } else {
return $this->controller->flash(sprintf(__('The %1$s has been %2$s', true), Inflector::humanize($this->modelClass), $success), $this->redirect); return $this->controller->flash(sprintf(
__('The %1$s has been %2$s', true),
Inflector::humanize($this->modelClass), $success
), $this->redirect);
} }
} else { } else {
return $this->controller->_afterScaffoldSaveError($action); return $this->controller->_afterScaffoldSaveError($action);
} }
} else { } else {
if (isset($this->controller->Session) && $this->controller->Session->valid() != false) { if ($this->_validSession) {
$this->controller->Session->setFlash(__('Please correct errors below.', true)); $this->controller->Session->setFlash(
__('Please correct errors below.', true
));
} }
} }
} }
@ -304,7 +339,9 @@ class Scaffold extends Object {
} }
foreach ($this->ScaffoldModel->belongsTo as $assocName => $assocData) { foreach ($this->ScaffoldModel->belongsTo as $assocName => $assocData) {
$varName = Inflector::variable(Inflector::pluralize(preg_replace('/(?:_id)$/', '', $assocData['foreignKey']))); $varName = Inflector::variable(Inflector::pluralize(
preg_replace('/(?:_id)$/', '', $assocData['foreignKey'])
));
$this->controller->set($varName, $this->ScaffoldModel->{$assocName}->find('list')); $this->controller->set($varName, $this->ScaffoldModel->{$assocName}->find('list'));
} }
foreach ($this->ScaffoldModel->hasAndBelongsToMany as $assocName => $assocData) { foreach ($this->ScaffoldModel->hasAndBelongsToMany as $assocName => $assocData) {
@ -328,27 +365,42 @@ class Scaffold extends Object {
if ($this->controller->_beforeScaffold('delete')) { if ($this->controller->_beforeScaffold('delete')) {
if (isset($params['pass'][0])) { if (isset($params['pass'][0])) {
$id = $params['pass'][0]; $id = $params['pass'][0];
} elseif (isset($this->controller->Session) && $this->controller->Session->valid() != false) { } elseif ($this->_validSession) {
$this->controller->Session->setFlash(sprintf(__("No id set for %s::delete()", true), Inflector::humanize($this->modelKey))); $this->controller->Session->setFlash(sprintf(
__("No id set for %s::delete()", true), Inflector::humanize($this->modelKey)
));
$this->controller->redirect($this->redirect); $this->controller->redirect($this->redirect);
} else { } else {
return $this->controller->flash(sprintf(__("No id set for %s::delete()", true), Inflector::humanize($this->modelKey)), return $this->controller->flash(sprintf(
'/' . Inflector::underscore($this->controller->viewPath)); __("No id set for %s::delete()", true), Inflector::humanize($this->modelKey)
), '/' . Inflector::underscore($this->controller->viewPath));
} }
if ($this->ScaffoldModel->del($id)) { if ($this->ScaffoldModel->delete($id)) {
if (isset($this->controller->Session) && $this->controller->Session->valid() != false) { if ($this->_validSession) {
$this->controller->Session->setFlash(sprintf(__('The %1$s with id: %2$d has been deleted.', true), Inflector::humanize($this->modelClass), $id)); $this->controller->Session->setFlash(sprintf(
__('The %1$s with id: %2$d has been deleted.', true),
Inflector::humanize($this->modelClass), $id
));
$this->controller->redirect($this->redirect); $this->controller->redirect($this->redirect);
} else { } else {
return $this->controller->flash(sprintf(__('The %1$s with id: %2$d has been deleted.', true), Inflector::humanize($this->modelClass), $id), '/' . $this->viewPath); return $this->controller->flash(sprintf(
__('The %1$s with id: %2$d has been deleted.', true),
Inflector::humanize($this->modelClass), $id
), '/' . $this->viewPath);
} }
} else { } else {
if (isset($this->controller->Session) && $this->controller->Session->valid() != false) { if ($this->_validSession) {
$this->controller->Session->setFlash(sprintf(__('There was an error deleting the %1$s with id: %2$d', true), Inflector::humanize($this->modelClass), $id)); $this->controller->Session->setFlash(sprintf(
__('There was an error deleting the %1$s with id: %2$d', true),
Inflector::humanize($this->modelClass), $id
));
$this->controller->redirect($this->redirect); $this->controller->redirect($this->redirect);
} else { } else {
return $this->controller->flash(sprintf(__('There was an error deleting the %1$s with id: %2$d', true), Inflector::humanize($this->modelClass), $id), '/' . $this->viewPath); return $this->controller->flash(sprintf(
__('There was an error deleting the %1$s with id: %2$d', true),
Inflector::humanize($this->modelClass), $id
), '/' . $this->viewPath);
} }
} }
} elseif ($this->controller->_scaffoldError('delete') === false) { } elseif ($this->controller->_scaffoldError('delete') === false) {
@ -383,9 +435,14 @@ class Scaffold extends Object {
if (isset($db)) { if (isset($db)) {
if (empty($this->scaffoldActions)) { if (empty($this->scaffoldActions)) {
$this->scaffoldActions = array('index', 'list', 'view', 'add', 'create', 'edit', 'update', 'delete'); $this->scaffoldActions = array(
'index', 'list', 'view', 'add', 'create', 'edit', 'update', 'delete'
);
} elseif (!empty($admin) && $this->scaffoldActions === $admin) { } elseif (!empty($admin) && $this->scaffoldActions === $admin) {
$this->scaffoldActions = array($admin .'_index', $admin .'_list', $admin .'_view', $admin .'_add', $admin .'_create', $admin .'_edit', $admin .'_update', $admin .'_delete'); $this->scaffoldActions = array(
$admin .'_index', $admin .'_list', $admin .'_view', $admin .'_add',
$admin .'_create', $admin .'_edit', $admin .'_update', $admin .'_delete'
);
} }
if (in_array($params['action'], $this->scaffoldActions)) { if (in_array($params['action'], $this->scaffoldActions)) {
@ -419,13 +476,17 @@ class Scaffold extends Object {
break; break;
} }
} else { } else {
return $this->cakeError('missingAction', array(array('className' => $this->controller->name . "Controller", return $this->cakeError('missingAction', array(array(
'base' => $this->controller->base, 'className' => $this->controller->name . "Controller",
'action' => $this->action, 'base' => $this->controller->base,
'webroot' => $this->controller->webroot))); 'action' => $this->action,
'webroot' => $this->controller->webroot
)));
} }
} else { } else {
return $this->cakeError('missingDatabase', array(array('webroot' => $this->controller->webroot))); return $this->cakeError('missingDatabase', array(array(
'webroot' => $this->controller->webroot
)));
} }
} }
/** /**
@ -440,10 +501,17 @@ class Scaffold extends Object {
foreach ($keys as $key => $type) { foreach ($keys as $key => $type) {
foreach ($this->ScaffoldModel->{$type} as $assocKey => $assocData) { foreach ($this->ScaffoldModel->{$type} as $assocKey => $assocData) {
$associations[$type][$assocKey]['primaryKey'] = $this->ScaffoldModel->{$assocKey}->primaryKey; $associations[$type][$assocKey]['primaryKey'] =
$associations[$type][$assocKey]['displayField'] = $this->ScaffoldModel->{$assocKey}->displayField; $this->ScaffoldModel->{$assocKey}->primaryKey;
$associations[$type][$assocKey]['foreignKey'] = $assocData['foreignKey'];
$associations[$type][$assocKey]['controller'] = Inflector::pluralize(Inflector::underscore($assocData['className'])); $associations[$type][$assocKey]['displayField'] =
$this->ScaffoldModel->{$assocKey}->displayField;
$associations[$type][$assocKey]['foreignKey'] =
$assocData['foreignKey'];
$associations[$type][$assocKey]['controller'] =
Inflector::pluralize(Inflector::underscore($assocData['className']));
} }
} }
return $associations; return $associations;

View file

@ -1,5 +1,4 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* Framework debugging and PHP error-handling class * Framework debugging and PHP error-handling class
* *
@ -7,33 +6,34 @@
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @subpackage cake.cake.libs * @subpackage cake.cake.libs
* @since CakePHP(tm) v 1.2.4560 * @since CakePHP(tm) v 1.2.4560
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
* Included libraries. * Included libraries.
* *
*/ */
if (!class_exists('Object')) { if (!class_exists('Object')) {
uses('object'); require_once LIBS . 'object.php';
} }
if (!class_exists('CakeLog')) { if (!class_exists('CakeLog')) {
uses('cake_log'); require_once LIBS . 'cake_log.php';
} }
if (!class_exists('String')) {
require_once LIBS . 'string.php';
}
/** /**
* Provide custom logging and error handling. * Provide custom logging and error handling.
* *
@ -44,6 +44,7 @@
* @link http://book.cakephp.org/view/460/Using-the-Debugger-Class * @link http://book.cakephp.org/view/460/Using-the-Debugger-Class
*/ */
class Debugger extends Object { class Debugger extends Object {
/** /**
* A list of errors generated by the application. * A list of errors generated by the application.
* *
@ -51,6 +52,7 @@ class Debugger extends Object {
* @access public * @access public
*/ */
var $errors = array(); var $errors = array();
/** /**
* Contains the base URL for error code documentation. * Contains the base URL for error code documentation.
* *
@ -58,6 +60,7 @@ class Debugger extends Object {
* @access public * @access public
*/ */
var $helpPath = null; var $helpPath = null;
/** /**
* The current output format. * The current output format.
* *
@ -65,26 +68,110 @@ class Debugger extends Object {
* @access protected * @access protected
*/ */
var $_outputFormat = 'js'; var $_outputFormat = 'js';
/**
* Templates used when generating trace or error strings. Can be global or indexed by the format
* value used in $_outputFormat.
*
* @var string
* @access protected
*/
var $_templates = array(
'log' => array(
'trace' => '{:reference} - {:path}, line {:line}',
'error' => "{:error} ({:code}): {:description} in [{:file}, line {:line}]"
),
'js' => array(
'error' => '',
'info' => '',
'trace' => '<pre class="stack-trace">{:trace}</pre>',
'code' => '',
'context' => '',
'links' => array()
),
'html' => array(
'trace' => '<pre class="cake-debug trace"><b>Trace</b> <p>{:trace}</p></pre>',
'context' => '<pre class="cake-debug context"><b>Context</b> <p>{:context}</p></pre>'
),
'txt' => array(
'error' => "{:error}: {:code} :: {:description} on line {:line} of {:path}\n{:info}",
'context' => "Context:\n{:context}\n",
'trace' => "Trace:\n{:trace}\n",
'code' => '',
'info' => ''
),
'base' => array(
'traceLine' => '{:reference} - {:path}, line {:line}'
)
);
/** /**
* Holds current output data when outputFormat is false. * Holds current output data when outputFormat is false.
* *
* @var string * @var string
* @access private * @access private
*/ */
var $__data = array(); var $_data = array();
/** /**
* Constructor. * Constructor.
* *
*/ */
function __construct() { function __construct() {
$docRef = ini_get('docref_root'); $docRef = ini_get('docref_root');
if (empty($docRef)) { if (empty($docRef)) {
ini_set('docref_root', 'http://php.net/'); ini_set('docref_root', 'http://php.net/');
} }
if (!defined('E_RECOVERABLE_ERROR')) { if (!defined('E_RECOVERABLE_ERROR')) {
define('E_RECOVERABLE_ERROR', 4096); define('E_RECOVERABLE_ERROR', 4096);
} }
if (!defined('E_DEPRECATED')) {
define('E_DEPRECATED', 8192);
}
$e = '<a href="javascript:void(0);" onclick="document.getElementById(\'{:id}-trace\')';
$e .= '.style.display = (document.getElementById(\'{:id}-trace\').style.display == ';
$e .= '\'none\' ? \'\' : \'none\');"><b>{:error}</b> ({:code})</a>: {:description} ';
$e .= '[<b>{:path}</b>, line <b>{:line}</b>]';
$e .= '<div id="{:id}-trace" class="cake-stack-trace" style="display: none;">';
$e .= '{:links}{:info}</div>';
$this->_templates['js']['error'] = $e;
$t = '<div id="{:id}-trace" class="cake-stack-trace" style="display: none;">';
$t .= '{:context}{:code}{:trace}</div>';
$this->_templates['js']['info'] = $t;
$links = array();
$link = '<a href="javascript:void(0);" onclick="document.getElementById(\'{:id}-code\')';
$link .= '.style.display = (document.getElementById(\'{:id}-code\').style.display == ';
$link .= '\'none\' ? \'\' : \'none\')">Code</a>';
$links['code'] = $link;
$link = '<a href="javascript:void(0);" onclick="document.getElementById(\'{:id}-context\')';
$link .= '.style.display = (document.getElementById(\'{:id}-context\').style.display == ';
$link .= '\'none\' ? \'\' : \'none\')">Context</a>';
$links['context'] = $link;
$links['help'] = '<a href="{:helpPath}{:code}" target="_blank">Help</a>';
$this->_templates['js']['links'] = $links;
$this->_templates['js']['context'] = '<pre id="{:id}-context" class="cake-context" ';
$this->_templates['js']['context'] .= 'style="display: none;">{:context}</pre>';
$this->_templates['js']['code'] = '<div id="{:id}-code" class="cake-code-dump" ';
$this->_templates['js']['code'] .= 'style="display: none;"><pre>{:code}</pre></div>';
$e = '<pre class="cake-debug"><b>{:error}</b> ({:code}) : {:description} ';
$e .= '[<b>{:path}</b>, line <b>{:line}]</b></pre>';
$this->_templates['html']['error'] = $e;
$this->_templates['html']['context'] = '<pre class="cake-debug context"><b>Context</b> ';
$this->_templates['html']['context'] .= '<p>{:context}</p></pre>';
} }
/** /**
* Returns a reference to the Debugger singleton object instance. * Returns a reference to the Debugger singleton object instance.
* *
@ -113,6 +200,7 @@ class Debugger extends Object {
} }
return $instance[0]; return $instance[0];
} }
/** /**
* Formats and outputs the contents of the supplied variable. * Formats and outputs the contents of the supplied variable.
* *
@ -127,6 +215,7 @@ class Debugger extends Object {
$_this = Debugger::getInstance(); $_this = Debugger::getInstance();
pr($_this->exportVar($var)); pr($_this->exportVar($var));
} }
/** /**
* Creates a detailed stack trace log at the time of invocation, much like dump() * Creates a detailed stack trace log at the time of invocation, much like dump()
* but to debug.log. * but to debug.log.
@ -175,7 +264,7 @@ class Debugger extends Object {
if (empty($line)) { if (empty($line)) {
$line = '??'; $line = '??';
} }
$file = $_this->trimPath($file); $path = $_this->trimPath($file);
$info = compact('code', 'description', 'file', 'line'); $info = compact('code', 'description', 'file', 'line');
if (!in_array($info, $_this->errors)) { if (!in_array($info, $_this->errors)) {
@ -214,15 +303,20 @@ class Debugger extends Object {
$helpCode = null; $helpCode = null;
if (!empty($_this->helpPath) && preg_match('/.*\[([0-9]+)\]$/', $description, $codes)) { if (!empty($_this->helpPath) && preg_match('/.*\[([0-9]+)\]$/', $description, $codes)) {
if (isset($codes[1])) { if (isset($codes[1])) {
$helpCode = $codes[1]; $helpID = $codes[1];
$description = trim(preg_replace('/\[[0-9]+\]$/', '', $description)); $description = trim(preg_replace('/\[[0-9]+\]$/', '', $description));
} }
} }
echo $_this->_output($level, $error, $code, $helpCode, $description, $file, $line, $context); $data = compact(
'level', 'error', 'code', 'helpID', 'description', 'file', 'path', 'line', 'context'
);
echo $_this->_output($data);
if (Configure::read('log')) { if (Configure::read('log')) {
CakeLog::write($level, "{$error} ({$code}): {$description} in [{$file}, line {$line}]"); $tpl = $_this->_templates['log']['error'];
$options = array('before' => '{:', 'after' => '}');
CakeLog::write($level, String::insert($tpl, $data, $options));
} }
if ($error == 'Fatal Error') { if ($error == 'Fatal Error') {
@ -230,6 +324,7 @@ class Debugger extends Object {
} }
return true; return true;
} }
/** /**
* Outputs a stack trace based on the supplied options. * Outputs a stack trace based on the supplied options.
* *
@ -240,65 +335,66 @@ class Debugger extends Object {
* @link http://book.cakephp.org/view/460/Using-the-Debugger-Class * @link http://book.cakephp.org/view/460/Using-the-Debugger-Class
*/ */
function trace($options = array()) { function trace($options = array()) {
$options = array_merge(array( $_this = Debugger::getInstance();
'depth' => 999, $defaults = array(
'format' => '', 'depth' => 999,
'args' => false, 'format' => $_this->_outputFormat,
'start' => 0, 'args' => false,
'scope' => null, 'start' => 0,
'exclude' => null 'scope' => null,
), 'exclude' => null
$options
); );
$options += $defaults;
$backtrace = debug_backtrace(); $backtrace = debug_backtrace();
$back = array();
$count = count($backtrace); $count = count($backtrace);
$back = array();
$_trace = array(
'line' => '??',
'file' => '[internal]',
'class' => null,
'function' => '[main]'
);
for ($i = $options['start']; $i < $count && $i < $options['depth']; $i++) { for ($i = $options['start']; $i < $count && $i < $options['depth']; $i++) {
$trace = array_merge( $trace = array_merge(array('file' => '[internal]', 'line' => '??'), $backtrace[$i]);
array(
'file' => '[internal]',
'line' => '??'
),
$backtrace[$i]
);
if (isset($backtrace[$i + 1])) { if (isset($backtrace[$i + 1])) {
$next = array_merge( $next = array_merge($_trace, $backtrace[$i + 1]);
array( $reference = $next['function'];
'line' => '??',
'file' => '[internal]',
'class' => null,
'function' => '[main]'
),
$backtrace[$i + 1]
);
$function = $next['function'];
if (!empty($next['class'])) { if (!empty($next['class'])) {
$function = $next['class'] . '::' . $function . '('; $reference = $next['class'] . '::' . $reference . '(';
if ($options['args'] && isset($next['args'])) { if ($options['args'] && isset($next['args'])) {
$args = array(); $args = array();
foreach ($next['args'] as $arg) { foreach ($next['args'] as $arg) {
$args[] = Debugger::exportVar($arg); $args[] = Debugger::exportVar($arg);
} }
$function .= join(', ', $args); $reference .= join(', ', $args);
} }
$function .= ')'; $reference .= ')';
} }
} else { } else {
$function = '[main]'; $reference = '[main]';
} }
if (in_array($function, array('call_user_func_array', 'trigger_error'))) { if (in_array($reference, array('call_user_func_array', 'trigger_error'))) {
continue; continue;
} }
if ($options['format'] == 'points' && $trace['file'] != '[internal]') { if ($options['format'] == 'points' && $trace['file'] != '[internal]') {
$back[] = array('file' => $trace['file'], 'line' => $trace['line']); $back[] = array('file' => $trace['file'], 'line' => $trace['line']);
} elseif (empty($options['format'])) { } elseif ($options['format'] == 'array') {
$back[] = $function . ' - ' . Debugger::trimPath($trace['file']) . ', line ' . $trace['line'];
} else {
$back[] = $trace; $back[] = $trace;
} else {
if (isset($_this->_templates[$options['format']]['traceLine'])) {
$tpl = $_this->_templates[$options['format']]['traceLine'];
} else {
$tpl = $_this->_templates['base']['traceLine'];
}
$trace['path'] = Debugger::trimPath($trace['file']);
$trace['reference'] = $reference;
unset($trace['object'], $trace['args']);
$back[] = String::insert($tpl, $trace, array('before' => '{:', 'after' => '}'));
} }
} }
@ -307,6 +403,7 @@ class Debugger extends Object {
} }
return join("\n", $back); return join("\n", $back);
} }
/** /**
* Shortens file paths by replacing the application base path with 'APP', and the CakePHP core * Shortens file paths by replacing the application base path with 'APP', and the CakePHP core
* path with 'CORE'. * path with 'CORE'.
@ -336,6 +433,7 @@ class Debugger extends Object {
} }
return $path; return $path;
} }
/** /**
* Grabs an excerpt from a file and highlights a given line of code * Grabs an excerpt from a file and highlights a given line of code
* *
@ -370,6 +468,7 @@ class Debugger extends Object {
} }
return $lines; return $lines;
} }
/** /**
* Converts a variable to a string for debug output. * Converts a variable to a string for debug output.
* *
@ -424,6 +523,7 @@ class Debugger extends Object {
break; break;
} }
} }
/** /**
* Handles object to string conversion. * Handles object to string conversion.
* *
@ -454,98 +554,122 @@ class Debugger extends Object {
} }
return join("\n", $out); return join("\n", $out);
} }
/** /**
* Handles object conversion to debug string. * Switches output format, updates format strings
* *
* @param string $var Object to convert * @param string $format Format to use, including 'js' for JavaScript-enhanced HTML, 'html' for
* straight HTML output, or 'text' for unformatted text.
* @access protected * @access protected
*/ */
function output($format = 'js') { function output($format = null, $strings = array()) {
$_this = Debugger::getInstance(); $_this = Debugger::getInstance();
$data = null; $data = null;
if ($format === true && !empty($_this->__data)) { if (is_null($format)) {
$data = $_this->__data; return $_this->_outputFormat;
$_this->__data = array(); }
if (!empty($strings)) {
if (isset($_this->_templates[$format])) {
if (isset($strings['links'])) {
$_this->_templates[$format]['links'] = array_merge(
$_this->_templates[$format]['links'],
$strings['links']
);
unset($strings['links']);
}
$_this->_templates[$format] = array_merge($_this->_templates[$format], $strings);
} else {
$_this->_templates[$format] = $strings;
}
return $_this->_templates[$format];
}
if ($format === true && !empty($_this->_data)) {
$data = $_this->_data;
$_this->_data = array();
$format = false; $format = false;
} }
$_this->_outputFormat = $format; $_this->_outputFormat = $format;
return $data; return $data;
} }
/** /**
* Handles object conversion to debug string. * Renders error messages
* *
* @param string $var Object to convert * @param array $data Data about the current error
* @access private * @access private
*/ */
function _output($level, $error, $code, $helpCode, $description, $file, $line, $kontext) { function _output($data = array()) {
$files = $this->trace(array('start' => 2, 'format' => 'points')); $defaults = array(
$listing = $this->excerpt($files[0]['file'], $files[0]['line'] - 1, 1); 'level' => 0,
$trace = $this->trace(array('start' => 2, 'depth' => '20')); 'error' => 0,
$context = array(); 'code' => 0,
'helpID' => null,
'description' => '',
'file' => '',
'line' => 0,
'context' => array()
);
$data += $defaults;
foreach ((array)$kontext as $var => $value) { $files = $this->trace(array('start' => 2, 'format' => 'points'));
$code = $this->excerpt($files[0]['file'], $files[0]['line'] - 1, 1);
$trace = $this->trace(array('start' => 2, 'depth' => '20'));
$insertOpts = array('before' => '{:', 'after' => '}');
$context = array();
$links = array();
$info = '';
foreach ((array)$data['context'] as $var => $value) {
$context[] = "\${$var}\t=\t" . $this->exportVar($value, 1); $context[] = "\${$var}\t=\t" . $this->exportVar($value, 1);
} }
switch ($this->_outputFormat) { switch ($this->_outputFormat) {
default:
case 'js':
$link = "document.getElementById(\"CakeStackTrace" . count($this->errors) . "\").style.display = (document.getElementById(\"CakeStackTrace" . count($this->errors) . "\").style.display == \"none\" ? \"\" : \"none\")";
$out = "<a href='javascript:void(0);' onclick='{$link}'><b>{$error}</b> ({$code})</a>: {$description} [<b>{$file}</b>, line <b>{$line}</b>]";
if (Configure::read() > 0) {
debug($out, false, false);
echo '<div id="CakeStackTrace' . count($this->errors) . '" class="cake-stack-trace" style="display: none;">';
$link = "document.getElementById(\"CakeErrorCode" . count($this->errors) . "\").style.display = (document.getElementById(\"CakeErrorCode" . count($this->errors) . "\").style.display == \"none\" ? \"\" : \"none\")";
echo "<a href='javascript:void(0);' onclick='{$link}'>Code</a>";
if (!empty($context)) {
$link = "document.getElementById(\"CakeErrorContext" . count($this->errors) . "\").style.display = (document.getElementById(\"CakeErrorContext" . count($this->errors) . "\").style.display == \"none\" ? \"\" : \"none\")";
echo " | <a href='javascript:void(0);' onclick='{$link}'>Context</a>";
if (!empty($helpCode)) {
echo " | <a href='{$this->helpPath}{$helpCode}' target='_blank'>Help</a>";
}
echo "<pre id=\"CakeErrorContext" . count($this->errors) . "\" class=\"cake-context\" style=\"display: none;\">";
echo implode("\n", $context);
echo "</pre>";
}
if (!empty($listing)) {
echo "<div id=\"CakeErrorCode" . count($this->errors) . "\" class=\"cake-code-dump\" style=\"display: none;\">";
pr(implode("\n", $listing) . "\n", false);
echo '</div>';
}
pr($trace, false);
echo '</div>';
}
break;
case 'html':
echo "<pre class=\"cake-debug\"><b>{$error}</b> ({$code}) : {$description} [<b>{$file}</b>, line <b>{$line}]</b></pre>";
if (!empty($context)) {
echo "Context:\n" .implode("\n", $context) . "\n";
}
echo "<pre class=\"cake-debug context\"><b>Context</b> <p>" . implode("\n", $context) . "</p></pre>";
echo "<pre class=\"cake-debug trace\"><b>Trace</b> <p>" . $trace. "</p></pre>";
break;
case 'text':
case 'txt':
echo "{$error}: {$code} :: {$description} on line {$line} of {$file}\n";
if (!empty($context)) {
echo "Context:\n" .implode("\n", $context) . "\n";
}
echo "Trace:\n" . $trace;
break;
case 'log':
$this->log(compact('error', 'code', 'description', 'line', 'file', 'context', 'trace'));
break;
case false: case false:
$this->__data[] = compact('error', 'code', 'description', 'line', 'file', 'context', 'trace'); $this->_data[] = compact('context', 'trace') + $data;
break; return;
case 'log':
$this->log(compact('context', 'trace') + $data);
return;
} }
if (empty($this->_outputFormat) || !isset($this->_templates[$this->_outputFormat])) {
$this->_outputFormat = 'js';
}
$data['id'] = 'cakeErr' . count($this->errors);
$tpl = array_merge($this->_templates['base'], $this->_templates[$this->_outputFormat]);
$insert = array('context' => join("\n", $context), 'helpPath' => $this->helpPath) + $data;
$detect = array('help' => 'helpID', 'context' => 'context');
if (isset($tpl['links'])) {
foreach ($tpl['links'] as $key => $val) {
if (isset($detect[$key]) && empty($insert[$detect[$key]])) {
continue;
}
$links[$key] = String::insert($val, $insert, $insertOpts);
}
}
foreach (array('code', 'context', 'trace') as $key) {
if (empty($$key) || !isset($tpl[$key])) {
continue;
}
if (is_array($$key)) {
$$key = join("\n", $$key);
}
$info .= String::insert($tpl[$key], compact($key) + $insert, $insertOpts);
}
$links = join(' | ', $links);
unset($data['context']);
echo String::insert($tpl['error'], compact('links', 'info') + $data, $insertOpts);
} }
/** /**
* Verifies that the application's salt value has been changed from the default value. * Verifies that the application's salt value has been changed from the default value.
* *
@ -557,9 +681,10 @@ class Debugger extends Object {
trigger_error(__('Please change the value of \'Security.salt\' in app/config/core.php to a salt value specific to your application', true), E_USER_NOTICE); trigger_error(__('Please change the value of \'Security.salt\' in app/config/core.php to a salt value specific to your application', true), E_USER_NOTICE);
} }
} }
/** /**
* Invokes the given debugger object as the current error handler, taking over control from the previous handler * Invokes the given debugger object as the current error handler, taking over control from the
* in a stack-like hierarchy. * previous handler in a stack-like hierarchy.
* *
* @param object $debugger A reference to the Debugger object * @param object $debugger A reference to the Debugger object
* @access public * @access public
@ -574,4 +699,5 @@ class Debugger extends Object {
if (!defined('DISABLE_DEFAULT_ERROR_HANDLING')) { if (!defined('DISABLE_DEFAULT_ERROR_HANDLING')) {
Debugger::invoke(Debugger::getInstance()); Debugger::invoke(Debugger::getInstance());
} }
?> ?>

View file

@ -1,5 +1,4 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* Object-relational mapper. * Object-relational mapper.
* *
@ -7,27 +6,25 @@
* *
* PHP versions 5 * PHP versions 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @subpackage cake.cake.libs.model * @subpackage cake.cake.libs.model
* @since CakePHP(tm) v 0.10.0.0 * @since CakePHP(tm) v 0.10.0.0
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
* Included libs * Included libs
*/ */
App::import('Core', array('ClassRegistry', 'Overloadable', 'Validation', 'Behavior', 'ConnectionManager', 'Set', 'String')); App::import('Core', array(
'ClassRegistry', 'Overloadable', 'Validation', 'Behavior', 'ConnectionManager', 'Set', 'String'
));
/** /**
* Object-relational mapper. * Object-relational mapper.
* *
@ -1645,17 +1642,11 @@ class Model extends Overloadable {
return $db->update($this, $fields, null, $conditions); return $db->update($this, $fields, null, $conditions);
} }
/** /**
* Alias for del(). * @deprecated
*
* @param mixed $id ID of record to delete
* @param boolean $cascade Set to true to delete records that depend on this record
* @return boolean True on success
* @access public
* @see Model::del()
* @link http://book.cakephp.org/view/691/remove * @link http://book.cakephp.org/view/691/remove
*/ */
function remove($id = null, $cascade = true) { function remove($id = null, $cascade = true) {
return $this->del($id, $cascade); return $this->delete($id, $cascade);
} }
/** /**
* Removes record for given ID. If no ID is given, the current ID is used. Returns true on success. * Removes record for given ID. If no ID is given, the current ID is used. Returns true on success.
@ -1666,7 +1657,7 @@ class Model extends Overloadable {
* @access public * @access public
* @link http://book.cakephp.org/view/690/del * @link http://book.cakephp.org/view/690/del
*/ */
function del($id = null, $cascade = true) { function delete($id = null, $cascade = true) {
if (!empty($id)) { if (!empty($id)) {
$this->id = $id; $this->id = $id;
} }
@ -1674,7 +1665,10 @@ class Model extends Overloadable {
if ($this->exists() && $this->beforeDelete($cascade)) { if ($this->exists() && $this->beforeDelete($cascade)) {
$db =& ConnectionManager::getDataSource($this->useDbConfig); $db =& ConnectionManager::getDataSource($this->useDbConfig);
if (!$this->Behaviors->trigger($this, 'beforeDelete', array($cascade), array('break' => true, 'breakOn' => false))) { $filters = $this->Behaviors->trigger($this, 'beforeDelete', array($cascade), array(
'break' => true, 'breakOn' => false
));
if (!$filters) {
return false; return false;
} }
$this->_deleteDependent($id, $cascade); $this->_deleteDependent($id, $cascade);
@ -1700,16 +1694,10 @@ class Model extends Overloadable {
return false; return false;
} }
/** /**
* Alias for del(). * @deprecated
*
* @param mixed $id ID of record to delete
* @param boolean $cascade Set to true to delete records that depend on this record
* @return boolean True on success
* @access public
* @see Model::del()
*/ */
function delete($id = null, $cascade = true) { function del($id = null, $cascade = true) {
return $this->del($id, $cascade); return $this->delete($id, $cascade);
} }
/** /**
* Cascades model deletes through associated hasMany and hasOne child records. * Cascades model deletes through associated hasMany and hasOne child records.
@ -1737,7 +1725,9 @@ class Model extends Overloadable {
if (isset($data['exclusive']) && $data['exclusive']) { if (isset($data['exclusive']) && $data['exclusive']) {
$model->deleteAll($conditions); $model->deleteAll($conditions);
} else { } else {
$records = $model->find('all', array('conditions' => $conditions, 'fields' => $model->primaryKey)); $records = $model->find('all', array(
'conditions' => $conditions, 'fields' => $model->primaryKey
));
if (!empty($records)) { if (!empty($records)) {
foreach ($records as $record) { foreach ($records as $record) {
@ -1762,14 +1752,18 @@ class Model extends Overloadable {
$db =& ConnectionManager::getDataSource($this->useDbConfig); $db =& ConnectionManager::getDataSource($this->useDbConfig);
foreach ($this->hasAndBelongsToMany as $assoc => $data) { foreach ($this->hasAndBelongsToMany as $assoc => $data) {
$with = $data['with'];
$records = $this->{$data['with']}->find('all', array( $records = $this->{$data['with']}->find('all', array(
'conditions' => array_merge(array($this->{$data['with']}->escapeField($data['foreignKey']) => $id)), 'conditions' => array_merge(array(
'fields' => $this->{$data['with']}->primaryKey, $this->{$with}->escapeField($data['foreignKey']) => $id
)),
'fields' => $this->{$with}->primaryKey,
'recursive' => -1 'recursive' => -1
)); ));
if (!empty($records)) { if (!empty($records)) {
foreach ($records as $record) { foreach ($records as $record) {
$this->{$data['with']}->delete($record[$this->{$data['with']}->alias][$this->{$data['with']}->primaryKey]); $id = $record[$this->{$with}->alias][$this->{$with}->primaryKey];
$this->{$with}->delete($id);
} }
} }
} }
@ -1794,7 +1788,10 @@ class Model extends Overloadable {
return $db->delete($this, $conditions); return $db->delete($this, $conditions);
} else { } else {
$ids = Set::extract( $ids = Set::extract(
$this->find('all', array_merge(array('fields' => "{$this->alias}.{$this->primaryKey}", 'recursive' => 0), compact('conditions'))), $this->find('all', array_merge(array(
'fields' => "{$this->alias}.{$this->primaryKey}",
'recursive' => 0), compact('conditions'))
),
"{n}.{$this->alias}.{$this->primaryKey}" "{n}.{$this->alias}.{$this->primaryKey}"
); );
@ -1821,6 +1818,7 @@ class Model extends Overloadable {
} }
} }
} }
/** /**
* Collects foreign keys from associations. * Collects foreign keys from associations.
* *
@ -1837,6 +1835,7 @@ class Model extends Overloadable {
} }
return $result; return $result;
} }
/** /**
* Returns true if a record with the currently set ID exists. * Returns true if a record with the currently set ID exists.
* *
@ -1863,6 +1862,7 @@ class Model extends Overloadable {
} }
return $this->__exists = ($this->find('count', $query) > 0); return $this->__exists = ($this->find('count', $query) > 0);
} }
/** /**
* Returns true if a record that meets given conditions exists. * Returns true if a record that meets given conditions exists.
* *
@ -1873,6 +1873,7 @@ class Model extends Overloadable {
function hasAny($conditions = null) { function hasAny($conditions = null) {
return ($this->find('count', array('conditions' => $conditions, 'recursive' => -1)) != false); return ($this->find('count', array('conditions' => $conditions, 'recursive' => -1)) != false);
} }
/** /**
* Returns a result set array. * Returns a result set array.
* *
@ -1894,8 +1895,10 @@ class Model extends Overloadable {
* - If three fields are specified, they are used (in order) for key, value and group. * - If three fields are specified, they are used (in order) for key, value and group.
* - Otherwise, first and second fields are used for key and value. * - Otherwise, first and second fields are used for key and value.
* *
* @param array $conditions SQL conditions array, or type of find operation (all / first / count / neighbors / list / threaded) * @param array $conditions SQL conditions array, or type of find operation (all / first / count /
* @param mixed $fields Either a single string of a field name, or an array of field names, or options for matching * neighbors / list / threaded)
* @param mixed $fields Either a single string of a field name, or an array of field names, or
* options for matching
* @param string $order SQL ORDER BY conditions (e.g. "price DESC" or "name ASC") * @param string $order SQL ORDER BY conditions (e.g. "price DESC" or "name ASC")
* @param integer $recursive The number of levels deep to fetch associated records * @param integer $recursive The number of levels deep to fetch associated records
* @return array Array of records * @return array Array of records
@ -1973,6 +1976,7 @@ class Model extends Overloadable {
} }
} }
} }
/** /**
* Handles the before/after filter logic for find('first') operations. Only called by Model::find(). * Handles the before/after filter logic for find('first') operations. Only called by Model::find().
* *
@ -1997,6 +2001,7 @@ class Model extends Overloadable {
return $results[0]; return $results[0];
} }
} }
/** /**
* Handles the before/after filter logic for find('count') operations. Only called by Model::find(). * Handles the before/after filter logic for find('count') operations. Only called by Model::find().
* *
@ -2028,6 +2033,7 @@ class Model extends Overloadable {
return false; return false;
} }
} }
/** /**
* Handles the before/after filter logic for find('list') operations. Only called by Model::find(). * Handles the before/after filter logic for find('list') operations. Only called by Model::find().
* *
@ -2086,6 +2092,7 @@ class Model extends Overloadable {
return Set::combine($results, $lst['keyPath'], $lst['valuePath'], $lst['groupPath']); return Set::combine($results, $lst['keyPath'], $lst['valuePath'], $lst['groupPath']);
} }
} }
/** /**
* Detects the previous field's value, then uses logic to find the 'wrapping' * Detects the previous field's value, then uses logic to find the 'wrapping'
* rows and return them. * rows and return them.
@ -2144,6 +2151,7 @@ class Model extends Overloadable {
return $return; return $return;
} }
} }
/** /**
* In the event of ambiguous results returned (multiple top level results, with different parent_ids) * In the event of ambiguous results returned (multiple top level results, with different parent_ids)
* top level results with different parent_ids to the first result will be dropped * top level results with different parent_ids to the first result will be dropped
@ -2190,6 +2198,7 @@ class Model extends Overloadable {
return $return; return $return;
} }
} }
/** /**
* Passes query results through model and behavior afterFilter() methods. * Passes query results through model and behavior afterFilter() methods.
* *
@ -2205,6 +2214,7 @@ class Model extends Overloadable {
} }
return $this->afterFind($results, $primary); return $this->afterFind($results, $primary);
} }
/** /**
* Called only when bindTo<ModelName>() is used. * Called only when bindTo<ModelName>() is used.
* This resets the association arrays for the model back * This resets the association arrays for the model back
@ -2233,6 +2243,7 @@ class Model extends Overloadable {
$this->__backAssociation = array(); $this->__backAssociation = array();
return true; return true;
} }
/** /**
* Returns false if any fields passed match any (by default, all if $or = false) of their matching values. * Returns false if any fields passed match any (by default, all if $or = false) of their matching values.
* *
@ -2275,6 +2286,7 @@ class Model extends Overloadable {
} }
return ($this->find('count', array('conditions' => $fields, 'recursive' => -1)) == 0); return ($this->find('count', array('conditions' => $fields, 'recursive' => -1)) == 0);
} }
/** /**
* Returns a resultset for a given SQL statement. Custom SQL queries should be performed with this method. * Returns a resultset for a given SQL statement. Custom SQL queries should be performed with this method.
* *
@ -2288,6 +2300,7 @@ class Model extends Overloadable {
$db =& ConnectionManager::getDataSource($this->useDbConfig); $db =& ConnectionManager::getDataSource($this->useDbConfig);
return call_user_func_array(array(&$db, 'query'), $params); return call_user_func_array(array(&$db, 'query'), $params);
} }
/** /**
* Returns true if all fields pass validation. * Returns true if all fields pass validation.
* *
@ -2303,6 +2316,7 @@ class Model extends Overloadable {
} }
return $errors; return $errors;
} }
/** /**
* Returns an array of fields that have failed validation. * Returns an array of fields that have failed validation.
* *
@ -2453,6 +2467,7 @@ class Model extends Overloadable {
$this->validate = $_validate; $this->validate = $_validate;
return $this->validationErrors; return $this->validationErrors;
} }
/** /**
* Marks a field as invalid, optionally setting the name of validation * Marks a field as invalid, optionally setting the name of validation
* rule (in case of multiple validation for field) that was broken. * rule (in case of multiple validation for field) that was broken.
@ -2468,6 +2483,7 @@ class Model extends Overloadable {
} }
$this->validationErrors[$field] = $value; $this->validationErrors[$field] = $value;
} }
/** /**
* Returns true if given field name is a foreign key in this model. * Returns true if given field name is a foreign key in this model.
* *
@ -2484,6 +2500,7 @@ class Model extends Overloadable {
} }
return in_array($field, $foreignKeys); return in_array($field, $foreignKeys);
} }
/** /**
* Returns the display field for this model. * Returns the display field for this model.
* *
@ -2494,6 +2511,7 @@ class Model extends Overloadable {
function getDisplayField() { function getDisplayField() {
return $this->displayField; return $this->displayField;
} }
/** /**
* Escapes the field name and prepends the model name. Escaping is done according to the current database driver's rules. * Escapes the field name and prepends the model name. Escaping is done according to the current database driver's rules.
* *
@ -2515,6 +2533,7 @@ class Model extends Overloadable {
} }
return $db->name($alias . '.' . $field); return $db->name($alias . '.' . $field);
} }
/** /**
* Returns the current record's ID * Returns the current record's ID
* *
@ -2547,6 +2566,7 @@ class Model extends Overloadable {
return false; return false;
} }
/** /**
* Returns the ID of the last record this model inserted. * Returns the ID of the last record this model inserted.
* *
@ -2556,6 +2576,7 @@ class Model extends Overloadable {
function getLastInsertID() { function getLastInsertID() {
return $this->getInsertID(); return $this->getInsertID();
} }
/** /**
* Returns the ID of the last record this model inserted. * Returns the ID of the last record this model inserted.
* *
@ -2565,6 +2586,7 @@ class Model extends Overloadable {
function getInsertID() { function getInsertID() {
return $this->__insertID; return $this->__insertID;
} }
/** /**
* Sets the ID of the last record this model inserted * Sets the ID of the last record this model inserted
* *
@ -2658,7 +2680,12 @@ class Model extends Overloadable {
} }
return array_keys($this->{$type}); return array_keys($this->{$type});
} else { } else {
$assoc = array_merge($this->hasOne, $this->hasMany, $this->belongsTo, $this->hasAndBelongsToMany); $assoc = array_merge(
$this->hasOne,
$this->hasMany,
$this->belongsTo,
$this->hasAndBelongsToMany
);
if (array_key_exists($type, $assoc)) { if (array_key_exists($type, $assoc)) {
foreach ($this->__associations as $a) { foreach ($this->__associations as $a) {
if (isset($this->{$a}[$type])) { if (isset($this->{$a}[$type])) {
@ -2672,7 +2699,8 @@ class Model extends Overloadable {
} }
} }
/** /**
* Gets the name and fields to be used by a join model. This allows specifying join fields in the association definition. * Gets the name and fields to be used by a join model. This allows specifying join fields
* in the association definition.
* *
* @param object $model The model to be joined * @param object $model The model to be joined
* @param mixed $with The 'with' key of the model association * @param mixed $with The 'with' key of the model association
@ -2686,16 +2714,19 @@ class Model extends Overloadable {
} elseif (is_array($assoc)) { } elseif (is_array($assoc)) {
$with = key($assoc); $with = key($assoc);
return array($with, array_unique(array_merge($assoc[$with], $keys))); return array($with, array_unique(array_merge($assoc[$with], $keys)));
} else {
trigger_error(sprintf(__('Invalid join model settings in %s', true), $model->alias), E_USER_WARNING);
} }
trigger_error(
sprintf(__('Invalid join model settings in %s', true), $model->alias),
E_USER_WARNING
);
} }
/** /**
* Called before each find operation. Return false if you want to halt the find * Called before each find operation. Return false if you want to halt the find
* call, otherwise return the (modified) query data. * call, otherwise return the (modified) query data.
* *
* @param array $queryData Data used to execute this query, i.e. conditions, order, etc. * @param array $queryData Data used to execute this query, i.e. conditions, order, etc.
* @return mixed true if the operation should continue, false if it should abort; or, modified $queryData to continue with new $queryData * @return mixed true if the operation should continue, false if it should abort; or, modified
* $queryData to continue with new $queryData
* @access public * @access public
* @link http://book.cakephp.org/view/680/beforeFind * @link http://book.cakephp.org/view/680/beforeFind
*/ */
@ -2827,7 +2858,10 @@ class Model extends Overloadable {
* @see Model::find('all') * @see Model::find('all')
*/ */
function findAll($conditions = null, $fields = null, $order = null, $limit = null, $page = 1, $recursive = null) { function findAll($conditions = null, $fields = null, $order = null, $limit = null, $page = 1, $recursive = null) {
//trigger_error(__('(Model::findAll) Deprecated, use Model::find("all")', true), E_USER_WARNING); trigger_error(
__('(Model::findAll) Deprecated, use Model::find("all")', true),
E_USER_WARNING
);
return $this->find('all', compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive')); return $this->find('all', compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive'));
} }
/** /**
@ -2835,7 +2869,10 @@ class Model extends Overloadable {
* @see Model::find('count') * @see Model::find('count')
*/ */
function findCount($conditions = null, $recursive = 0) { function findCount($conditions = null, $recursive = 0) {
//trigger_error(__('(Model::findCount) Deprecated, use Model::find("count")', true), E_USER_WARNING); trigger_error(
__('(Model::findCount) Deprecated, use Model::find("count")', true),
E_USER_WARNING
);
return $this->find('count', compact('conditions', 'recursive')); return $this->find('count', compact('conditions', 'recursive'));
} }
/** /**
@ -2843,7 +2880,10 @@ class Model extends Overloadable {
* @see Model::find('threaded') * @see Model::find('threaded')
*/ */
function findAllThreaded($conditions = null, $fields = null, $order = null) { function findAllThreaded($conditions = null, $fields = null, $order = null) {
//trigger_error(__('(Model::findAllThreaded) Deprecated, use Model::find("threaded")', true), E_USER_WARNING); trigger_error(
__('(Model::findAllThreaded) Deprecated, use Model::find("threaded")', true),
E_USER_WARNING
);
return $this->find('threaded', compact('conditions', 'fields', 'order')); return $this->find('threaded', compact('conditions', 'fields', 'order'));
} }
/** /**
@ -2851,7 +2891,10 @@ class Model extends Overloadable {
* @see Model::find('neighbors') * @see Model::find('neighbors')
*/ */
function findNeighbours($conditions = null, $field, $value) { function findNeighbours($conditions = null, $field, $value) {
//trigger_error(__('(Model::findNeighbours) Deprecated, use Model::find("neighbors")', true), E_USER_WARNING); trigger_error(
__('(Model::findNeighbours) Deprecated, use Model::find("neighbors")', true),
E_USER_WARNING
);
$query = compact('conditions', 'field', 'value'); $query = compact('conditions', 'field', 'value');
$query['fields'] = $field; $query['fields'] = $field;
if (is_array($field)) { if (is_array($field)) {

View file

@ -1,27 +1,22 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* String handling methods. * String handling methods.
* *
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @subpackage cake.cake.libs * @subpackage cake.cake.libs
* @since CakePHP(tm) v 1.2.0.5551 * @since CakePHP(tm) v 1.2.0.5551
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
* String handling methods. * String handling methods.
@ -59,7 +54,9 @@ class String extends Object {
if (strpos($node, ':') !== false) { if (strpos($node, ':') !== false) {
if (substr_count($node, '::')) { if (substr_count($node, '::')) {
$node = str_replace('::', str_repeat(':0000', 8 - substr_count($node, ':')) . ':', $node); $node = str_replace(
'::', str_repeat(':0000', 8 - substr_count($node, ':')) . ':', $node
);
} }
$node = explode(':', $node) ; $node = explode(':', $node) ;
$ipv6 = '' ; $ipv6 = '' ;
@ -111,14 +108,16 @@ class String extends Object {
} }
list($timeMid, $timeLow) = explode(' ', microtime()); list($timeMid, $timeLow) = explode(' ', microtime());
$uuid = sprintf("%08x-%04x-%04x-%02x%02x-%04x%08x", (int)$timeLow, (int)substr($timeMid, 2) & 0xffff, $uuid = sprintf(
mt_rand(0, 0xfff) | 0x4000, mt_rand(0, 0x3f) | 0x80, mt_rand(0, 0xff), $pid, $node); "%08x-%04x-%04x-%02x%02x-%04x%08x", (int)$timeLow, (int)substr($timeMid, 2) & 0xffff,
mt_rand(0, 0xfff) | 0x4000, mt_rand(0, 0x3f) | 0x80, mt_rand(0, 0xff), $pid, $node
);
return $uuid; return $uuid;
} }
/** /**
* Tokenizes a string using $separator, ignoring any instance of $separator that appears between $leftBound * Tokenizes a string using $separator, ignoring any instance of $separator that appears between
* and $rightBound * $leftBound and $rightBound
* *
* @param string $data The data to tokenize * @param string $data The data to tokenize
* @param string $separator The token to split the data on * @param string $separator The token to split the data on
@ -140,7 +139,11 @@ class String extends Object {
while ($offset <= $length) { while ($offset <= $length) {
$tmpOffset = -1; $tmpOffset = -1;
$offsets = array(strpos($data, $separator, $offset), strpos($data, $leftBound, $offset), strpos($data, $rightBound, $offset)); $offsets = array(
strpos($data, $separator, $offset),
strpos($data, $leftBound, $offset),
strpos($data, $rightBound, $offset)
);
for ($i = 0; $i < 3; $i++) { for ($i = 0; $i < 3; $i++) {
if ($offsets[$i] !== false && ($offsets[$i] < $tmpOffset || $tmpOffset == -1)) { if ($offsets[$i] !== false && ($offsets[$i] < $tmpOffset || $tmpOffset == -1)) {
$tmpOffset = $offsets[$i]; $tmpOffset = $offsets[$i];
@ -190,21 +193,22 @@ class String extends Object {
return $data; return $data;
} }
/** /**
* Replaces variable placeholders inside a $str with any given $data. Each key in the $data array corresponds to a variable * Replaces variable placeholders inside a $str with any given $data. Each key in the $data array
* placeholder name in $str. Example: * corresponds to a variable placeholder name in $str.
* * Example: String::insert(':name is :age years old.', array('name' => 'Bob', '65'));
* Sample: String::insert('My name is :name and I am :age years old.', array('name' => 'Bob', '65')); * Returns: Bob is 65 years old.
* Returns: My name is Bob and I am 65 years old.
* *
* Available $options are: * Available $options are:
* before: The character or string in front of the name of the variable placeholder (Defaults to ':') * before: The character or string in front of the name of the variable placeholder (Defaults to ':')
* after: The character or string after the name of the variable placeholder (Defaults to null) * after: The character or string after the name of the variable placeholder (Defaults to null)
* escape: The character or string used to escape the before character / string (Defaults to '\') * escape: The character or string used to escape the before character / string (Defaults to '\')
* format: A regex to use for matching variable placeholders. Default is: '/(?<!\\)\:%s/' (Overwrites before, after, breaks escape / clean) * format: A regex to use for matching variable placeholders. Default is: '/(?<!\\)\:%s/'
* (Overwrites before, after, breaks escape / clean)
* clean: A boolean or array with instructions for String::cleanInsert * clean: A boolean or array with instructions for String::cleanInsert
* *
* @param string $str A string containing variable placeholders * @param string $str A string containing variable placeholders
* @param string $data A key => val array where each key stands for a placeholder variable name to be replaced with val * @param string $data A key => val array where each key stands for a placeholder variable name
* to be replaced with val
* @param string $options An array of options, see description above * @param string $options An array of options, see description above
* @return string * @return string
* @access public * @access public
@ -247,6 +251,9 @@ class String extends Object {
} }
$dataReplacements = array_combine($hashKeys, array_values($data)); $dataReplacements = array_combine($hashKeys, array_values($data));
foreach ($dataReplacements as $tmpHash => $data) { foreach ($dataReplacements as $tmpHash => $data) {
if (is_array($data)) {
$data = '';
}
$str = str_replace($tmpHash, $data, $str); $str = str_replace($tmpHash, $data, $str);
} }
} }
@ -260,15 +267,17 @@ class String extends Object {
return String::cleanInsert($str, $options); return String::cleanInsert($str, $options);
} }
/** /**
* Cleans up a Set::insert formated string with given $options depending on the 'clean' key in $options. The default method used is * Cleans up a Set::insert formated string with given $options depending on the 'clean' key in
* text but html is also available. The goal of this function is to replace all whitespace and uneeded markup around placeholders * $options. The default method used is text but html is also available. The goal of this function
* that did not get replaced by Set::insert. * is to replace all whitespace and uneeded markup around placeholders that did not get replaced
* by Set::insert.
* *
* @param string $str * @param string $str
* @param string $options * @param string $options
* @return string * @return string
* @access public * @access public
* @static * @static
* @see Set::insert()
*/ */
function cleanInsert($str, $options) { function cleanInsert($str, $options) {
$clean = $options['clean']; $clean = $options['clean'];

View file

@ -1,26 +1,21 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* Pagination Helper class file. * Pagination Helper class file.
* *
* Generates pagination links * Generates pagination links
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @subpackage cake.cake.libs.view.helpers * @subpackage cake.cake.libs.view.helpers
* @since CakePHP(tm) v 1.2.0 * @since CakePHP(tm) v 1.2.0
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
* Pagination Helper class for easy generation of pagination links. * Pagination Helper class for easy generation of pagination links.
@ -105,7 +100,9 @@ class PaginatorHelper extends AppHelper {
if (!isset($this->params['paging'][$model])) { if (!isset($this->params['paging'][$model])) {
$this->params['paging'][$model] = array(); $this->params['paging'][$model] = array();
} }
$this->params['paging'][$model] = array_merge($this->params['paging'][$model], $options[$model]); $this->params['paging'][$model] = array_merge(
$this->params['paging'][$model], $options[$model]
);
unset($options[$model]); unset($options[$model]);
} }
$this->options = array_filter(array_merge($this->options, $options)); $this->options = array_filter(array_merge($this->options, $options));
@ -278,7 +275,9 @@ class PaginatorHelper extends AppHelper {
*/ */
function url($options = array(), $asArray = false, $model = null) { function url($options = array(), $asArray = false, $model = null) {
$paging = $this->params($model); $paging = $this->params($model);
$url = array_merge(array_filter(Set::diff(array_merge($paging['defaults'], $paging['options']), $paging['defaults'])), $options); $url = array_merge(array_filter(Set::diff(array_merge(
$paging['defaults'], $paging['options']), $paging['defaults'])), $options
);
if (isset($url['order'])) { if (isset($url['order'])) {
$sort = $direction = null; $sort = $direction = null;
@ -424,7 +423,8 @@ class PaginatorHelper extends AppHelper {
if (!is_array($options['separator'])) { if (!is_array($options['separator'])) {
$options['separator'] = array(' - ', $options['separator']); $options['separator'] = array(' - ', $options['separator']);
} }
$out = $start . $options['separator'][0] . $end . $options['separator'][1] . $paging['count']; $out = $start . $options['separator'][0] . $end . $options['separator'][1];
$out .= $paging['count'];
break; break;
case 'pages': case 'pages':
$out = $paging['page'] . $options['separator'] . $paging['pageCount']; $out = $paging['page'] . $options['separator'] . $paging['pageCount'];
@ -505,7 +505,8 @@ class PaginatorHelper extends AppHelper {
$out .= $before; $out .= $before;
for ($i = $start; $i < $params['page']; $i++) { for ($i = $start; $i < $params['page']; $i++) {
$out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options)) . $separator; $out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options))
. $separator;
} }
$out .= $this->Html->tag($tag, $params['page'], array('class' => 'current')); $out .= $this->Html->tag($tag, $params['page'], array('class' => 'current'));
@ -515,7 +516,8 @@ class PaginatorHelper extends AppHelper {
$start = $params['page'] + 1; $start = $params['page'] + 1;
for ($i = $start; $i < $end; $i++) { for ($i = $start; $i < $end; $i++) {
$out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options)). $separator; $out .= $this->Html->tag($tag, $this->link($i, array('page' => $i), $options))
. $separator;
} }
if ($end != $params['page']) { if ($end != $params['page']) {
@ -591,7 +593,8 @@ class PaginatorHelper extends AppHelper {
} }
$out .= $after; $out .= $after;
} elseif ($params['page'] > 1) { } elseif ($params['page'] > 1) {
$out = $this->Html->tag($tag, $this->link($first, array('page' => 1), $options)) . $after; $out = $this->Html->tag($tag, $this->link($first, array('page' => 1), $options))
. $after;
} }
return $out; return $out;
} }
@ -637,7 +640,9 @@ class PaginatorHelper extends AppHelper {
} }
$out = $before . $out; $out = $before . $out;
} elseif ($params['page'] < $params['pageCount']) { } elseif ($params['page'] < $params['pageCount']) {
$out = $before . $this->Html->tag($tag, $this->link($last, array('page' => $params['pageCount']), $options)); $out = $before . $this->Html->tag(
$tag, $this->link($last, array('page' => $params['pageCount']), $options
));
} }
return $out; return $out;
} }

View file

@ -1,5 +1,4 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* ControllerTest file * ControllerTest file
* *
@ -7,22 +6,18 @@
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) Tests <https://trac.cakephp.org/wiki/Developement/TestSuite> * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* Licensed under The Open Group Test Suite 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link https://trac.cakephp.org/wiki/Developement/TestSuite CakePHP(tm) Tests
* @package cake * @package cake
* @subpackage cake.tests.cases.libs.controller * @subpackage cake.tests.cases.libs.controller
* @since CakePHP(tm) v 1.2.0.5436 * @since CakePHP(tm) v 1.2.0.5436
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
*/ */
App::import('Core', 'Controller'); App::import('Core', 'Controller');
App::import('Component', 'Security'); App::import('Component', 'Security');
@ -988,6 +983,16 @@ class ControllerTest extends CakeTestCase {
$expected = 'http://cakephp.org'; $expected = 'http://cakephp.org';
$this->assertIdentical($result, $expected); $this->assertIdentical($result, $expected);
$_SERVER['HTTP_REFERER'] = '';
$referer = array(
'controller' => 'pages',
'action' => 'display',
'home'
);
$result = $Controller->referer($referer, false);
$expected = 'http://' . env('HTTP_HOST') . '/pages/display/home';;
$this->assertIdentical($result, $expected);
$_SERVER['HTTP_REFERER'] = ''; $_SERVER['HTTP_REFERER'] = '';
$result = $Controller->referer(null, false); $result = $Controller->referer(null, false);
$expected = '/'; $expected = '/';

View file

@ -7,22 +7,18 @@
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) Tests <https://trac.cakephp.org/wiki/Developement/TestSuite> * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* Licensed under The Open Group Test Suite 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link https://trac.cakephp.org/wiki/Developement/TestSuite CakePHP(tm) Tests
* @package cake * @package cake
* @subpackage cake.tests.cases.libs * @subpackage cake.tests.cases.libs
* @since CakePHP(tm) v 1.2.0.5432 * @since CakePHP(tm) v 1.2.0.5432
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
*/ */
App::import('Core', 'Debugger'); App::import('Core', 'Debugger');
/** /**
@ -88,10 +84,18 @@ class DebuggerTest extends CakeTestCase {
* @return void * @return void
*/ */
function testExcerpt() { function testExcerpt() {
$return = Debugger::excerpt(__FILE__, 2, 2); $result = Debugger::excerpt(__FILE__, __LINE__, 2);
$this->assertTrue(is_array($return)); $this->assertTrue(is_array($result));
$this->assertEqual(count($return), 4); $this->assertEqual(count($result), 5);
$this->assertPattern('#/*&nbsp;SVN&nbsp;FILE:&nbsp;\$Id:&nbsp;debugger.test.php#', $return[1]); $this->assertPattern('/function(.+)testExcerpt/', $result[1]);
$result = Debugger::excerpt(__FILE__, 2, 2);
$this->assertTrue(is_array($result));
$this->assertEqual(count($result), 4);
$expected = '<code><span style="color: #000000"><span style="color: #0000BB">&lt;?php';
$expected .= '</span></span></code>';
$this->assertEqual($result[0], $expected);
$return = Debugger::excerpt('[internal]', 2, 2); $return = Debugger::excerpt('[internal]', 2, 2);
$this->assertTrue(empty($return)); $this->assertTrue(empty($return));
@ -135,14 +139,60 @@ class DebuggerTest extends CakeTestCase {
ob_start(); ob_start();
Debugger::output('js'); Debugger::output('js');
$buzz .= ''; $buzz .= '';
$result = ob_get_clean(); $result = explode('</a>', ob_get_clean());
$this->assertPattern("/<a href\='javascript:void\(0\);' onclick\='/", $result); $this->assertTags($result[0], array(
$this->assertPattern('/<b>Notice<\/b>/', $result); 'a' => array(
$this->assertPattern('/Undefined variable: buzz/', $result); 'href' => "javascript:void(0);",
$this->assertPattern('/<a[^>]+>Code<\/a>/', $result); 'onclick' => "document.getElementById('cakeErr4-trace').style.display = " .
$this->assertPattern('/<a[^>]+>Context<\/a>/', $result); "(document.getElementById('cakeErr4-trace').style.display == 'none'" .
" ? '' : 'none');"
),
'b' => array(), 'Notice', '/b', ' (8)'
));
$this->assertPattern('/Undefined variable: buzz/', $result[1]);
$this->assertPattern('/<a[^>]+>Code/', $result[1]);
$this->assertPattern('/<a[^>]+>Context/', $result[2]);
set_error_handler('simpleTestErrorHandler'); set_error_handler('simpleTestErrorHandler');
} }
/**
* Tests that changes in output formats using Debugger::output() change the templates used.
*
* @return void
*/
function testChangeOutputFormats() {
Debugger::invoke(Debugger::getInstance());
Debugger::output('js', array(
'traceLine' => '{:reference} - <a href="txmt://open?url=file://{:file}' .
'&line={:line}">{:path}</a>, line {:line}'
));
$result = Debugger::trace();
$this->assertPattern('/' . preg_quote('txmt://open?url=file:///', '/') . '/', $result);
Debugger::output('xml', array(
'error' => '<error><code>{:code}</code><file>{:file}</file><line>{:line}</line>' .
'{:description}</error>',
'context' => "<context>{:context}</context>",
'trace' => "<stack>{:trace}</stack>",
));
Debugger::output('xml');
ob_start();
$foo .= '';
$result = ob_get_clean();
set_error_handler('simpleTestErrorHandler');
$data = array(
'error' => array(),
'code' => array(), '8', '/code',
'file' => array(), 'preg:/[^<]+/', '/file',
'line' => array(), '' . (intval(__LINE__) + -8), '/line',
'Undefined variable: foo',
'/error'
);
$this->assertTags($result, $data, true);
}
/** /**
* testTrimPath method * testTrimPath method
* *

View file

@ -1,5 +1,4 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* BehaviorTest file * BehaviorTest file
* *
@ -7,21 +6,18 @@
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * @link http://cakephp.org
* @link http://www.cakephp.org
* @package cake * @package cake
* @subpackage cake.tests.cases.libs.model * @subpackage cake.tests.cases.libs.model
* @since 1.2 * @since 1.2
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
App::import('Model', 'AppModel'); App::import('Model', 'AppModel');
require_once dirname(__FILE__) . DS . 'models.php'; require_once dirname(__FILE__) . DS . 'models.php';
@ -796,26 +792,26 @@ class BehaviorTest extends CakeTestCase {
$Apple = new Apple(); $Apple = new Apple();
$Apple->Behaviors->attach('Test', array('beforeFind' => 'off', 'beforeDelete' => 'off')); $Apple->Behaviors->attach('Test', array('beforeFind' => 'off', 'beforeDelete' => 'off'));
$this->assertIdentical($Apple->del(6), true); $this->assertIdentical($Apple->delete(6), true);
$Apple->Behaviors->attach('Test', array('beforeDelete' => 'on')); $Apple->Behaviors->attach('Test', array('beforeDelete' => 'on'));
$this->assertIdentical($Apple->delete(4), false); $this->assertIdentical($Apple->delete(4), false);
$Apple->Behaviors->attach('Test', array('beforeDelete' => 'test2')); $Apple->Behaviors->attach('Test', array('beforeDelete' => 'test2'));
if (ob_start()) { if (ob_start()) {
$results = $Apple->del(4); $results = $Apple->delete(4);
$this->assertIdentical(trim(ob_get_clean()), 'beforeDelete success (cascading)'); $this->assertIdentical(trim(ob_get_clean()), 'beforeDelete success (cascading)');
$this->assertIdentical($results, true); $this->assertIdentical($results, true);
} }
if (ob_start()) { if (ob_start()) {
$results = $Apple->del(3, false); $results = $Apple->delete(3, false);
$this->assertIdentical(trim(ob_get_clean()), 'beforeDelete success'); $this->assertIdentical(trim(ob_get_clean()), 'beforeDelete success');
$this->assertIdentical($results, true); $this->assertIdentical($results, true);
} }
$Apple->Behaviors->attach('Test', array('beforeDelete' => 'off', 'afterDelete' => 'on')); $Apple->Behaviors->attach('Test', array('beforeDelete' => 'off', 'afterDelete' => 'on'));
if (ob_start()) { if (ob_start()) {
$results = $Apple->del(2, false); $results = $Apple->delete(2, false);
$this->assertIdentical(trim(ob_get_clean()), 'afterDelete success'); $this->assertIdentical(trim(ob_get_clean()), 'afterDelete success');
$this->assertIdentical($results, true); $this->assertIdentical($results, true);
} }
@ -836,7 +832,7 @@ class BehaviorTest extends CakeTestCase {
} }
if (ob_start()) { if (ob_start()) {
$Apple->del(99); $Apple->delete(99);
//$this->assertIdentical(trim(ob_get_clean()), 'onError trigger success'); //$this->assertIdentical(trim(ob_get_clean()), 'onError trigger success');
} }
} }

View file

@ -1,5 +1,4 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* ModelTest file * ModelTest file
* *
@ -7,22 +6,18 @@
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) Tests <https://trac.cakephp.org/wiki/Developement/TestSuite> * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* Licensed under The Open Group Test Suite 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link https://trac.cakephp.org/wiki/Developement/TestSuite CakePHP(tm) Tests
* @package cake * @package cake
* @subpackage cake.tests.cases.libs.model * @subpackage cake.tests.cases.libs.model
* @since CakePHP(tm) v 1.2.0.4206 * @since CakePHP(tm) v 1.2.0.4206
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
*/ */
App::import('Core', array('AppModel', 'Model')); App::import('Core', array('AppModel', 'Model'));
require_once dirname(__FILE__) . DS . 'models.php'; require_once dirname(__FILE__) . DS . 'models.php';
@ -3890,7 +3885,7 @@ class ModelTest extends CakeTestCase {
$User = new CounterCacheUser(); $User = new CounterCacheUser();
$Post = new CounterCachePost(); $Post = new CounterCachePost();
$Post->del(2); $Post->delete(2);
$user = $User->find('first', array( $user = $User->find('first', array(
'conditions' => array('id' => 66),'recursive' => -1 'conditions' => array('id' => 66),'recursive' => -1
)); ));
@ -4005,7 +4000,7 @@ class ModelTest extends CakeTestCase {
$this->loadFixtures('Article'); $this->loadFixtures('Article');
$TestModel =& new Article(); $TestModel =& new Article();
$result = $TestModel->del(2); $result = $TestModel->delete(2);
$this->assertTrue($result); $this->assertTrue($result);
$result = $TestModel->read(null, 2); $result = $TestModel->read(null, 2);
@ -4019,7 +4014,7 @@ class ModelTest extends CakeTestCase {
); );
$this->assertEqual($result, $expected); $this->assertEqual($result, $expected);
$result = $TestModel->del(3); $result = $TestModel->delete(3);
$this->assertTrue($result); $this->assertTrue($result);
$result = $TestModel->read(null, 3); $result = $TestModel->read(null, 3);
@ -4130,7 +4125,7 @@ class ModelTest extends CakeTestCase {
$this->loadFixtures('Article', 'Comment', 'Attachment'); $this->loadFixtures('Article', 'Comment', 'Attachment');
$TestModel =& new Article(); $TestModel =& new Article();
$result = $TestModel->del(2); $result = $TestModel->delete(2);
$this->assertTrue($result); $this->assertTrue($result);
$TestModel->recursive = 2; $TestModel->recursive = 2;
@ -6369,7 +6364,7 @@ class ModelTest extends CakeTestCase {
$Cd =& new Cd(); $Cd =& new Cd();
$OverallFavorite =& new OverallFavorite(); $OverallFavorite =& new OverallFavorite();
$Cd->del(1); $Cd->delete(1);
$result = $OverallFavorite->find('all', array('fields' => array('model_type', 'model_id', 'priority'))); $result = $OverallFavorite->find('all', array('fields' => array('model_type', 'model_id', 'priority')));
$expected = array(array('OverallFavorite' => array('model_type' => 'Book', 'model_id' => 1, 'priority' => 2))); $expected = array(array('OverallFavorite' => array('model_type' => 'Book', 'model_id' => 1, 'priority' => 2)));

View file

@ -7,22 +7,18 @@
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) Tests <https://trac.cakephp.org/wiki/Developement/TestSuite> * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* Licensed under The Open Group Test Suite 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link https://trac.cakephp.org/wiki/Developement/TestSuite CakePHP(tm) Tests
* @package cake * @package cake
* @subpackage cake.tests.cases.libs * @subpackage cake.tests.cases.libs
* @since CakePHP(tm) v 1.2.0.5432 * @since CakePHP(tm) v 1.2.0.5432
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
*/ */
App::import('Core', 'String'); App::import('Core', 'String');
/** /**
@ -32,6 +28,7 @@ App::import('Core', 'String');
* @subpackage cake.tests.cases.libs * @subpackage cake.tests.cases.libs
*/ */
class StringTest extends CakeTestCase { class StringTest extends CakeTestCase {
/** /**
* testUuidGeneration method * testUuidGeneration method
* *
@ -44,6 +41,7 @@ class StringTest extends CakeTestCase {
$match = preg_match($pattern, $result); $match = preg_match($pattern, $result);
$this->assertTrue($match); $this->assertTrue($match);
} }
/** /**
* testMultipleUuidGeneration method * testMultipleUuidGeneration method
* *
@ -63,6 +61,7 @@ class StringTest extends CakeTestCase {
$check[] = $result; $check[] = $result;
} }
} }
/** /**
* testInsert method * testInsert method
* *
@ -199,13 +198,16 @@ class StringTest extends CakeTestCase {
$expected = "Pre-pended result"; $expected = "Pre-pended result";
$this->assertEqual($result, $expected); $this->assertEqual($result, $expected);
} }
/** /**
* test Clean Insert * test Clean Insert
* *
* @return void * @return void
**/ **/
function testCleanInsert() { function testCleanInsert() {
$result = String::cleanInsert(':incomplete', array('clean' => true, 'before' => ':', 'after' => '')); $result = String::cleanInsert(':incomplete', array(
'clean' => true, 'before' => ':', 'after' => ''
));
$this->assertEqual($result, ''); $this->assertEqual($result, '');
$result = String::cleanInsert(':incomplete', array( $result = String::cleanInsert(':incomplete', array(
@ -214,18 +216,40 @@ class StringTest extends CakeTestCase {
); );
$this->assertEqual($result, 'complete'); $this->assertEqual($result, 'complete');
$result = String::cleanInsert(':in.complete', array('clean' => true, 'before' => ':', 'after' => '')); $result = String::cleanInsert(':in.complete', array(
'clean' => true, 'before' => ':', 'after' => ''
));
$this->assertEqual($result, ''); $this->assertEqual($result, '');
$result = String::cleanInsert(':in.complete and', array('clean' => true, 'before' => ':', 'after' => '')); $result = String::cleanInsert(':in.complete and', array(
'clean' => true, 'before' => ':', 'after' => '')
);
$this->assertEqual($result, ''); $this->assertEqual($result, '');
$result = String::cleanInsert(':in.complete or stuff', array('clean' => true, 'before' => ':', 'after' => '')); $result = String::cleanInsert(':in.complete or stuff', array(
'clean' => true, 'before' => ':', 'after' => ''
));
$this->assertEqual($result, 'stuff'); $this->assertEqual($result, 'stuff');
$result = String::cleanInsert('<p class=":missing" id=":missing">Text here</p>', array('clean' => 'html', 'before' => ':', 'after' => '')); $result = String::cleanInsert(
'<p class=":missing" id=":missing">Text here</p>',
array('clean' => 'html', 'before' => ':', 'after' => '')
);
$this->assertEqual($result, '<p>Text here</p>'); $this->assertEqual($result, '<p>Text here</p>');
} }
/**
* Tests that non-insertable variables (i.e. arrays) are skipped when used as values in
* String::insert().
*
* @return void
*/
function testAutoIgnoreBadInsertData() {
$data = array('foo' => 'alpha', 'bar' => 'beta', 'fale' => array());
$result = String::insert('(:foo > :bar || :fale!)', $data, array('clean' => 'text'));
$this->assertEqual($result, '(alpha > beta || !)');
}
/** /**
* testTokenize method * testTokenize method
* *
@ -254,4 +278,5 @@ class StringTest extends CakeTestCase {
$this->assertEqual($expected, $result); $this->assertEqual($expected, $result);
} }
} }
?> ?>

View file

@ -1,29 +1,25 @@
<?php <?php
/* SVN FILE: $Id$ */
/** /**
* 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. * - requires App.baseUrl to be uncommented in app/config/core.php
* - app/webroot is not set as a document root.
* *
* PHP versions 4 and 5 * PHP versions 4 and 5
* *
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org) * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* *
* 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 * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @copyright Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org) * @link http://cakephp.org
* @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
* @package cake * @package cake
* @since CakePHP(tm) v 0.2.9 * @since CakePHP(tm) v 0.2.9
* @version $Revision$ * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
* @modifiedby $LastChangedBy$
* @lastmodified $Date$
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*/ */
/** /**
* Get Cake's root directory * Get Cake's root directory
@ -34,29 +30,27 @@
define('WEBROOT_DIR', 'webroot'); define('WEBROOT_DIR', 'webroot');
define('WWW_ROOT', ROOT . DS . APP_DIR . DS . WEBROOT_DIR . DS); define('WWW_ROOT', ROOT . DS . APP_DIR . DS . WEBROOT_DIR . DS);
/** /**
* This only needs to be changed if the cake installed libs are located * This only needs to be changed if the "cake" directory is located
* outside of the distributed directory structure. * outside of the distributed structure.
* Full path to the directory containing "cake". Do not add trailing directory separator
*/ */
if (!defined('CAKE_CORE_INCLUDE_PATH')) { 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); define('CAKE_CORE_INCLUDE_PATH', ROOT);
} }
/**
* Set the include path or define app and core path
*/
if (function_exists('ini_set')) { if (function_exists('ini_set')) {
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . CAKE_CORE_INCLUDE_PATH . PATH_SEPARATOR . ROOT . DS . APP_DIR . DS); ini_set('include_path',
ini_get('include_path') . PATH_SEPARATOR . CAKE_CORE_INCLUDE_PATH
. PATH_SEPARATOR . ROOT . DS . APP_DIR . DS
);
define('APP_PATH', null); define('APP_PATH', null);
define('CORE_PATH', null); define('CORE_PATH', null);
} else { } else {
define('APP_PATH', ROOT . DS . APP_DIR . DS); define('APP_PATH', ROOT . DS . APP_DIR . DS);
define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS); define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);
} }
require CORE_PATH . 'cake' . DS . 'basics.php';
$TIME_START = getMicrotime();
require CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php';
require LIBS . 'object.php';
require LIBS . 'inflector.php';
require LIBS . 'configure.php';
$bootstrap = true;
$url = null;
require APP_DIR . DS . WEBROOT_DIR . DS . 'index.php'; require APP_DIR . DS . WEBROOT_DIR . DS . 'index.php';
?> ?>