Changeset 3998


Ignore:
Timestamp:
10/09/09 03:00:33 (10 years ago)
Author:
patdenice
Message:

merge r3927, r3928, r3951, r3953 from trunk to branch 2.0
r3927: Add Smarty's prefilter capability. see topic:16219 (FR).
r3928: Improve template prefilter functions
r3951: Allow to add prefilters, postfilters and output filters to templates.
r3953: Simplification of commit 3951.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.0/include/template.class.php

    r3208 r3998  
    4747  var $extents = array(); 
    4848 
     49  // Templates prefilter from external sources (plugins) 
     50  var $external_filters = array(); 
     51   
    4952  // used by html_head smarty block to add content before </head> 
    5053  var $html_head_elements = array(); 
     
    291294      ((is_adviser()) ? 'disabled="disabled" onclick="return false;"' : '')); 
    292295 
     296    $save_compile_id = $this->smarty->compile_id; 
     297    $this->load_external_filters($handle); 
     298 
    293299    global $conf, $lang_info; 
    294300    if ( $conf['compiled_template_cache_language'] and isset($lang_info['code']) ) 
    295301    { 
    296       $save_compile_id = $this->smarty->compile_id; 
    297302      $this->smarty->compile_id .= '.'.$lang_info['code']; 
    298303    } 
     
    300305    $v = $this->smarty->fetch($this->files[$handle], null, null, false); 
    301306 
    302     if (isset ($save_compile_id) ) 
    303     { 
    304       $this->smarty->compile_id = $save_compile_id; 
    305     } 
     307    $this->smarty->compile_id = $save_compile_id; 
     308    $this->unload_external_filters($handle); 
    306309 
    307310    if ($return) 
     
    334337      $this->html_head_elements = array(); 
    335338    } 
     339 
    336340    echo $this->output; 
    337341    $this->output=''; 
     
    420424  } 
    421425 
     426 /** 
     427   * This function allows to declare a Smarty prefilter from a plugin, thus allowing 
     428   * it to modify template source before compilation and without changing core files 
     429   * They will be processed by weight ascending. 
     430   * http://www.smarty.net/manual/en/advanced.features.prefilters.php 
     431   */ 
     432  function set_prefilter($handle, $callback, $weight=50) 
     433  { 
     434    $this->external_filters[$handle][$weight][] = array('prefilter', $callback); 
     435    ksort($this->external_filters[$handle]); 
     436  } 
     437 
     438  function set_postfilter($handle, $callback, $weight=50) 
     439  { 
     440    $this->external_filters[$handle][$weight][] = array('postfilter', $callback); 
     441    ksort($this->external_filters[$handle]); 
     442  } 
     443 
     444  function set_outputfilter($handle, $callback, $weight=50) 
     445  { 
     446    $this->external_filters[$handle][$weight][] = array('outputfilter', $callback); 
     447    ksort($this->external_filters[$handle]); 
     448  } 
     449   
     450 /** 
     451   * This function actually triggers the filters on the tpl files. 
     452   * Called in the parse method. 
     453   * http://www.smarty.net/manual/en/advanced.features.prefilters.php 
     454   */ 
     455  function load_external_filters($handle) 
     456  { 
     457    if (isset($this->external_filters[$handle])) 
     458    { 
     459      $compile_id = ''; 
     460      foreach ($this->external_filters[$handle] as $filters)  
     461      { 
     462        foreach ($filters as $filter)  
     463        { 
     464          list($type, $callback) = $filter; 
     465          $compile_id .= $type.( is_array($callback) ? implode('', $callback) : $callback ); 
     466          call_user_func(array($this->smarty, 'register_'.$type), $callback); 
     467        } 
     468      } 
     469      $this->smarty->compile_id .= '.'.base_convert(crc32($compile_id), 10, 36); 
     470    } 
     471  } 
     472 
     473  function unload_external_filters($handle) 
     474  { 
     475    if (isset($this->external_filters[$handle])) 
     476    { 
     477      foreach ($this->external_filters[$handle] as $filters)  
     478      { 
     479        foreach ($filters as $filter)  
     480        { 
     481          list($type, $callback) = $filter; 
     482          call_user_func(array($this->smarty, 'unregister_'.$type), $callback); 
     483        } 
     484      } 
     485    } 
     486  } 
     487 
    422488  static function prefilter_white_space($source, &$smarty) 
    423489  { 
     
    465531  } 
    466532} 
     533 
    467534 
    468535/** 
Note: See TracChangeset for help on using the changeset viewer.