diff --git a/app/Controller/PagesController.php b/app/Controller/PagesController.php index 83fd907bc5f..4759719ae9c 100644 --- a/app/Controller/PagesController.php +++ b/app/Controller/PagesController.php @@ -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 diff --git a/lib/Cake/Console/Templates/skel/Controller/PagesController.php b/lib/Cake/Console/Templates/skel/Controller/PagesController.php index b291eb08e51..73649547f87 100644 --- a/lib/Cake/Console/Templates/skel/Controller/PagesController.php +++ b/lib/Cake/Console/Templates/skel/Controller/PagesController.php @@ -29,13 +29,6 @@ */ class PagesController extends AppController { -/** - * Default helper - * - * @var array - */ - public $helpers = array('Html'); - /** * This controller does not use a model * diff --git a/lib/Cake/Controller/Controller.php b/lib/Cake/Controller/Controller.php index cebdb9b67dc..7b427313e7c 100644 --- a/lib/Cake/Controller/Controller.php +++ b/lib/Cake/Controller/Controller.php @@ -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. diff --git a/lib/Cake/Test/Case/View/HelperCollectionTest.php b/lib/Cake/Test/Case/View/HelperCollectionTest.php index 742d5d3e3f4..a7f222d50a9 100644 --- a/lib/Cake/Test/Case/View/HelperCollectionTest.php +++ b/lib/Cake/Test/Case/View/HelperCollectionTest.php @@ -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 * @@ -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'); diff --git a/lib/Cake/Test/Case/View/ViewTest.php b/lib/Cake/Test/Case/View/ViewTest.php index 4de64b05f70..c316884bb4c 100644 --- a/lib/Cake/Test/Case/View/ViewTest.php +++ b/lib/Cake/Test/Case/View/ViewTest.php @@ -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 * diff --git a/lib/Cake/View/HelperCollection.php b/lib/Cake/View/HelperCollection.php index e726f3d3ad9..7fda46762ff 100644 --- a/lib/Cake/View/HelperCollection.php +++ b/lib/Cake/View/HelperCollection.php @@ -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 diff --git a/lib/Cake/View/View.php b/lib/Cake/View/View.php index 77eafb8b81e..79eb24ca48c 100644 --- a/lib/Cake/View/View.php +++ b/lib/Cake/View/View.php @@ -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': @@ -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}; } /**