/**
* Load components used by this component.
*
* @param array $loaded Components already loaded (indexed by component name)
* @param array $components Components to load
* @return array Components loaded
* @access protected
*/
function &_loadComponents(&$loaded, $components)
{
$components[] = 'Session';
foreach ($components as $component) {
$parts = preg_split('/\\/|\\./', $component);
if (count($parts) === 1) {
$plugin = $this->controller->plugin;
} else {
$plugin = Inflector::underscore($parts['0']);
$component = $parts[count($parts) - 1];
}
$componentCn = $component . 'Component';
if (in_array($component, array_keys($loaded)) !== true) {
if (!class_exists($componentCn)) {
if (is_null($plugin) || !loadPluginComponent($plugin, $component)) {
if (!loadComponent($component)) {
$this->cakeError('missingComponentFile', array(array('className' => $this->controller->name, 'component' => $component, 'file' => Inflector::underscore($component) . '.php', 'base' => $this->controller->base)));
exit;
}
}
if (!class_exists($componentCn)) {
$this->cakeError('missingComponentClass', array(array('className' => $this->controller->name, 'component' => $component, 'file' => Inflector::underscore($component) . '.php', 'base' => $this->controller->base)));
exit;
}
}
if ($componentCn == 'SessionComponent') {
$param = Router::stripPlugin($this->controller->base, $this->controller->plugin) . '/';
} else {
$param = null;
}
$this->controller->{$component} =& new $componentCn($param);
$loaded[$component] =& $this->controller->{$component};
if (isset($this->controller->{$component}->components) && is_array($this->controller->{$component}->components)) {
$loaded =& $this->_loadComponents($loaded, $this->controller->{$component}->components);
}
}
}
return $loaded;
}