src/View.php
cdfe8eaf
 <?php
 
 namespace elanpl\L3;
 
 class View{
     protected $viewFileExtension;
     protected $viewFile;
     protected $context;
     public $_L3; //The L3 instance
 
     public function __construct(){
         $numargs = func_num_args();
      
         if ($numargs == 0) {
             $view = "";
             $context = array();
         }
         else if ($numargs == 1) {
             $arg = func_get_arg(0);
             if(is_object($arg) && $arg instanceof ViewModel){
                 if(method_exists($arg, 'getContext')){
                     $context = $arg->getContext();
                 }
                 else{
                     $context = array();
                     $context['vm'] = $arg;
                 }
 
                 if(method_exists($arg, 'getView')){
                     $view = $arg->getView();
                 }
                 else{
                     $view = $arg;
                 }
 
                 if(isset($arg->_L3)){
                     $this->_L3 = $arg->_L3;
                 }
             }
             else{
                 $view = "";
                 $context = $arg;
             }
         }
         else {
             $arg = func_get_arg(0);
             if($arg instanceof Application){
                 $this->_L3 = $arg;
                 $view = func_get_arg(1);
                 $context = func_get_arg(2);
             }
             else{
                 $view = func_get_arg(0);
                 $context = func_get_arg(1);
             }
         }
 
         if(!isset($this->_L3)){
             // if an Application object was not injected, take it form the global context...
             global $_L3;
             $this->_L3 = $_L3;
         }
         
 
         if($this->viewFile = $this->find($view)){
1b8a151b
             if(!isset($this->viewFileExtension))
                 $this->viewFileExtension = ".".pathinfo($this->viewFile, PATHINFO_EXTENSION);
cdfe8eaf
         }
         else{
ca10b57b
             if(is_object($view)){
                 $string_view = 'matched for class: '.get_class($view);
             }
             else{
                 $string_view = $view;
             }
             throw new \Exception("View file:\"$string_view\" not found!");
cdfe8eaf
         }
         $this->context = $context;
     }
 
     public function render(){
1b8a151b
         if ($viewEngine = $this->_L3->viewEngines->get($this->viewFileExtension)){
 
             $viewEngineClass = $viewEngine->class;
             if(isset($viewEngine->config)){
bd88f5e2
                 $view = new $viewEngineClass($this->_L3, $viewEngine->config);
1b8a151b
             }
             else{
                 $refl = new \ReflectionClass($viewEngineClass);
                 if($refl->inNamespace()&&class_exists($refl->getNamespaceName().'\\Config')){
bd88f5e2
                     $view = new $viewEngineClass($this->_L3, $refl->getNamespaceName().'\\Config');
1b8a151b
                 }
                 else{
bd88f5e2
                     $view = new $viewEngineClass($this->_L3);
1b8a151b
                 }
             }    
cdfe8eaf
             return $view->render($this->viewFile, $this->context);
         }
         else{
             throw new \Exception("View Engine not found for the view file extension:\"".$this->viewFileExtension."\"!");
         }
     }
 
     public function find($view){
         //find the view file
         if(is_string($view) && is_file($view)){
             // full path was provided...
             return $view;
         }
         else{
             // search for the view file
             
             //search for controller, action and module if present  
             if(is_object($view) && $view instanceof ViewModel){
                 $controller = $view->getController();
                 $module = $view->getModule();
                 $action = $view->getAction();
                 $view = "";
             }
             else{                    
                 
                 $match = $this->_L3->findControllerInCallStack();
 
                 $controller = $match['controller'];
                 $module = $match['module'];
                 $action = $match['action'];     
             }
             //locate the view file
             
             // The search order:
             // check [module/]views/controller/action/ directory (file)
             // check [module/]views/controller/ directory (file)
             // check [module/]views/
 
             $viewsPath = $this->_L3->baseDirectory.$this->_L3->applicationDirectory.DIRECTORY_SEPARATOR
                 .($module!=""?$module.DIRECTORY_SEPARATOR:"").$this->_L3->viewsDirectory.DIRECTORY_SEPARATOR;
 
             $dirs = array();
 
             $dirs[] = $viewsPath.$controller.DIRECTORY_SEPARATOR.$action;
             $dirs[] = $viewsPath.$controller.DIRECTORY_SEPARATOR;
             $dirs[] = $viewsPath;
 
             foreach($dirs as $dir){
                 // check if the file exists
17fc0be6
                 if(is_file($found = str_replace('\\', DIRECTORY_SEPARATOR, $dir.($action!=""&&$view!=""?DIRECTORY_SEPARATOR:"").$view))){
cdfe8eaf
                     return $found;
                 }
                 // try to add extension and check again
                 else foreach($this->_L3->viewEngines->getRegisteredFileExtensions() as $registeredExtension){
17fc0be6
                     if(is_file($found = str_replace('\\', DIRECTORY_SEPARATOR, $dir.($action!=""&&$view!=""?DIRECTORY_SEPARATOR:"").$view.$registeredExtension))){
1b8a151b
                         $this->viewFileExtension = $registeredExtension;
cdfe8eaf
                         return $found;
                     }
                 }
             }
             
 
         }
         return null;
     }
 }