1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
32:
33:
34:
35: 36: 37:
38: if(!defined('DIR_SEP')) {
39: define('DIR_SEP', DIRECTORY_SEPARATOR);
40: }
41:
42: 43: 44: 45: 46:
47:
48: if (!defined('SMARTY_DIR')) {
49: define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
50: }
51:
52: if (!defined('SMARTY_CORE_DIR')) {
53: define('SMARTY_CORE_DIR', SMARTY_DIR . 'internals' . DIRECTORY_SEPARATOR);
54: }
55:
56: define('SMARTY_PHP_PASSTHRU', 0);
57: define('SMARTY_PHP_QUOTE', 1);
58: define('SMARTY_PHP_REMOVE', 2);
59: define('SMARTY_PHP_ALLOW', 3);
60:
61: 62: 63:
64: class Smarty
65: {
66: 67: 68:
69:
70: 71: 72: 73: 74:
75: var $template_dir = 'templates';
76:
77: 78: 79: 80: 81:
82: var $compile_dir = 'templates_c';
83:
84: 85: 86: 87: 88:
89: var $config_dir = 'configs';
90:
91: 92: 93: 94: 95:
96: var $plugins_dir = array('plugins');
97:
98: 99: 100: 101: 102: 103: 104:
105: var $debugging = false;
106:
107: 108: 109: 110: 111:
112: var $error_reporting = null;
113:
114: 115: 116: 117: 118: 119:
120: var $debug_tpl = '';
121:
122: 123: 124: 125: 126: 127: 128: 129: 130:
131: var $debugging_ctrl = 'NONE';
132:
133: 134: 135: 136: 137: 138: 139: 140:
141: var $compile_check = true;
142:
143: 144: 145: 146: 147: 148:
149: var $force_compile = false;
150:
151: 152: 153: 154: 155: 156: 157: 158: 159:
160: var $caching = 0;
161:
162: 163: 164: 165: 166:
167: var $cache_dir = 'cache';
168:
169: 170: 171: 172: 173: 174: 175: 176: 177:
178: var $cache_lifetime = 3600;
179:
180: 181: 182: 183: 184: 185: 186: 187:
188: var $cache_modified_check = false;
189:
190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201:
202: var $php_handling = SMARTY_PHP_PASSTHRU;
203:
204: 205: 206: 207: 208: 209: 210: 211:
212: var $security = false;
213:
214: 215: 216: 217: 218: 219: 220:
221: var $secure_dir = array();
222:
223: 224: 225: 226: 227: 228:
229: var $security_settings = array(
230: 'PHP_HANDLING' => false,
231: 'IF_FUNCS' => array('array', 'list',
232: 'isset', 'empty',
233: 'count', 'sizeof',
234: 'in_array', 'is_array',
235: 'true', 'false', 'null'),
236: 'INCLUDE_ANY' => false,
237: 'PHP_TAGS' => false,
238: 'MODIFIER_FUNCS' => array('count'),
239: 'ALLOW_CONSTANTS' => false,
240: 'ALLOW_SUPER_GLOBALS' => true
241: );
242:
243: 244: 245: 246: 247: 248:
249: var $trusted_dir = array();
250:
251: 252: 253: 254: 255:
256: var $left_delimiter = '{';
257:
258: 259: 260: 261: 262:
263: var $right_delimiter = '}';
264:
265: 266: 267: 268: 269: 270: 271:
272: var $request_vars_order = 'EGPCS';
273:
274: 275: 276: 277: 278: 279: 280: 281:
282: var $request_use_auto_globals = true;
283:
284: 285: 286: 287: 288: 289: 290: 291:
292: var $compile_id = null;
293:
294: 295: 296: 297: 298: 299: 300: 301:
302: var $use_sub_dirs = false;
303:
304: 305: 306: 307: 308: 309: 310:
311: var $default_modifiers = array();
312:
313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324:
325: var $default_resource_type = 'file';
326:
327: 328: 329: 330: 331:
332: var $cache_handler_func = null;
333:
334: 335: 336: 337: 338:
339: var $autoload_filters = array();
340:
341: 342: 343:
344: 345: 346: 347:
348: var $config_overwrite = true;
349:
350: 351: 352: 353: 354:
355: var $config_booleanize = true;
356:
357: 358: 359: 360: 361: 362:
363: var $config_read_hidden = false;
364:
365: 366: 367: 368:
369: var $config_fix_newlines = true;
370:
371:
372: 373: 374: 375: 376: 377:
378: var $default_template_handler_func = '';
379:
380: 381: 382: 383: 384: 385:
386: var $compiler_file = 'Smarty_Compiler.class.php';
387:
388: 389: 390: 391: 392:
393: var $compiler_class = 'Smarty_Compiler';
394:
395: 396: 397: 398: 399:
400: var $config_class = 'Config_File';
401:
402: 403: 404: 405: 406:
407: 408: 409: 410: 411:
412: var $_tpl_vars = array();
413:
414: 415: 416: 417: 418:
419: var $_smarty_vars = null;
420:
421: 422: 423: 424: 425:
426: var $_sections = array();
427:
428: 429: 430: 431: 432:
433: var $_foreach = array();
434:
435: 436: 437: 438: 439:
440: var $_tag_stack = array();
441:
442: 443: 444: 445: 446:
447: var $_conf_obj = null;
448:
449: 450: 451: 452: 453:
454: var $_config = array(array('vars' => array(), 'files' => array()));
455:
456: 457: 458: 459: 460:
461: var $_smarty_md5 = 'f8d698aea36fcbead2b9d5359ffca76f';
462:
463: 464: 465: 466: 467:
468: var $_version = '2.6.26';
469:
470: 471: 472: 473: 474:
475: var $_inclusion_depth = 0;
476:
477: 478: 479: 480: 481:
482: var $_compile_id = null;
483:
484: 485: 486: 487: 488:
489: var $_smarty_debug_id = 'SMARTY_DEBUG';
490:
491: 492: 493: 494: 495:
496: var $_smarty_debug_info = array();
497:
498: 499: 500: 501: 502:
503: var $_cache_info = array();
504:
505: 506: 507: 508: 509:
510: var $_file_perms = 0644;
511:
512: 513: 514: 515: 516:
517: var $_dir_perms = 0771;
518:
519: 520: 521: 522: 523:
524: var $_reg_objects = array();
525:
526: 527: 528: 529: 530:
531: var $_plugins = array(
532: 'modifier' => array(),
533: 'function' => array(),
534: 'block' => array(),
535: 'compiler' => array(),
536: 'prefilter' => array(),
537: 'postfilter' => array(),
538: 'outputfilter' => array(),
539: 'resource' => array(),
540: 'insert' => array());
541:
542:
543: 544: 545: 546: 547:
548: var $_cache_serials = array();
549:
550: 551: 552: 553: 554:
555: var $_cache_include = null;
556:
557: 558: 559: 560: 561: 562:
563: var $_cache_including = false;
564:
565:
566: 567: 568:
569: function Smarty()
570: {
571: $this->assign('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME']
572: : @$GLOBALS['HTTP_SERVER_VARS']['SCRIPT_NAME']);
573: }
574:
575: 576: 577: 578: 579: 580:
581: function assign($tpl_var, $value = null)
582: {
583: if (is_array($tpl_var)){
584: foreach ($tpl_var as $key => $val) {
585: if ($key != '') {
586: $this->_tpl_vars[$key] = $val;
587: }
588: }
589: } else {
590: if ($tpl_var != '')
591: $this->_tpl_vars[$tpl_var] = $value;
592: }
593: }
594:
595: 596: 597: 598: 599: 600:
601: function assign_by_ref($tpl_var, &$value)
602: {
603: if ($tpl_var != '')
604: $this->_tpl_vars[$tpl_var] = &$value;
605: }
606:
607: 608: 609: 610: 611: 612:
613: function append($tpl_var, $value=null, $merge=false)
614: {
615: if (is_array($tpl_var)) {
616:
617: foreach ($tpl_var as $_key => $_val) {
618: if ($_key != '') {
619: if(!@is_array($this->_tpl_vars[$_key])) {
620: settype($this->_tpl_vars[$_key],'array');
621: }
622: if($merge && is_array($_val)) {
623: foreach($_val as $_mkey => $_mval) {
624: $this->_tpl_vars[$_key][$_mkey] = $_mval;
625: }
626: } else {
627: $this->_tpl_vars[$_key][] = $_val;
628: }
629: }
630: }
631: } else {
632: if ($tpl_var != '' && isset($value)) {
633: if(!@is_array($this->_tpl_vars[$tpl_var])) {
634: settype($this->_tpl_vars[$tpl_var],'array');
635: }
636: if($merge && is_array($value)) {
637: foreach($value as $_mkey => $_mval) {
638: $this->_tpl_vars[$tpl_var][$_mkey] = $_mval;
639: }
640: } else {
641: $this->_tpl_vars[$tpl_var][] = $value;
642: }
643: }
644: }
645: }
646:
647: 648: 649: 650: 651: 652:
653: function append_by_ref($tpl_var, &$value, $merge=false)
654: {
655: if ($tpl_var != '' && isset($value)) {
656: if(!@is_array($this->_tpl_vars[$tpl_var])) {
657: settype($this->_tpl_vars[$tpl_var],'array');
658: }
659: if ($merge && is_array($value)) {
660: foreach($value as $_key => $_val) {
661: $this->_tpl_vars[$tpl_var][$_key] = &$value[$_key];
662: }
663: } else {
664: $this->_tpl_vars[$tpl_var][] = &$value;
665: }
666: }
667: }
668:
669:
670: 671: 672: 673: 674:
675: function clear_assign($tpl_var)
676: {
677: if (is_array($tpl_var))
678: foreach ($tpl_var as $curr_var)
679: unset($this->_tpl_vars[$curr_var]);
680: else
681: unset($this->_tpl_vars[$tpl_var]);
682: }
683:
684:
685: 686: 687: 688: 689: 690:
691: function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)
692: {
693: $this->_plugins['function'][$function] =
694: array($function_impl, null, null, false, $cacheable, $cache_attrs);
695:
696: }
697:
698: 699: 700: 701: 702:
703: function unregister_function($function)
704: {
705: unset($this->_plugins['function'][$function]);
706: }
707:
708: 709: 710: 711: 712: 713: 714: 715: 716:
717: function register_object($object, &$object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
718: {
719: settype($allowed, 'array');
720: settype($smarty_args, 'boolean');
721: $this->_reg_objects[$object] =
722: array(&$object_impl, $allowed, $smarty_args, $block_methods);
723: }
724:
725: 726: 727: 728: 729:
730: function unregister_object($object)
731: {
732: unset($this->_reg_objects[$object]);
733: }
734:
735:
736: 737: 738: 739: 740: 741:
742: function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)
743: {
744: $this->_plugins['block'][$block] =
745: array($block_impl, null, null, false, $cacheable, $cache_attrs);
746: }
747:
748: 749: 750: 751: 752:
753: function unregister_block($block)
754: {
755: unset($this->_plugins['block'][$block]);
756: }
757:
758: 759: 760: 761: 762: 763:
764: function register_compiler_function($function, $function_impl, $cacheable=true)
765: {
766: $this->_plugins['compiler'][$function] =
767: array($function_impl, null, null, false, $cacheable);
768: }
769:
770: 771: 772: 773: 774:
775: function unregister_compiler_function($function)
776: {
777: unset($this->_plugins['compiler'][$function]);
778: }
779:
780: 781: 782: 783: 784: 785:
786: function register_modifier($modifier, $modifier_impl)
787: {
788: $this->_plugins['modifier'][$modifier] =
789: array($modifier_impl, null, null, false);
790: }
791:
792: 793: 794: 795: 796:
797: function unregister_modifier($modifier)
798: {
799: unset($this->_plugins['modifier'][$modifier]);
800: }
801:
802: 803: 804: 805: 806: 807:
808: function register_resource($type, $functions)
809: {
810: if (count($functions)==4) {
811: $this->_plugins['resource'][$type] =
812: array($functions, false);
813:
814: } elseif (count($functions)==5) {
815: $this->_plugins['resource'][$type] =
816: array(array(array(&$functions[0], $functions[1])
817: ,array(&$functions[0], $functions[2])
818: ,array(&$functions[0], $functions[3])
819: ,array(&$functions[0], $functions[4]))
820: ,false);
821:
822: } else {
823: $this->trigger_error("malformed function-list for '$type' in register_resource");
824:
825: }
826: }
827:
828: 829: 830: 831: 832:
833: function unregister_resource($type)
834: {
835: unset($this->_plugins['resource'][$type]);
836: }
837:
838: 839: 840: 841: 842: 843:
844: function register_prefilter($function)
845: {
846: $this->_plugins['prefilter'][$this->_get_filter_name($function)]
847: = array($function, null, null, false);
848: }
849:
850: 851: 852: 853: 854:
855: function unregister_prefilter($function)
856: {
857: unset($this->_plugins['prefilter'][$this->_get_filter_name($function)]);
858: }
859:
860: 861: 862: 863: 864: 865:
866: function register_postfilter($function)
867: {
868: $this->_plugins['postfilter'][$this->_get_filter_name($function)]
869: = array($function, null, null, false);
870: }
871:
872: 873: 874: 875: 876:
877: function unregister_postfilter($function)
878: {
879: unset($this->_plugins['postfilter'][$this->_get_filter_name($function)]);
880: }
881:
882: 883: 884: 885: 886: 887:
888: function register_outputfilter($function)
889: {
890: $this->_plugins['outputfilter'][$this->_get_filter_name($function)]
891: = array($function, null, null, false);
892: }
893:
894: 895: 896: 897: 898:
899: function unregister_outputfilter($function)
900: {
901: unset($this->_plugins['outputfilter'][$this->_get_filter_name($function)]);
902: }
903:
904: 905: 906: 907: 908: 909:
910: function load_filter($type, $name)
911: {
912: switch ($type) {
913: case 'output':
914: $_params = array('plugins' => array(array($type . 'filter', $name, null, null, false)));
915: require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
916: smarty_core_load_plugins($_params, $this);
917: break;
918:
919: case 'pre':
920: case 'post':
921: if (!isset($this->_plugins[$type . 'filter'][$name]))
922: $this->_plugins[$type . 'filter'][$name] = false;
923: break;
924: }
925: }
926:
927: 928: 929: 930: 931: 932: 933: 934: 935:
936: function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
937: {
938:
939: if (!isset($compile_id))
940: $compile_id = $this->compile_id;
941:
942: if (!isset($tpl_file))
943: $compile_id = null;
944:
945: $_auto_id = $this->_get_auto_id($cache_id, $compile_id);
946:
947: if (!empty($this->cache_handler_func)) {
948: return call_user_func_array($this->cache_handler_func,
949: array('clear', &$this, &$dummy, $tpl_file, $cache_id, $compile_id, $exp_time));
950: } else {
951: $_params = array('auto_base' => $this->cache_dir,
952: 'auto_source' => $tpl_file,
953: 'auto_id' => $_auto_id,
954: 'exp_time' => $exp_time);
955: require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
956: return smarty_core_rm_auto($_params, $this);
957: }
958:
959: }
960:
961:
962: 963: 964: 965: 966: 967:
968: function clear_all_cache($exp_time = null)
969: {
970: return $this->clear_cache(null, null, null, $exp_time);
971: }
972:
973:
974: 975: 976: 977: 978: 979: 980: 981:
982: function is_cached($tpl_file, $cache_id = null, $compile_id = null)
983: {
984: if (!$this->caching)
985: return false;
986:
987: if (!isset($compile_id))
988: $compile_id = $this->compile_id;
989:
990: $_params = array(
991: 'tpl_file' => $tpl_file,
992: 'cache_id' => $cache_id,
993: 'compile_id' => $compile_id
994: );
995: require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
996: return smarty_core_read_cache_file($_params, $this);
997: }
998:
999:
1000: 1001: 1002: 1003:
1004: function clear_all_assign()
1005: {
1006: $this->_tpl_vars = array();
1007: }
1008:
1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018:
1019: function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
1020: {
1021: if (!isset($compile_id)) {
1022: $compile_id = $this->compile_id;
1023: }
1024: $_params = array('auto_base' => $this->compile_dir,
1025: 'auto_source' => $tpl_file,
1026: 'auto_id' => $compile_id,
1027: 'exp_time' => $exp_time,
1028: 'extensions' => array('.inc', '.php'));
1029: require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
1030: return smarty_core_rm_auto($_params, $this);
1031: }
1032:
1033: 1034: 1035: 1036: 1037: 1038:
1039: function template_exists($tpl_file)
1040: {
1041: $_params = array('resource_name' => $tpl_file, 'quiet'=>true, 'get_source'=>false);
1042: return $this->_fetch_resource_info($_params);
1043: }
1044:
1045: 1046: 1047: 1048: 1049: 1050: 1051:
1052: function &get_template_vars($name=null)
1053: {
1054: if(!isset($name)) {
1055: return $this->_tpl_vars;
1056: } elseif(isset($this->_tpl_vars[$name])) {
1057: return $this->_tpl_vars[$name];
1058: } else {
1059:
1060: $_tmp = null;
1061: return $_tmp;
1062: }
1063: }
1064:
1065: 1066: 1067: 1068: 1069: 1070: 1071:
1072: function &get_config_vars($name=null)
1073: {
1074: if(!isset($name) && is_array($this->_config[0])) {
1075: return $this->_config[0]['vars'];
1076: } else if(isset($this->_config[0]['vars'][$name])) {
1077: return $this->_config[0]['vars'][$name];
1078: } else {
1079:
1080: $_tmp = null;
1081: return $_tmp;
1082: }
1083: }
1084:
1085: 1086: 1087: 1088: 1089: 1090:
1091: function trigger_error($error_msg, $error_type = E_USER_WARNING)
1092: {
1093: trigger_error("Smarty error: $error_msg", $error_type);
1094: }
1095:
1096:
1097: 1098: 1099: 1100: 1101: 1102: 1103:
1104: function display($resource_name, $cache_id = null, $compile_id = null)
1105: {
1106: $this->fetch($resource_name, $cache_id, $compile_id, true);
1107: }
1108:
1109: 1110: 1111: 1112: 1113: 1114: 1115: 1116:
1117: function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
1118: {
1119: static $_cache_info = array();
1120:
1121: $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
1122: ? $this->error_reporting : error_reporting() & ~E_NOTICE);
1123:
1124: if (!$this->debugging && $this->debugging_ctrl == 'URL') {
1125: $_query_string = $this->request_use_auto_globals ? $_SERVER['QUERY_STRING'] : $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING'];
1126: if (@strstr($_query_string, $this->_smarty_debug_id)) {
1127: if (@strstr($_query_string, $this->_smarty_debug_id . '=on')) {
1128:
1129: @setcookie('SMARTY_DEBUG', true);
1130: $this->debugging = true;
1131: } elseif (@strstr($_query_string, $this->_smarty_debug_id . '=off')) {
1132:
1133: @setcookie('SMARTY_DEBUG', false);
1134: $this->debugging = false;
1135: } else {
1136:
1137: $this->debugging = true;
1138: }
1139: } else {
1140: $this->debugging = (bool)($this->request_use_auto_globals ? @$_COOKIE['SMARTY_DEBUG'] : @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']);
1141: }
1142: }
1143:
1144: if ($this->debugging) {
1145:
1146: $_params = array();
1147: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1148: $_debug_start_time = smarty_core_get_microtime($_params, $this);
1149: $this->_smarty_debug_info[] = array('type' => 'template',
1150: 'filename' => $resource_name,
1151: 'depth' => 0);
1152: $_included_tpls_idx = count($this->_smarty_debug_info) - 1;
1153: }
1154:
1155: if (!isset($compile_id)) {
1156: $compile_id = $this->compile_id;
1157: }
1158:
1159: $this->_compile_id = $compile_id;
1160: $this->_inclusion_depth = 0;
1161:
1162: if ($this->caching) {
1163:
1164: array_push($_cache_info, $this->_cache_info);
1165: $this->_cache_info = array();
1166: $_params = array(
1167: 'tpl_file' => $resource_name,
1168: 'cache_id' => $cache_id,
1169: 'compile_id' => $compile_id,
1170: 'results' => null
1171: );
1172: require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
1173: if (smarty_core_read_cache_file($_params, $this)) {
1174: $_smarty_results = $_params['results'];
1175: if (!empty($this->_cache_info['insert_tags'])) {
1176: $_params = array('plugins' => $this->_cache_info['insert_tags']);
1177: require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
1178: smarty_core_load_plugins($_params, $this);
1179: $_params = array('results' => $_smarty_results);
1180: require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
1181: $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
1182: }
1183: if (!empty($this->_cache_info['cache_serials'])) {
1184: $_params = array('results' => $_smarty_results);
1185: require_once(SMARTY_CORE_DIR . 'core.process_compiled_include.php');
1186: $_smarty_results = smarty_core_process_compiled_include($_params, $this);
1187: }
1188:
1189:
1190: if ($display) {
1191: if ($this->debugging)
1192: {
1193:
1194: $_params = array();
1195: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1196: $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $_debug_start_time;
1197: require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
1198: $_smarty_results .= smarty_core_display_debug_console($_params, $this);
1199: }
1200: if ($this->cache_modified_check) {
1201: $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
1202: $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
1203: $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
1204: if (@count($this->_cache_info['insert_tags']) == 0
1205: && !$this->_cache_serials
1206: && $_gmt_mtime == $_last_modified_date) {
1207: if (php_sapi_name()=='cgi')
1208: header('Status: 304 Not Modified');
1209: else
1210: header('HTTP/1.1 304 Not Modified');
1211:
1212: } else {
1213: header('Last-Modified: '.$_gmt_mtime);
1214: echo $_smarty_results;
1215: }
1216: } else {
1217: echo $_smarty_results;
1218: }
1219: error_reporting($_smarty_old_error_level);
1220:
1221: $this->_cache_info = array_pop($_cache_info);
1222: return true;
1223: } else {
1224: error_reporting($_smarty_old_error_level);
1225:
1226: $this->_cache_info = array_pop($_cache_info);
1227: return $_smarty_results;
1228: }
1229: } else {
1230: $this->_cache_info['template'][$resource_name] = true;
1231: if ($this->cache_modified_check && $display) {
1232: header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
1233: }
1234: }
1235: }
1236:
1237:
1238: if (count($this->autoload_filters)) {
1239: foreach ($this->autoload_filters as $_filter_type => $_filters) {
1240: foreach ($_filters as $_filter) {
1241: $this->load_filter($_filter_type, $_filter);
1242: }
1243: }
1244: }
1245:
1246: $_smarty_compile_path = $this->_get_compile_path($resource_name);
1247:
1248:
1249:
1250: $_cache_including = $this->_cache_including;
1251: $this->_cache_including = false;
1252: if ($display && !$this->caching && count($this->_plugins['outputfilter']) == 0) {
1253: if ($this->_is_compiled($resource_name, $_smarty_compile_path)
1254: || $this->_compile_resource($resource_name, $_smarty_compile_path))
1255: {
1256: include($_smarty_compile_path);
1257: }
1258: } else {
1259: ob_start();
1260: if ($this->_is_compiled($resource_name, $_smarty_compile_path)
1261: || $this->_compile_resource($resource_name, $_smarty_compile_path))
1262: {
1263: include($_smarty_compile_path);
1264: }
1265: $_smarty_results = ob_get_contents();
1266: ob_end_clean();
1267:
1268: foreach ((array)$this->_plugins['outputfilter'] as $_output_filter) {
1269: $_smarty_results = call_user_func_array($_output_filter[0], array($_smarty_results, &$this));
1270: }
1271: }
1272:
1273: if ($this->caching) {
1274: $_params = array('tpl_file' => $resource_name,
1275: 'cache_id' => $cache_id,
1276: 'compile_id' => $compile_id,
1277: 'results' => $_smarty_results);
1278: require_once(SMARTY_CORE_DIR . 'core.write_cache_file.php');
1279: smarty_core_write_cache_file($_params, $this);
1280: require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
1281: $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
1282:
1283: if ($this->_cache_serials) {
1284:
1285: $_smarty_results = preg_replace('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!s'
1286: ,''
1287: ,$_smarty_results);
1288: }
1289:
1290: $this->_cache_info = array_pop($_cache_info);
1291: }
1292: $this->_cache_including = $_cache_including;
1293:
1294: if ($display) {
1295: if (isset($_smarty_results)) { echo $_smarty_results; }
1296: if ($this->debugging) {
1297:
1298: $_params = array();
1299: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1300: $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime($_params, $this) - $_debug_start_time);
1301: require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
1302: echo smarty_core_display_debug_console($_params, $this);
1303: }
1304: error_reporting($_smarty_old_error_level);
1305: return;
1306: } else {
1307: error_reporting($_smarty_old_error_level);
1308: if (isset($_smarty_results)) { return $_smarty_results; }
1309: }
1310: }
1311:
1312: 1313: 1314: 1315: 1316: 1317: 1318:
1319: function config_load($file, $section = null, $scope = 'global')
1320: {
1321: require_once($this->_get_plugin_filepath('function', 'config_load'));
1322: smarty_function_config_load(array('file' => $file, 'section' => $section, 'scope' => $scope), $this);
1323: }
1324:
1325: 1326: 1327: 1328: 1329: 1330:
1331: function &get_registered_object($name) {
1332: if (!isset($this->_reg_objects[$name]))
1333: $this->_trigger_fatal_error("'$name' is not a registered object");
1334:
1335: if (!is_object($this->_reg_objects[$name][0]))
1336: $this->_trigger_fatal_error("registered '$name' is not an object");
1337:
1338: return $this->_reg_objects[$name][0];
1339: }
1340:
1341: 1342: 1343: 1344: 1345:
1346: function clear_config($var = null)
1347: {
1348: if(!isset($var)) {
1349:
1350: $this->_config = array(array('vars' => array(),
1351: 'files' => array()));
1352: } else {
1353: unset($this->_config[0]['vars'][$var]);
1354: }
1355: }
1356:
1357: 1358: 1359: 1360: 1361: 1362: 1363:
1364: function _get_plugin_filepath($type, $name)
1365: {
1366: $_params = array('type' => $type, 'name' => $name);
1367: require_once(SMARTY_CORE_DIR . 'core.assemble_plugin_filepath.php');
1368: return smarty_core_assemble_plugin_filepath($_params, $this);
1369: }
1370:
1371: 1372: 1373: 1374: 1375: 1376: 1377:
1378: function _is_compiled($resource_name, $compile_path)
1379: {
1380: if (!$this->force_compile && file_exists($compile_path)) {
1381: if (!$this->compile_check) {
1382:
1383: return true;
1384: } else {
1385:
1386: $_params = array('resource_name' => $resource_name, 'get_source'=>false);
1387: if (!$this->_fetch_resource_info($_params)) {
1388: return false;
1389: }
1390: if ($_params['resource_timestamp'] <= filemtime($compile_path)) {
1391:
1392: return true;
1393: } else {
1394:
1395: return false;
1396: }
1397: }
1398: } else {
1399:
1400: return false;
1401: }
1402: }
1403:
1404: 1405: 1406: 1407: 1408: 1409: 1410:
1411: function _compile_resource($resource_name, $compile_path)
1412: {
1413:
1414: $_params = array('resource_name' => $resource_name);
1415: if (!$this->_fetch_resource_info($_params)) {
1416: return false;
1417: }
1418:
1419: $_source_content = $_params['source_content'];
1420: $_cache_include = substr($compile_path, 0, -4).'.inc';
1421:
1422: if ($this->_compile_source($resource_name, $_source_content, $_compiled_content, $_cache_include)) {
1423:
1424: if ($this->_cache_include_info) {
1425: require_once(SMARTY_CORE_DIR . 'core.write_compiled_include.php');
1426: smarty_core_write_compiled_include(array_merge($this->_cache_include_info, array('compiled_content'=>$_compiled_content, 'resource_name'=>$resource_name)), $this);
1427: }
1428:
1429: $_params = array('compile_path'=>$compile_path, 'compiled_content' => $_compiled_content);
1430: require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
1431: smarty_core_write_compiled_resource($_params, $this);
1432:
1433: return true;
1434: } else {
1435: return false;
1436: }
1437:
1438: }
1439:
1440: 1441: 1442: 1443: 1444: 1445: 1446: 1447:
1448: function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null)
1449: {
1450: if (file_exists(SMARTY_DIR . $this->compiler_file)) {
1451: require_once(SMARTY_DIR . $this->compiler_file);
1452: } else {
1453:
1454: require_once($this->compiler_file);
1455: }
1456:
1457:
1458: $smarty_compiler = new $this->compiler_class;
1459:
1460: $smarty_compiler->template_dir = $this->template_dir;
1461: $smarty_compiler->compile_dir = $this->compile_dir;
1462: $smarty_compiler->plugins_dir = $this->plugins_dir;
1463: $smarty_compiler->config_dir = $this->config_dir;
1464: $smarty_compiler->force_compile = $this->force_compile;
1465: $smarty_compiler->caching = $this->caching;
1466: $smarty_compiler->php_handling = $this->php_handling;
1467: $smarty_compiler->left_delimiter = $this->left_delimiter;
1468: $smarty_compiler->right_delimiter = $this->right_delimiter;
1469: $smarty_compiler->_version = $this->_version;
1470: $smarty_compiler->security = $this->security;
1471: $smarty_compiler->secure_dir = $this->secure_dir;
1472: $smarty_compiler->security_settings = $this->security_settings;
1473: $smarty_compiler->trusted_dir = $this->trusted_dir;
1474: $smarty_compiler->use_sub_dirs = $this->use_sub_dirs;
1475: $smarty_compiler->_reg_objects = &$this->_reg_objects;
1476: $smarty_compiler->_plugins = &$this->_plugins;
1477: $smarty_compiler->_tpl_vars = &$this->_tpl_vars;
1478: $smarty_compiler->default_modifiers = $this->default_modifiers;
1479: $smarty_compiler->compile_id = $this->_compile_id;
1480: $smarty_compiler->_config = $this->_config;
1481: $smarty_compiler->request_use_auto_globals = $this->request_use_auto_globals;
1482:
1483: if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) {
1484: $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path];
1485: }
1486: $smarty_compiler->_cache_include = $cache_include_path;
1487:
1488:
1489: $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content);
1490:
1491: if ($smarty_compiler->_cache_serial) {
1492: $this->_cache_include_info = array(
1493: 'cache_serial'=>$smarty_compiler->_cache_serial
1494: ,'plugins_code'=>$smarty_compiler->_plugins_code
1495: ,'include_file_path' => $cache_include_path);
1496:
1497: } else {
1498: $this->_cache_include_info = null;
1499:
1500: }
1501:
1502: return $_results;
1503: }
1504:
1505: 1506: 1507: 1508: 1509: 1510:
1511: function _get_compile_path($resource_name)
1512: {
1513: return $this->_get_auto_filename($this->compile_dir, $resource_name,
1514: $this->_compile_id) . '.php';
1515: }
1516:
1517: 1518: 1519: 1520: 1521: 1522: 1523: 1524: 1525: 1526: 1527: 1528: 1529:
1530:
1531: function _fetch_resource_info(&$params)
1532: {
1533: if(!isset($params['get_source'])) { $params['get_source'] = true; }
1534: if(!isset($params['quiet'])) { $params['quiet'] = false; }
1535:
1536: $_return = false;
1537: $_params = array('resource_name' => $params['resource_name']) ;
1538: if (isset($params['resource_base_path']))
1539: $_params['resource_base_path'] = $params['resource_base_path'];
1540: else
1541: $_params['resource_base_path'] = $this->template_dir;
1542:
1543: if ($this->_parse_resource_name($_params)) {
1544: $_resource_type = $_params['resource_type'];
1545: $_resource_name = $_params['resource_name'];
1546: switch ($_resource_type) {
1547: case 'file':
1548: if ($params['get_source']) {
1549: $params['source_content'] = $this->_read_file($_resource_name);
1550: }
1551: $params['resource_timestamp'] = filemtime($_resource_name);
1552: $_return = is_file($_resource_name) && is_readable($_resource_name);
1553: break;
1554:
1555: default:
1556:
1557: if ($params['get_source']) {
1558: $_source_return = isset($this->_plugins['resource'][$_resource_type]) &&
1559: call_user_func_array($this->_plugins['resource'][$_resource_type][0][0],
1560: array($_resource_name, &$params['source_content'], &$this));
1561: } else {
1562: $_source_return = true;
1563: }
1564:
1565: $_timestamp_return = isset($this->_plugins['resource'][$_resource_type]) &&
1566: call_user_func_array($this->_plugins['resource'][$_resource_type][0][1],
1567: array($_resource_name, &$params['resource_timestamp'], &$this));
1568:
1569: $_return = $_source_return && $_timestamp_return;
1570: break;
1571: }
1572: }
1573:
1574: if (!$_return) {
1575:
1576: if (!empty($this->default_template_handler_func)) {
1577: if (!is_callable($this->default_template_handler_func)) {
1578: $this->trigger_error("default template handler function \"$this->default_template_handler_func\" doesn't exist.");
1579: } else {
1580: $_return = call_user_func_array(
1581: $this->default_template_handler_func,
1582: array($_params['resource_type'], $_params['resource_name'], &$params['source_content'], &$params['resource_timestamp'], &$this));
1583: }
1584: }
1585: }
1586:
1587: if (!$_return) {
1588: if (!$params['quiet']) {
1589: $this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"');
1590: }
1591: } else if ($_return && $this->security) {
1592: require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
1593: if (!smarty_core_is_secure($_params, $this)) {
1594: if (!$params['quiet'])
1595: $this->trigger_error('(secure mode) accessing "' . $params['resource_name'] . '" is not allowed');
1596: $params['source_content'] = null;
1597: $params['resource_timestamp'] = null;
1598: return false;
1599: }
1600: }
1601: return $_return;
1602: }
1603:
1604:
1605: 1606: 1607: 1608: 1609: 1610: 1611: 1612: 1613:
1614:
1615: function _parse_resource_name(&$params)
1616: {
1617:
1618:
1619: $_resource_name_parts = explode(':', $params['resource_name'], 2);
1620:
1621: if (count($_resource_name_parts) == 1) {
1622:
1623: $params['resource_type'] = $this->default_resource_type;
1624: $params['resource_name'] = $_resource_name_parts[0];
1625: } else {
1626: if(strlen($_resource_name_parts[0]) == 1) {
1627:
1628: $params['resource_type'] = $this->default_resource_type;
1629: $params['resource_name'] = $params['resource_name'];
1630: } else {
1631: $params['resource_type'] = $_resource_name_parts[0];
1632: $params['resource_name'] = $_resource_name_parts[1];
1633: }
1634: }
1635:
1636: if ($params['resource_type'] == 'file') {
1637: if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $params['resource_name'])) {
1638:
1639:
1640: foreach ((array)$params['resource_base_path'] as $_curr_path) {
1641: $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name'];
1642: if (file_exists($_fullpath) && is_file($_fullpath)) {
1643: $params['resource_name'] = $_fullpath;
1644: return true;
1645: }
1646:
1647: $_params = array('file_path' => $_fullpath);
1648: require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
1649: if(smarty_core_get_include_path($_params, $this)) {
1650: $params['resource_name'] = $_params['new_file_path'];
1651: return true;
1652: }
1653: }
1654: return false;
1655: } else {
1656:
1657: return file_exists($params['resource_name']);
1658: }
1659: } elseif (empty($this->_plugins['resource'][$params['resource_type']])) {
1660: $_params = array('type' => $params['resource_type']);
1661: require_once(SMARTY_CORE_DIR . 'core.load_resource_plugin.php');
1662: smarty_core_load_resource_plugin($_params, $this);
1663: }
1664:
1665: return true;
1666: }
1667:
1668:
1669: 1670: 1671: 1672: 1673: 1674: 1675:
1676: function _run_mod_handler()
1677: {
1678: $_args = func_get_args();
1679: list($_modifier_name, $_map_array) = array_splice($_args, 0, 2);
1680: list($_func_name, $_tpl_file, $_tpl_line) =
1681: $this->_plugins['modifier'][$_modifier_name];
1682:
1683: $_var = $_args[0];
1684: foreach ($_var as $_key => $_val) {
1685: $_args[0] = $_val;
1686: $_var[$_key] = call_user_func_array($_func_name, $_args);
1687: }
1688: return $_var;
1689: }
1690:
1691: 1692: 1693: 1694: 1695: 1696:
1697: function _dequote($string)
1698: {
1699: if ((substr($string, 0, 1) == "'" || substr($string, 0, 1) == '"') &&
1700: substr($string, -1) == substr($string, 0, 1))
1701: return substr($string, 1, -1);
1702: else
1703: return $string;
1704: }
1705:
1706:
1707: 1708: 1709: 1710: 1711: 1712:
1713: function _read_file($filename)
1714: {
1715: if ( file_exists($filename) && is_readable($filename) && ($fd = @fopen($filename, 'rb')) ) {
1716: $contents = '';
1717: while (!feof($fd)) {
1718: $contents .= fread($fd, 8192);
1719: }
1720: fclose($fd);
1721: return $contents;
1722: } else {
1723: return false;
1724: }
1725: }
1726:
1727: 1728: 1729: 1730: 1731: 1732: 1733: 1734: 1735: 1736:
1737: function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null)
1738: {
1739: $_compile_dir_sep = $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
1740: $_return = $auto_base . DIRECTORY_SEPARATOR;
1741:
1742: if(isset($auto_id)) {
1743:
1744: $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id)));
1745:
1746: $_return .= $auto_id . $_compile_dir_sep;
1747: }
1748:
1749: if(isset($auto_source)) {
1750:
1751: $_filename = urlencode(basename($auto_source));
1752: $_crc32 = sprintf('%08X', crc32($auto_source));
1753:
1754:
1755: $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
1756: substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
1757: $_return .= '%%' . $_crc32 . '%%' . $_filename;
1758: }
1759:
1760: return $_return;
1761: }
1762:
1763: 1764: 1765: 1766: 1767: 1768:
1769: function _unlink($resource, $exp_time = null)
1770: {
1771: if(isset($exp_time)) {
1772: if(time() - @filemtime($resource) >= $exp_time) {
1773: return @unlink($resource);
1774: }
1775: } else {
1776: return @unlink($resource);
1777: }
1778: }
1779:
1780: 1781: 1782: 1783: 1784: 1785: 1786:
1787: function _get_auto_id($cache_id=null, $compile_id=null) {
1788: if (isset($cache_id))
1789: return (isset($compile_id)) ? $cache_id . '|' . $compile_id : $cache_id;
1790: elseif(isset($compile_id))
1791: return $compile_id;
1792: else
1793: return null;
1794: }
1795:
1796: 1797: 1798: 1799: 1800: 1801: 1802: 1803: 1804: 1805:
1806: function _trigger_fatal_error($error_msg, $tpl_file = null, $tpl_line = null,
1807: $file = null, $line = null, $error_type = E_USER_ERROR)
1808: {
1809: if(isset($file) && isset($line)) {
1810: $info = ' ('.basename($file).", line $line)";
1811: } else {
1812: $info = '';
1813: }
1814: if (isset($tpl_line) && isset($tpl_file)) {
1815: $this->trigger_error('[in ' . $tpl_file . ' line ' . $tpl_line . "]: $error_msg$info", $error_type);
1816: } else {
1817: $this->trigger_error($error_msg . $info, $error_type);
1818: }
1819: }
1820:
1821:
1822: 1823: 1824: 1825:
1826: function _process_compiled_include_callback($match) {
1827: $_func = '_smarty_tplfunc_'.$match[2].'_'.$match[3];
1828: ob_start();
1829: $_func($this);
1830: $_ret = ob_get_contents();
1831: ob_end_clean();
1832: return $_ret;
1833: }
1834:
1835:
1836: 1837: 1838: 1839: 1840: 1841:
1842:
1843:
1844:
1845: function _smarty_include($params)
1846: {
1847: if ($this->debugging) {
1848: $_params = array();
1849: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1850: $debug_start_time = smarty_core_get_microtime($_params, $this);
1851: $this->_smarty_debug_info[] = array('type' => 'template',
1852: 'filename' => $params['smarty_include_tpl_file'],
1853: 'depth' => ++$this->_inclusion_depth);
1854: $included_tpls_idx = count($this->_smarty_debug_info) - 1;
1855: }
1856:
1857: $this->_tpl_vars = array_merge($this->_tpl_vars, $params['smarty_include_vars']);
1858:
1859:
1860:
1861: array_unshift($this->_config, $this->_config[0]);
1862:
1863: $_smarty_compile_path = $this->_get_compile_path($params['smarty_include_tpl_file']);
1864:
1865:
1866: if ($this->_is_compiled($params['smarty_include_tpl_file'], $_smarty_compile_path)
1867: || $this->_compile_resource($params['smarty_include_tpl_file'], $_smarty_compile_path))
1868: {
1869: include($_smarty_compile_path);
1870: }
1871:
1872:
1873: array_shift($this->_config);
1874:
1875: $this->_inclusion_depth--;
1876:
1877: if ($this->debugging) {
1878:
1879: $_params = array();
1880: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1881: $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $debug_start_time;
1882: }
1883:
1884: if ($this->caching) {
1885: $this->_cache_info['template'][$params['smarty_include_tpl_file']] = true;
1886: }
1887: }
1888:
1889:
1890: 1891: 1892: 1893: 1894:
1895: function &_smarty_cache_attrs($cache_serial, $count) {
1896: $_cache_attrs =& $this->_cache_info['cache_attrs'][$cache_serial][$count];
1897:
1898: if ($this->_cache_including) {
1899:
1900: $_return = current($_cache_attrs);
1901: next($_cache_attrs);
1902: return $_return;
1903:
1904: } else {
1905:
1906: $_cache_attrs[] = array();
1907: return $_cache_attrs[count($_cache_attrs)-1];
1908:
1909: }
1910:
1911: }
1912:
1913:
1914: 1915: 1916: 1917:
1918: function _include($filename, $once=false, $params=null)
1919: {
1920: if ($once) {
1921: return include_once($filename);
1922: } else {
1923: return include($filename);
1924: }
1925: }
1926:
1927:
1928: 1929: 1930: 1931:
1932: function _eval($code, $params=null)
1933: {
1934: return eval($code);
1935: }
1936:
1937: 1938: 1939: 1940: 1941: 1942:
1943: function _get_filter_name($function)
1944: {
1945: if (is_array($function)) {
1946: $_class_name = (is_object($function[0]) ?
1947: get_class($function[0]) : $function[0]);
1948: return $_class_name . '_' . $function[1];
1949: }
1950: else {
1951: return $function;
1952: }
1953: }
1954:
1955:
1956:
1957: }
1958:
1959:
1960:
1961: ?>
1962: