Skip to content

Commit

Permalink
Merge branch '2.2-lazy-helpers' into 2.2
Browse files Browse the repository at this point in the history
  • Loading branch information
lorenzo committed Apr 23, 2012
2 parents 53a4de7 + 18b8434 commit ed0c5a4
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 21 deletions.
6 changes: 0 additions & 6 deletions app/Controller/PagesController.php
Expand Up @@ -38,12 +38,6 @@ class PagesController extends AppController {
*/
public $name = 'Pages';

/**
* Default helper
*
* @var array
*/
public $helpers = array('Html', 'Session');

/**
* This controller does not use a model
Expand Down
Expand Up @@ -29,13 +29,6 @@
*/
class PagesController extends AppController {

/**
* Default helper
*
* @var array
*/
public $helpers = array('Html');

/**
* This controller does not use a model
*
Expand Down
2 changes: 1 addition & 1 deletion lib/Cake/Controller/Controller.php
Expand Up @@ -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.
* @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.
Expand Down
33 changes: 31 additions & 2 deletions lib/Cake/Test/Case/View/HelperCollectionTest.php
Expand Up @@ -67,6 +67,35 @@ public function testLoad() {
$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
*
Expand Down Expand Up @@ -149,8 +178,8 @@ public function testUnload() {
$this->assertEquals(array('Form', 'Html'), $result, 'loaded helpers is wrong');

$this->Helpers->unload('Html');
$this->assertFalse(isset($this->Helpers->Html));
$this->assertTrue(isset($this->Helpers->Form));
$this->assertNotContains('Html', $this->Helpers->attached());
$this->assertContains('Form', $this->Helpers->attached());

$result = $this->Helpers->attached();
$this->assertEquals(array('Form'), $result, 'loaded helpers is wrong');
Expand Down
14 changes: 14 additions & 0 deletions lib/Cake/Test/Case/View/ViewTest.php
Expand Up @@ -798,6 +798,20 @@ public function testLoadHelpers() {
$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
*
Expand Down
45 changes: 45 additions & 0 deletions lib/Cake/View/HelperCollection.php
Expand Up @@ -43,6 +43,51 @@ public function __construct(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.
* By setting `$enable` to false you can disable callbacks for a helper. Alternatively you
Expand Down
10 changes: 5 additions & 5 deletions lib/Cake/View/View.php
Expand Up @@ -784,9 +784,6 @@ public function set($one, $two = null) {
* @return mixed
*/
public function __get($name) {
if (isset($this->Helpers->{$name})) {
return $this->Helpers->{$name};
}
switch ($name) {
case 'base':
case 'here':
Expand All @@ -799,9 +796,12 @@ public function __get($name) {
return $this->request;
case 'output':
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};
}

/**
Expand Down

0 comments on commit ed0c5a4

Please sign in to comment.