Load helpers at View construction.

Loading helpers earlier in View's lifecycle allows for the removal of
many duplicated code segments and a now useless property. It slightly
modifies how View behaves in a test case, but that issue is easily
remedied by calling loadHelpers() a second time.

This primarily fixes issues where helpers may not be loaded in View
subclasses if they override any of View's methods. This is particularly
problematic when aliased helpers are involved.

Refs #4030
This commit is contained in:
mark_story 2013-08-26 22:43:28 -04:00
parent e7672b99c0
commit b8320fdbb7
4 changed files with 5 additions and 20 deletions

View file

@ -334,6 +334,8 @@ object(View) {
response => object(CakeResponse) {}
elementCache => 'default'
elementCacheSettings => array()
Html => object(HtmlHelper) {}
Form => object(FormHelper) {}
int => (int) 2
float => (float) 1.333
@ -358,7 +360,6 @@ TEXT;
)
[protected] _scripts => array()
[protected] _paths => array()
[protected] _helpersLoaded => false
[protected] _parents => array()
[protected] _current => null
[protected] _currentType => ''

View file

@ -975,7 +975,7 @@ class HelperTest extends CakeTestCase {
$Helper->OtherHelper;
$result = $this->View->Helpers->enabled();
$expected = array();
$expected = array('Html');
$this->assertEquals($expected, $result, 'Helper helpers were attached to the collection.');
}

View file

@ -146,8 +146,8 @@ class JsonViewTest extends CakeTestCase {
)
);
$Controller->set('user', $data);
$Controller->helpers = array('Paginator');
$View = new JsonView($Controller);
$View->helpers = array('Paginator');
$output = $View->render('index');
$expected = array('user' => 'fake', 'list' => array('item1', 'item2'), 'paging' => array('page' => 2));

View file

@ -253,13 +253,6 @@ class View extends Object {
*/
protected $_paths = array();
/**
* Indicate that helpers have been loaded.
*
* @var boolean
*/
protected $_helpersLoaded = false;
/**
* The names of views and their parents used with View::extend();
*
@ -347,6 +340,7 @@ class View extends Object {
}
$this->Helpers = new HelperCollection($this);
$this->Blocks = new ViewBlock();
$this->loadHelpers();
parent::__construct();
}
@ -460,9 +454,6 @@ class View extends Object {
if ($this->hasRendered) {
return true;
}
if (!$this->_helpersLoaded) {
$this->loadHelpers();
}
$this->Blocks->set('content', '');
if ($view !== false && $viewFileName = $this->_getViewFileName($view)) {
@ -511,9 +502,6 @@ class View extends Object {
return $this->Blocks->get('content');
}
if (!$this->_helpersLoaded) {
$this->loadHelpers();
}
if (empty($content)) {
$content = $this->Blocks->get('content');
}
@ -881,7 +869,6 @@ class View extends Object {
list(, $class) = pluginSplit($properties['class']);
$this->{$class} = $this->Helpers->load($properties['class'], $properties['settings']);
}
$this->_helpersLoaded = true;
}
/**
@ -1194,9 +1181,6 @@ class View extends Object {
* @return string
*/
protected function _renderElement($file, $data, $options) {
if (!$this->_helpersLoaded) {
$this->loadHelpers();
}
if ($options['callbacks']) {
$this->getEventManager()->dispatch(new CakeEvent('View.beforeRender', $this, array($file)));
}