#0001
#0002
#0003
#0004
#0005
#0006
#0007
#0008
#0009
#0010
#0011
#0012
#0013
#0014
#0015
#0016
#0017
#0018
#0019
#0020
#0021
#0022
#0023
#0024
#0025
#0026
#0027
#0028
#0029
#0030
#0031
#0032
#0033
#0034
#0035
#0036
#0037
#0038
#0039
#0040
#0041
#0042
#0043
#0044
#0045
#0046
#0047
#0048
#0049
#0050
#0051
#0052
#0053
#0054
#0055
#0056
#0057
#0058
#0059
#0060
#0061
#0062
#0063
#0064
#0065
#0066
#0067
#0068
#0069
#0070
#0071
#0072
#0073
#0074
#0075
#0076
#0077
#0078
#0079
#0080
#0081
#0082
#0083
#0084
#0085
#0086
#0087
#0088
#0089
#0090
#0091
#0092
#0093
#0094
#0095
#0096
#0097
#0098
#0099
#0100
#0101
#0102
#0103
#0104
#0105
#0106
#0107
#0108
#0109
#0110
#0111
#0112
#0113
#0114
#0115
#0116
#0117
#0118
#0119
#0120
#0121
#0122
#0123
#0124
#0125
#0126
#0127
#0128
#0129
#0130
#0131
#0132
#0133
#0134
#0135
#0136
#0137
#0138
#0139
#0140
#0141
#0142
#0143
#0144
#0145
#0146
#0147
#0148
#0149
#0150
#0151
#0152
#0153
#0154
#0155
#0156
#0157
#0158
#0159
#0160
#0161
#0162
#0163
#0164
#0165
#0166
#0167
#0168
#0169
#0170
#0171
#0172
#0173
#0174
#0175
#0176
#0177
#0178
#0179
#0180
#0181
#0182
#0183
#0184
#0185
#0186
#0187
#0188
#0189
#0190
#0191
#0192
#0193
#0194
#0195
#0196
#0197
#0198
#0199
#0200
#0201
#0202
#0203
#0204
#0205
#0206
#0207
#0208
#0209
#0210
#0211
#0212
#0213
#0214
#0215
#0216
#0217
#0218
#0219
#0220
#0221
#0222
#0223
#0224
#0225
#0226
#0227
#0228
#0229
#0230
#0231
#0232
#0233
#0234
#0235
#0236
#0237
#0238
#0239
#0240
#0241
#0242
#0243
#0244
#0245
#0246
#0247
#0248
#0249
#0250
#0251
#0252
#0253
#0254
#0255
#0256
#0257
#0258
#0259
#0260
#0261
#0262
#0263
#0264
#0265
#0266
#0267
#0268
#0269
#0270
#0271
#0272
#0273
#0274
#0275
#0276
#0277
#0278
#0279
#0280
#0281
#0282
#0283
#0284
#0285
#0286
#0287
#0288
#0289
#0290
#0291
#0292
#0293
#0294
#0295
#0296
#0297
#0298
#0299
#0300
#0301
#0302
#0303
#0304
#0305
#0306
#0307
#0308
#0309
#0310
#0311
#0312
#0313
#0314
#0315
#0316
#0317
#0318
#0319
#0320
#0321
#0322
#0323
#0324
#0325
#0326
#0327
#0328
#0329
#0330
#0331
#0332
#0333
#0334
#0335
#0336
#0337
#0338
#0339
#0340
#0341
#0342
#0343
#0344
#0345
#0346
#0347
#0348
#0349
#0350
#0351
#0352
#0353
#0354
#0355
#0356
#0357
#0358
#0359
#0360
#0361
#0362
#0363
#0364
#0365
#0366
#0367
#0368
#0369
#0370
#0371
#0372
|
<?php /** * Class to handle all intreaction between models, views, and controllers * * @todo filiters */ class controller {
/** * Controller name * * @author Nesbert Hidalgo * @access protected * @var string */ protected $_controller; /** * Action name * * @author Nesbert Hidalgo * @access protected * @var string */ protected $_action; /** * Page to be outputted * * @author Nesbert Hidalgo * @access public * @var string */ public $render; /** * Layout name * * @author Nesbert Hidalgo * @access public * @var string */ public $layout; /** * Array of all server-side requests * * @author Nesbert Hidalgo * @access public * @var array */ public $params; /** * Set the controller's events and layout * * @author Nesbert Hidalgo * @access public */ public function _set_events($events) { $this->_controller = $events['controller']; $this->_action = $events['action']; if (!$this->render) $this->render = $events['action']; if (!$this->layout) $this->layout = $_ENV['routes']['default']['layout']; $this->_nested_controller_path = $events['nested_controller_path']; }
/** * Set the controller's params * * @author Nesbert Hidalgo * @access public */ public function _set_params($params) { $this->params = $params; }
/** * Executes the controller's action. * * @author John Faircloth, Nesbert Hidalgo * @access public */ public function _execute_action() { try { if ( method_exists($this, $this->_action) ) { // call before filter $this->before_filter(); // controller execute action $action = $this->_action; $this->$action(); // call before filter $this->after_filter(); } else { throw new Exception("Action '{$this->_action}' not found in <strong>{$this->_controller}_controller</strong>"); } } catch ( Exception $e ) { // add to errors $_ENV['error']->add($e->getMessage(), $e); } } /** * Output contents to user * * @author Nesbert Hidalgo * @access public * @param bool $return_as_str * @return mixed */ public function _output($return_as_str) { // set options for view $options['controller'] = $this->_controller; $options['action'] = $this->_action; $options['layout'] = $this->layout; $options['render'] = $this->render; $options['text'] = $this->render_text; return $this->render($options); } /** * Get the path of the view file * * @author Nesbert Hidalgo * @access private * @param string $view * @param string $controller * @return string */ private function _get_view_path($view = null, $controller = null) { // nested controllers check [NH] might need to find a better way to do this if ( $this->_nested_controller_path ) { $view_path = VIEWS_PATH.$this->_nested_controller_path.( $controller ? $controller : $this->_controller ).DS.$view.'.php'; if ( file_exists($view_path) ) { return $view_path; } else { return VIEWS_PATH.( $controller ? $controller : $this->_controller ).DS.$view.'.php'; } } else { return VIEWS_PATH.( $controller ? $controller : $this->_controller ).DS.$view.'.php'; } } /** * Get the path of the layout file * * @author Nesbert Hidalgo * @access private * @param string $layout * @return string */ private function _get_layout_path($layout = null) { return VIEWS_PATH.'layouts'.DS.( $layout ? $layout : $this->layout ).'.php'; }
/** * Render views with options * * @author Nesbert Hidalgo * @access public * @param array $options */ public function render($options) { // check options if ( !is_array($options) ) return false; // set and unset reserved $options if ( $options['partial'] ) { $view = '_'.$options['partial']; unset($options['partial']); } if ( isset($options['action']) ) { $view = $options['action']; unset($options['action']); } if ( isset($options['render']) ) { $view = $options['render']; unset($options['render']); } if ( $options['controller'] ) { $controller = $options['controller']; unset($options['controller']); } if ( isset($options['layout']) ) { $layout = $options['layout']; unset($options['layout']); } if ( $options['to_str'] ) { $return_as_str = true; unset($options['to_str']); } // set view path $view_path = $this->_get_view_path($view, $controller); switch ( true ) { // if view equaqls false render nothing case ( $view === false ): return; break;
// if layout get page content with layout case ( $layout ): if ( $return_as_str ) { return view::_get_view($view_path, $this->_get_layout_path($layout), $options); } else { return view::_show_view($view_path, $this->_get_layout_path($layout), $options); } break; // if same layout include files and set variables case ( file_exists($view_path) ): // create a variable foreach other option, using its key as the variable name if ( count($options) ) foreach ( $options as $key => $values ) $$key = $values; // include partial include ( $view_path ); return; break; default: //print_obj($options, 1); $_ENV['error']->add("Unable to render 'view'. File not found <strong>{$view_path}</strong>."); break; } } /** * Render views with options to a string * * @author Nesbert Hidalgo * @access public * @param array $options */ public function render_to_str($options) { $options['to_str'] = true; return $this->render($options); }
/** * Include a view into the current page * * @author Nesbert Hidalgo * @access public * @param mixed $options action to render or an array of render $options * @param array $locals optional * @param string $controller optional controller name */ public function build_partial($partial, $locals = null, $controller = null) { if ( is_array($partial) ) { $options = $partial; } else { $options['render'] = $partial; } if ( $locals ) $options['locals'] = $locals; if ( $controller ) $options['controller'] = $controller; $this->render($options); } /** * Alias to build_partial and adds an underscore to the view * * @author Nesbert Hidalgo * @access public * @param mixed $options partial to render or an array of render $options * @param array $locals optional * @param string $controller optional controller name */ public function render_partial($partial, $locals = null, $controller = null) { if ( is_array($partial) ) { $options = $partial; } else { $options['partial'] = $partial; } if ( $locals ) $options['locals'] = $locals; if ( $controller ) $options['controller'] = $controller; $this->render($options); } /** * Allows the ability build a controller within a controller * * @author John Faircloth, Nesber Hidalgo * @access public * @param string $controller * @param string $action optional * @param string $id optional * @param string $extras optional * @param bool $to_str optional return controller as string * @return object controller object */ public function build_controller($controller, $action = '', $id = '', $extras = array(), $to_str = false) { $events = array('controller'=>$controller, 'action'=>$action); $params = array(); if ( $id ) $params['id'] = $id; return creovel::run($events, array_merge($params, $extras), $to_str); } /** * Alias to build_controller return controller as a string * * @author Nesber Hidalgo * @access public * @param string $controller * @param string $action optional * @param string $id optional * @param string $extras optional * @return string controller object */ public function build_controller_to_str($controller, $action = '', $id = '', $extras = array()) { return $this->build_controller($controller, $action, $id, $extras, true); } /** * Magic functions * * @author Nesbert Hidalgo * @access public */ public function __call($method, $arguments) { try { throw new Exception("Call to undefined method '{$method}' not found in <strong>".get_class($this)."</strong>."); } catch ( Exception $e ) { // add to errors $_ENV['error']->add($e->getMessage(), $e); } } /** * Callback functions * * @author Nesbert Hidalgo * @access public */ public function before_filter() {} public function after_filter() {} } ?>
|