Merge branch '2.2-lazy-helpers' into 2.2

This commit is contained in:
Jose Lorenzo Rodriguez 2012-04-22 20:40:11 -04:30
commit ed0c5a4746
7 changed files with 96 additions and 21 deletions

View file

@ -38,12 +38,6 @@ class PagesController extends AppController {
*/ */
public $name = 'Pages'; public $name = 'Pages';
/**
* Default helper
*
* @var array
*/
public $helpers = array('Html', 'Session');
/** /**
* This controller does not use a model * This controller does not use a model

View file

@ -29,13 +29,6 @@
*/ */
class PagesController extends AppController { class PagesController extends AppController {
/**
* Default helper
*
* @var array
*/
public $helpers = array('Html');
/** /**
* This controller does not use a model * This controller does not use a model
* *

View file

@ -92,7 +92,7 @@ class Controller extends Object implements CakeEventListener {
* @var mixed A single name as a string or a list of names as an array. * @var mixed A single name as a string or a list of names as an array.
* @link http://book.cakephp.org/2.0/en/controllers.html#components-helpers-and-uses * @link http://book.cakephp.org/2.0/en/controllers.html#components-helpers-and-uses
*/ */
public $helpers = array('Session', 'Html', 'Form'); public $helpers = array();
/** /**
* An instance of a CakeRequest object that contains information about the current request. * An instance of a CakeRequest object that contains information about the current request.

View file

@ -67,6 +67,35 @@ class HelperCollectionTest extends CakeTestCase {
$this->assertTrue($this->Helpers->enabled('Html')); $this->assertTrue($this->Helpers->enabled('Html'));
} }
/**
* test lazy loading of helpers
*
* @return void
*/
public function testLazyLoad() {
$result = $this->Helpers->Html;
$this->assertInstanceOf('HtmlHelper', $result);
$result = $this->Helpers->Form;
$this->assertInstanceOf('FormHelper', $result);
App::build(array('Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS)));
$this->View->plugin = 'TestPlugin';
CakePlugin::load(array('TestPlugin'));
$result = $this->Helpers->OtherHelper;
$this->assertInstanceOf('OtherHelperHelper', $result);
}
/**
* test lazy loading of helpers
*
* @expectedException MissingHelperException
* @return void
*/
public function testLazyLoadException() {
$result = $this->Helpers->NotAHelper;
}
/** /**
* Tests loading as an alias * Tests loading as an alias
* *
@ -149,8 +178,8 @@ class HelperCollectionTest extends CakeTestCase {
$this->assertEquals(array('Form', 'Html'), $result, 'loaded helpers is wrong'); $this->assertEquals(array('Form', 'Html'), $result, 'loaded helpers is wrong');
$this->Helpers->unload('Html'); $this->Helpers->unload('Html');
$this->assertFalse(isset($this->Helpers->Html)); $this->assertNotContains('Html', $this->Helpers->attached());
$this->assertTrue(isset($this->Helpers->Form)); $this->assertContains('Form', $this->Helpers->attached());
$result = $this->Helpers->attached(); $result = $this->Helpers->attached();
$this->assertEquals(array('Form'), $result, 'loaded helpers is wrong'); $this->assertEquals(array('Form'), $result, 'loaded helpers is wrong');

View file

@ -798,6 +798,20 @@ class ViewTest extends CakeTestCase {
$this->assertInstanceOf('FormHelper', $View->Form, 'Object type is wrong.'); $this->assertInstanceOf('FormHelper', $View->Form, 'Object type is wrong.');
} }
/**
* test lazy loading helpers
*
* @return void
*/
public function testLazyLoadHelpers() {
$View = new View($this->PostsController);
$View->helpers = array();
$this->assertInstanceOf('HtmlHelper', $View->Html, 'Object type is wrong.');
$this->assertInstanceOf('FormHelper', $View->Form, 'Object type is wrong.');
}
/** /**
* test the correct triggering of helper callbacks * test the correct triggering of helper callbacks
* *

View file

@ -43,6 +43,51 @@ class HelperCollection extends ObjectCollection implements CakeEventListener {
$this->_View = $view; $this->_View = $view;
} }
/**
* Tries to lazy load a helper based on its name, if it cannot be found
* in the application folder, then it tries looking under the current plugin
* if any
*
* @param string $helper The helper name to be loaded
* @return boolean wheter the helper could be loaded or not
**/
public function __isset($helper) {
if (parent::__isset($helper)) {
return true;
}
try {
$this->load($helper);
} catch (MissingHelperException $exception) {
if ($this->_View->plugin) {
$this->load($this->_View->plugin . '.' . $helper);
return true;
}
}
if (!empty($exception)) {
throw $exception;
}
return true;
}
/**
* Provide public read access to the loaded objects
*
* @param string $name Name of property to read
* @return mixed
*/
public function __get($name) {
if ($result = parent::__get($name)) {
return $result;
}
if ($this->__isset($name)) {
return $this->_loaded[$name];
}
return null;
}
/** /**
* Loads/constructs a helper. Will return the instance in the registry if it already exists. * Loads/constructs a helper. Will return the instance in the registry if it already exists.
* By setting `$enable` to false you can disable callbacks for a helper. Alternatively you * By setting `$enable` to false you can disable callbacks for a helper. Alternatively you

View file

@ -784,9 +784,6 @@ class View extends Object {
* @return mixed * @return mixed
*/ */
public function __get($name) { public function __get($name) {
if (isset($this->Helpers->{$name})) {
return $this->Helpers->{$name};
}
switch ($name) { switch ($name) {
case 'base': case 'base':
case 'here': case 'here':
@ -799,9 +796,12 @@ class View extends Object {
return $this->request; return $this->request;
case 'output': case 'output':
return $this->Blocks->get('content'); return $this->Blocks->get('content');
default:
return $this->{$name};
} }
if (isset($this->Helpers->{$name})) {
$this->{$name} = $this->Helpers->{$name};
return $this->Helpers->{$name};
}
return $this->{$name};
} }
/** /**