*
The user interface will generally be created with either PHP pages,
* which will not themselves contain any business logic. These pages represent
* the "view" component of an MVC architecture.
* Forms and hyperlinks in the user interface that require business logic
* to be executed will be submitted to a request URI that is mapped to the
* ActionController. The ActionController receives and processes all requests
* that change the state of a user's interaction with the application. This
* component represents the "controller" component of an MVC architecture.
* The ActionController will select and invoke an Action class to perform
* the requested business logic.
* The Action classes will manipulate the state of the application's
* interaction with the user, typically by creating or modifying classes that
* are stored as session attributes. Such classes represent the "model"
* component of an MVC architecture.
* Instead of producing the next page of the user interface directly,
* Action classes will forward control to an appropriate PHP page to produce
* the next page of the user interface.
*
* The standard version of ActionController implements the following logic for
* each incoming HTTP request. You can override some or all of this
* functionality by subclassing this class and implementing your own version of
* the processing.
*
* - Identify, from the incoming request URI, the substring that will be used
* to select an Action procedure.
* - Use this substring to map to the class name of the corresponding Action
* class (a subclass of the Action class).
* - If this is the first request for a particular Action class, instantiate
* an instance of that class and cache it for future use.
* - Optionally populate the properties of an ActionForm class associated
* with this ActionMapping and cache it for future use.
* - Call the perform() method of this Action class. Passing in the mapping
* and the request that were passed to the ActionController by the bootstrap.
*
*
*
* The standard version of ActionController is configured based on the
* following initialization parameters, which you will specify in the options
* for your application. Subclasses that specialize this ActionController are
* free to define additional initialization parameters.
*
* - options - This sets the ActionController options.
*
*
* @author Arnold Cano
* @version $Id: ActionController.php,v 1.15 2006-05-31 12:40:16 afelixf Exp $
*/
class ActionController extends Object
{
/**
* @var array
*/
var $_options;
/**
* @var HashMap
*/
var $_actionMappings;
/**
* @var HashMap
*/
var $_actionForms;
/**
* @var HashMap
*/
var $_actions;
/**
* Create a ActionController specifying the options.
*
* @access public
* @param array $options
*/
function ActionController($options)
{
if (!is_array($options)) {
trigger_error('Invalid options file');
return;
}
$this->_options = $options;
//initialize cache
$this->_actionMappings = new HashMap();
$this->_actionForms = new HashMap();
$this->_actions = new HashMap();
}
/**
* Process the request.
*
* @access public
* @param array $mappings
* @param array $request
*/
function process($mappings, $request)
{
if (!is_array($mappings)) {
trigger_error('Invalid mappings file');
return;
}
if (!is_array($request)) {
trigger_error('Invalid request');
return;
}
//En explotación ponemos el modo error, en desarrollo no.
if(ConfIgep::es_desarrollo()===false)
error_reporting($this->_options[_ERROR_REPORTING]);
$actionMapping = $this->_processMapping($mappings, $request);
$actionForm = $this->_processForm($mappings, $request);
$actionForward = $this->_processAction($actionMapping, $actionForm);
if (is_object($actionForward)) {
$this->_processForward($actionForward);
}
}
/**
* Identify and return an appropriate ActionMapping.
*
* @access private
* @param array $mappings
* @param array $request
* @return ActionMapping
*/
function _processMapping($mappings, $request)
{
$name = $request[_ACTION];
$mapping = $mappings[_ACTION_MAPPINGS][$name];
$actionMapping = $this->_actionMappings->get($name);
if (!is_object($actionMapping)) {
$actionMapping = new ActionMapping($name, $mapping);
if ($this->_options[_CACHE]) {
$this->_actionMappings->put($name, $actionMapping);
}
}
return $actionMapping;
}
/**
* Identify and optionally return an appropriate populated ActionForm.
*
* @access private
* @param array $mappings
* @param array $request
* @return ActionForm
*/
function _processForm($mappings, $request)
{
$name = $request[_ACTION];
$mapping = $mappings[_ACTION_MAPPINGS][$name];
//verify that a form has been mapped
if (isset($mapping[_NAME])) {
$form = $mappings[_ACTION_FORMS][$mapping[_NAME]];
$type = $form[_TYPE];
$actionForm = $this->_actionForms->get($name);
if (!is_object($actionForm)) {
if (!class_exists($type)) {
trigger_error("Se ha intentado ejecutar la acción '$name' de la clase '$type' y esta no está programada. Compruebe el fichero mappings.php de su aplicación.");
return;
}
$actionForm = new $type();
if ($this->_options[_CACHE]) {
$this->_actionForms->put($name, $actionForm);
}
}
//reset all properties to their default state
$actionForm->reset();
//populate the properties from the request
$actionForm->putAll($request);
}
return $actionForm;
}
/**
* Call the validate() method of the specified ActionForm.
*
* @access private
* @param ActionMapping $actionMapping
* @param ActionForm $actionForm
* @return boolean
*/
function _processValidate($actionMapping, $actionForm)
{
$isValid = TRUE;
set_error_handler($this->_options[_ERROR_HANDLER]);
if (!$actionForm->validate()) {
$input = $actionMapping->getInput();
//forward errors back to view
header("Location: $input&".SID);
$isValid = FALSE;
}
restore_error_handler();
return $isValid;
}
/**
* Ask the specified Action instance to handle this request.
*
* @access private
* @param ActionMapping $actionMapping
* @param ActionForm $actionForm
* @return ActionForward
*/
function _processAction($actionMapping, $actionForm)
{
$name = $actionMapping->getName();
$type = $actionMapping->getType();
$action = $this->_actions->get($name);
if (!is_object($action)) {
if (!class_exists($type)) {
if($type=='')
trigger_error("Se ha intentado ejecutar la acción '$name' y no está programada para la clase actual. Compruebe el fichero de la clase y el mappings.php de su aplicación.");
else
trigger_error("Se ha producido un error intentado ejecutar la acción '$name' de la clase '$type'. Compruebe el nombre de la clase y su accesibilidad (fichero include.php).");
return;
}
//Guardamos la referencia del modulo si es la primera pantalla del modulo a la que accedemos.
if(isset($_REQUEST['moduloActivo'])){
IgepSession::guardaVariable('global','moduloActivo',$_REQUEST['moduloActivo']);
//Borramos el contenido de los paneles anteriores
IgepSession::_borrarPanelesVisitados();
}
//Si el panel ya existe lo recuperamos de la Session
if(IgepSession::existePanel($type)&&($type!='IgepNegocio')){
$action = IgepSession::damePanel($type);
$action->regenerarInstancia('');
}
else{
IgepDebug::setDebug(DEBUG_IGEP,'Creamos una instancia de la clase '.$type);
$action = new $type();
}
if ($this->_options[_CACHE]) {
$this->_actions->put($name, $action);
}
}
if(ConfIgep::es_desarrollo()===false)
set_error_handler($this->_options[_ERROR_HANDLER]);
$actionForward = $action->perform($actionMapping, $actionForm);
if(ConfIgep::es_desarrollo()===false)
restore_error_handler();
return $actionForward;
}
/**
* Forward to the specified destination.
*
* @access private
* @param ActionForward $actionForward
*/
function _processForward($actionForward)
{
$salto ='';
switch($actionForward->getName()){
case 'IgepErrorValidacion':
$path='';
$claseManejadora = $actionForward->get('IGEPclaseManejadora');
$salto = "Location: index.php?view=igep/views/igep_regenerarVentana.php&IGEPpath=$path&IGEPclaseManejadora=$claseManejadora";
break;
case 'IgepOperacionOculto':
$path = $actionForward->getPath();
$salto = "Location: $path";
break;
case 'IgepSaltoVentana':
$path = $actionForward->get('IGEPaccionDestinoSalto');
$salto = "Location: $path";
break;
default:
$path = $actionForward->getPath();
$salto ="Location: index.php?view=igep/views/igep_regenerarVentana.php&IGEPpath=$path&IGEPclaseManejadora=$claseManejadora";
}
header($salto);
}
}
?>