Subversion-Projekte lars-tiefland.cakephp

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

<?php
/* SVN FILE: $Id: component.php 7945 2008-12-19 02:16:01Z gwoo $ */
/**
 *
 * PHP versions 4 and 5
 *
 * CakePHP(tm) :  Rapid Development Framework (http://www.cakephp.org)
 * Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org)
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @filesource
 * @copyright     Copyright 2005-2008, Cake Software Foundation, Inc. (http://www.cakefoundation.org)
 * @link          http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
 * @package       cake
 * @subpackage    cake.cake.libs.controller
 * @since         CakePHP(tm) v TBD
 * @version       $Revision: 7945 $
 * @modifiedby    $LastChangedBy: gwoo $
 * @lastmodified  $Date: 2008-12-18 18:16:01 -0800 (Thu, 18 Dec 2008) $
 * @license       http://www.opensource.org/licenses/mit-license.php The MIT License
 */
/**
 * Handler for Controller::$components
 *
 * @package       cake
 * @subpackage    cake.cake.libs.controller
 * @link          http://book.cakephp.org/view/62/Components
 */
class Component extends Object {
/**
 * Contains various controller variable information (plugin, name, base).
 *
 * @var object
 * @access private
 */
        var $__controllerVars = array('plugin' => null, 'name' => null, 'base' => null);
/**
 * List of loaded components.
 *
 * @var object
 * @access protected
 */
        var $_loaded = array();
/**
 * List of components attached directly to the controller, which callbacks
 * should be executed on.
 *
 * @var object
 * @access protected
 */
        var $_primary = array();
/**
 * Settings for loaded components.
 *
 * @var array
 * @access private
 **/
        var $__settings = array();
/**
 * Used to initialize the components for current controller.
 *
 * @param object $controller Controller with components to load
 * @return void
 * @access public
 */
        function init(&$controller) {
                if (!is_array($controller->components)) {
                        return;
                }
                $this->__controllerVars = array(
                        'plugin' => $controller->plugin, 'name' => $controller->name,
                        'base' => $controller->base
                );

                if (!in_array('Session', $controller->components)) {
                        array_unshift($controller->components, 'Session');
                }
                $this->_loadComponents($controller);
        }
/**
 * Called before the Controller::beforeFilter().
 *
 * @param object $controller Controller with components to initialize
 * @return void
 * @access public
 * @link http://book.cakephp.org/view/65/MVC-Class-Access-Within-Components
 */
        function initialize(&$controller) {
                foreach (array_keys($this->_loaded) as $name) {
                        $component =& $this->_loaded[$name];

                        if (method_exists($component,'initialize') && $component->enabled === true) {
                                $settings = array();
                                if (isset($this->__settings[$name])) {
                                        $settings = $this->__settings[$name];
                                }
                                $component->initialize($controller, $settings);
                        }
                }
        }
/**
 * Called after the Controller::beforeFilter() and before the controller action
 *
 * @param object $controller Controller with components to startup
 * @return void
 * @access public
 * @link http://book.cakephp.org/view/65/MVC-Class-Access-Within-Components
 */
        function startup(&$controller) {
                foreach ($this->_primary as $name) {
                        $component =& $this->_loaded[$name];
                        if ($component->enabled === true && method_exists($component, 'startup')) {
                                $component->startup($controller);
                        }
                }
        }
/**
 * Called after the Controller::beforeRender(), after the view class is loaded, and before the
 * Controller::render()
 *
 * @param object $controller Controller with components to beforeRender
 * @return void
 * @access public
 */
        function beforeRender(&$controller) {
                foreach ($this->_primary as $name) {
                        $component =& $this->_loaded[$name];
                        if ($component->enabled === true && method_exists($component,'beforeRender')) {
                                $component->beforeRender($controller);
                        }
                }
        }
/**
 * Called before Controller::redirect().
 *
 * @param object $controller Controller with components to beforeRedirect
 * @return void
 * @access public
 */
        function beforeRedirect(&$controller, $url, $status = null, $exit = true) {
                $response = array();

                foreach ($this->_primary as $name) {
                        $component =& $this->_loaded[$name];

                        if ($component->enabled === true && method_exists($component, 'beforeRedirect')) {
                                $resp = $component->beforeRedirect($controller, $url, $status, $exit);
                                if ($resp === false) {
                                        return false;
                                }
                                $response[] = $resp;
                        }
                }
                return $response;
        }
/**
 * Called after Controller::render() and before the output is printed to the browser.
 *
 * @param object $controller Controller with components to shutdown
 * @return void
 * @access public
 */
        function shutdown(&$controller) {
                foreach ($this->_primary as $name) {
                        $component =& $this->_loaded[$name];
                        if (method_exists($component,'shutdown') && $component->enabled === true) {
                                $component->shutdown($controller);
                        }
                }
        }
/**
 * Loads components used by this component.
 *
 * @param object $object Object with a Components array
 * @param object $parent the parent of the current object
 * @return void
 * @access protected
 */
        function _loadComponents(&$object, $parent = null) {
                $components = $object->components;
                $base = $this->__controllerVars['base'];

                if (is_array($object->components)) {
                        $normal = Set::normalize($object->components);
                        foreach ($normal as $component => $config) {
                                $plugin = null;

                                if (isset($this->__controllerVars['plugin'])) {
                                        $plugin = $this->__controllerVars['plugin'] . '.';
                                }

                                if (strpos($component, '.') !== false) {
                                        list($plugin, $component) = explode('.', $component);
                                        $plugin = $plugin . '.';
                                }
                                $componentCn = $component . 'Component';

                                if (!class_exists($componentCn)) {
                                        if (is_null($plugin) || !App::import('Component', $plugin . $component)) {
                                                if (!App::import('Component', $component)) {
                                                        $this->cakeError('missingComponentFile', array(array(
                                                                'className' => $this->__controllerVars['name'],
                                                                'component' => $component,
                                                                'file' => Inflector::underscore($component) . '.php',
                                                                'base' => $base,
                                                                'code' => 500
                                                        )));
                                                        return false;
                                                }
                                        }

                                        if (!class_exists($componentCn)) {
                                                $this->cakeError('missingComponentClass', array(array(
                                                        'className' => $this->__controllerVars['name'],
                                                        'component' => $component,
                                                        'file' => Inflector::underscore($component) . '.php',
                                                        'base' => $base,
                                                        'code' => 500
                                                )));
                                                return false;
                                        }
                                }

                                if ($parent === null) {
                                        $this->_primary[] = $component;
                                }

                                if (isset($this->_loaded[$component])) {
                                        $object->{$component} =& $this->_loaded[$component];

                                        if (!empty($config) && isset($this->__settings[$component])) {
                                                $this->__settings[$component] = array_merge($this->__settings[$component], $config);
                                        } elseif (!empty($config)) {
                                                $this->__settings[$component] = $config;
                                        }
                                } else {
                                        if ($componentCn === 'SessionComponent') {
                                                $object->{$component} =& new $componentCn($base);
                                        } else {
                                                $object->{$component} =& new $componentCn();
                                        }
                                        $object->{$component}->enabled = true;
                                        $this->_loaded[$component] =& $object->{$component};
                                        if (!empty($config)) {
                                                $this->__settings[$component] = $config;
                                        }
                                }

                                if (isset($object->{$component}->components) && is_array($object->{$component}->components) && (!isset($object->{$component}->{$parent}))) {
                                        $this->_loadComponents($object->{$component}, $component);
                                }
                        }
                }
        }
}

?>