Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch '2.2-lazy-helpers' into 2.2

  • Loading branch information...
commit ed0c5a4746c51e110f6d4e35000e862f10567f4e 2 parents 53a4de7 + 18b8434
@lorenzo lorenzo authored
View
6 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
View
7 lib/Cake/Console/Templates/skel/Controller/PagesController.php
@@ -30,13 +30,6 @@
class PagesController extends AppController {
/**
- * Default helper
- *
- * @var array
- */
- public $helpers = array('Html');
-
-/**
* This controller does not use a model
*
* @var array
View
2  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.
View
33 lib/Cake/Test/Case/View/HelperCollectionTest.php
@@ -68,6 +68,35 @@ public function testLoad() {
}
/**
+ * 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
*
* @return void
@@ -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');
View
14 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
*
View
45 lib/Cake/View/HelperCollection.php
@@ -44,6 +44,51 @@ public function __construct(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
* can set `$settings['enabled'] = false` to disable callbacks. This alias is provided so that when
View
10 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};
}
/**
Please sign in to comment.
Something went wrong with that request. Please try again.