/**
  * render template
  *
  * @param  bool $merge_tpl_vars   if true parent template variables merged in to local scope
  * @param  bool $no_output_filter if true do not run output filter
  * @param  bool $display          true: display, false: fetch null: subtemplate
  *
  * @throws Exception
  * @throws SmartyException
  * @return string rendered template output
  */
 public function render($merge_tpl_vars = false, $no_output_filter = true, $display = null)
 {
     $parentIsTpl = isset($this->parent) && $this->parent->_objType == 2;
     if ($this->smarty->debugging) {
         $this->smarty->_debug->start_template($this, $display);
     }
     // checks if template exists
     if (!$this->source->exists) {
         if ($parentIsTpl) {
             $parent_resource = " in '{$this->parent->template_resource}'";
         } else {
             $parent_resource = '';
         }
         throw new SmartyException("Unable to load template {$this->source->type} '{$this->source->name}'{$parent_resource}");
     }
     $save_tpl_vars = null;
     $save_config_vars = null;
     // merge all variable scopes into template
     if ($merge_tpl_vars) {
         // save local variables
         $save_tpl_vars = $this->tpl_vars;
         $save_config_vars = $this->config_vars;
         $ptr_array = array($this);
         $ptr = $this;
         while (isset($ptr->parent)) {
             $ptr_array[] = $ptr = $ptr->parent;
         }
         $ptr_array = array_reverse($ptr_array);
         $parent_ptr = reset($ptr_array);
         $tpl_vars = $parent_ptr->tpl_vars;
         $config_vars = $parent_ptr->config_vars;
         while ($parent_ptr = next($ptr_array)) {
             if (!empty($parent_ptr->tpl_vars)) {
                 $tpl_vars = array_merge($tpl_vars, $parent_ptr->tpl_vars);
             }
             if (!empty($parent_ptr->config_vars)) {
                 $config_vars = array_merge($config_vars, $parent_ptr->config_vars);
             }
         }
         if (!empty(Smarty::$global_tpl_vars)) {
             $tpl_vars = array_merge(Smarty::$global_tpl_vars, $tpl_vars);
         }
         $this->tpl_vars = $tpl_vars;
         $this->config_vars = $config_vars;
     }
     // check URL debugging control
     if (!$this->smarty->debugging && $this->smarty->debugging_ctrl == 'URL') {
         $this->smarty->_debug->debugUrl($this);
     }
     // disable caching for evaluated code
     if ($this->source->handler->recompiled) {
         $this->caching = false;
     }
     // read from cache or render
     $isCacheTpl = $this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED;
     if ($isCacheTpl) {
         if (!isset($this->cached)) {
             $this->loadCached();
         }
         $this->cached->render($this, $no_output_filter);
     } elseif ($this->source->handler->uncompiled) {
         $this->source->render($this);
     } else {
         if (!isset($this->compiled)) {
             $this->loadCompiled();
         }
         $this->compiled->render($this);
     }
     $content = null;
     if ((!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) && !$no_output_filter && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
         $content = Smarty_Internal_Filter_Handler::runFilter('output', ob_get_clean(), $this);
     }
     // display or fetch
     if ($display) {
         if ($this->caching && $this->smarty->cache_modified_check) {
             $this->cached->cacheModifiedCheck($this, isset($content) ? $content : ob_get_clean());
         } else {
             echo isset($content) ? $content : ob_get_clean();
         }
         if ($this->smarty->debugging) {
             $this->smarty->_debug->end_template($this);
         }
         // debug output
         if ($this->smarty->debugging) {
             $this->smarty->_debug->display_debug($this, true);
         }
         if ($merge_tpl_vars) {
             // restore local variables
             $this->tpl_vars = $save_tpl_vars;
             $this->config_vars = $save_config_vars;
         }
         return '';
     } else {
         if ($merge_tpl_vars) {
             // restore local variables
             $this->tpl_vars = $save_tpl_vars;
             $this->config_vars = $save_config_vars;
         }
         if ($this->smarty->debugging) {
             $this->smarty->_debug->end_template($this);
         }
         if ($this->smarty->debugging == 2 and $display === false) {
             if ($this->smarty->debugging) {
                 $this->smarty->_debug->display_debug($this, true);
             }
         }
         if ($parentIsTpl) {
             if (!empty($this->tpl_function)) {
                 $this->parent->tpl_function = array_merge($this->parent->tpl_function, $this->tpl_function);
             }
             foreach ($this->compiled->required_plugins as $code => $tmp1) {
                 foreach ($tmp1 as $name => $tmp) {
                     foreach ($tmp as $type => $data) {
                         $this->parent->compiled->required_plugins[$code][$name][$type] = $data;
                     }
                 }
             }
         }
         // return cache content
         return $content === null ? null : $content;
     }
 }
 /**
  * render template
  *
  * @param  bool      $no_output_filter if true do not run output filter
  * @param  null|bool $display          true: display, false: fetch null: sub-template
  *
  * @return string
  * @throws \SmartyException
  */
 public function render($no_output_filter = true, $display = null)
 {
     $parentIsTpl = isset($this->parent) && $this->parent->_objType == 2;
     if ($this->smarty->debugging) {
         $this->smarty->_debug->start_template($this, $display);
     }
     // checks if template exists
     if (!$this->source->exists) {
         if ($parentIsTpl) {
             $parent_resource = " in '{$this->parent->template_resource}'";
         } else {
             $parent_resource = '';
         }
         throw new SmartyException("Unable to load template {$this->source->type} '{$this->source->name}'{$parent_resource}");
     }
     // disable caching for evaluated code
     if ($this->source->handler->recompiled) {
         $this->caching = false;
     }
     // read from cache or render
     $isCacheTpl = $this->caching == Smarty::CACHING_LIFETIME_CURRENT || $this->caching == Smarty::CACHING_LIFETIME_SAVED;
     if ($isCacheTpl) {
         if (!isset($this->cached)) {
             $this->loadCached();
         }
         $this->cached->render($this, $no_output_filter);
     } elseif ($this->source->handler->uncompiled) {
         $this->source->render($this);
     } else {
         if (!isset($this->compiled)) {
             $this->loadCompiled();
         }
         $this->compiled->render($this);
     }
     // display or fetch
     if ($display) {
         if ($this->caching && $this->smarty->cache_modified_check) {
             $this->smarty->ext->_cacheModify->cacheModifiedCheck($this->cached, $this, isset($content) ? $content : ob_get_clean());
         } else {
             if ((!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) && !$no_output_filter && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
                 echo $this->smarty->ext->_filterHandler->runFilter('output', ob_get_clean(), $this);
             } else {
                 ob_end_flush();
                 flush();
             }
         }
         if ($this->smarty->debugging) {
             $this->smarty->_debug->end_template($this);
             // debug output
             $this->smarty->_debug->display_debug($this, true);
         }
         return '';
     } else {
         if ($this->smarty->debugging) {
             $this->smarty->_debug->end_template($this);
             if ($this->smarty->debugging === 2 && $display === false) {
                 $this->smarty->_debug->display_debug($this, true);
             }
         }
         if ($parentIsTpl) {
             if (!empty($this->tpl_function)) {
                 $this->parent->tpl_function = array_merge($this->parent->tpl_function, $this->tpl_function);
             }
             foreach ($this->compiled->required_plugins as $code => $tmp1) {
                 foreach ($tmp1 as $name => $tmp) {
                     foreach ($tmp as $type => $data) {
                         $this->parent->compiled->required_plugins[$code][$name][$type] = $data;
                     }
                 }
             }
         }
         if (!$no_output_filter && (!$this->caching || $this->cached->has_nocache_code || $this->source->handler->recompiled) && (isset($this->smarty->autoload_filters['output']) || isset($this->smarty->registered_filters['output']))) {
             return $this->smarty->ext->_filterHandler->runFilter('output', ob_get_clean(), $this);
         }
         // return cache content
         return null;
     }
 }