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.30';
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:
570: var $_filepaths_cache = array();
571:
572: 573: 574:
575: public function __construct()
576: {
577: $this->assign('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME']
578: : @$GLOBALS['HTTP_SERVER_VARS']['SCRIPT_NAME']);
579: }
580:
581: 582: 583: 584: 585: 586:
587: function assign($tpl_var, $value = null)
588: {
589: if (is_array($tpl_var)){
590: foreach ($tpl_var as $key => $val) {
591: if ($key != '') {
592: $this->_tpl_vars[$key] = $val;
593: }
594: }
595: } else {
596: if ($tpl_var != '')
597: $this->_tpl_vars[$tpl_var] = $value;
598: }
599: }
600:
601: 602: 603: 604: 605: 606:
607: function assign_by_ref($tpl_var, &$value)
608: {
609: if ($tpl_var != '')
610: $this->_tpl_vars[$tpl_var] = &$value;
611: }
612:
613: 614: 615: 616: 617: 618:
619: function append($tpl_var, $value=null, $merge=false)
620: {
621: if (is_array($tpl_var)) {
622:
623: foreach ($tpl_var as $_key => $_val) {
624: if ($_key != '') {
625: if(!@is_array($this->_tpl_vars[$_key])) {
626: settype($this->_tpl_vars[$_key],'array');
627: }
628: if($merge && is_array($_val)) {
629: foreach($_val as $_mkey => $_mval) {
630: $this->_tpl_vars[$_key][$_mkey] = $_mval;
631: }
632: } else {
633: $this->_tpl_vars[$_key][] = $_val;
634: }
635: }
636: }
637: } else {
638: if ($tpl_var != '' && isset($value)) {
639: if(!@is_array($this->_tpl_vars[$tpl_var])) {
640: settype($this->_tpl_vars[$tpl_var],'array');
641: }
642: if($merge && is_array($value)) {
643: foreach($value as $_mkey => $_mval) {
644: $this->_tpl_vars[$tpl_var][$_mkey] = $_mval;
645: }
646: } else {
647: $this->_tpl_vars[$tpl_var][] = $value;
648: }
649: }
650: }
651: }
652:
653: 654: 655: 656: 657: 658:
659: function append_by_ref($tpl_var, &$value, $merge=false)
660: {
661: if ($tpl_var != '' && isset($value)) {
662: if(!@is_array($this->_tpl_vars[$tpl_var])) {
663: settype($this->_tpl_vars[$tpl_var],'array');
664: }
665: if ($merge && is_array($value)) {
666: foreach($value as $_key => $_val) {
667: $this->_tpl_vars[$tpl_var][$_key] = &$value[$_key];
668: }
669: } else {
670: $this->_tpl_vars[$tpl_var][] = &$value;
671: }
672: }
673: }
674:
675:
676: 677: 678: 679: 680:
681: function clear_assign($tpl_var)
682: {
683: if (is_array($tpl_var))
684: foreach ($tpl_var as $curr_var)
685: unset($this->_tpl_vars[$curr_var]);
686: else
687: unset($this->_tpl_vars[$tpl_var]);
688: }
689:
690:
691: 692: 693: 694: 695: 696:
697: function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)
698: {
699: $this->_plugins['function'][$function] =
700: array($function_impl, null, null, false, $cacheable, $cache_attrs);
701:
702: }
703:
704: 705: 706: 707: 708:
709: function unregister_function($function)
710: {
711: unset($this->_plugins['function'][$function]);
712: }
713:
714: 715: 716: 717: 718: 719: 720: 721: 722:
723: function register_object($object, &$object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
724: {
725: settype($allowed, 'array');
726: settype($smarty_args, 'boolean');
727: $this->_reg_objects[$object] =
728: array(&$object_impl, $allowed, $smarty_args, $block_methods);
729: }
730:
731: 732: 733: 734: 735:
736: function unregister_object($object)
737: {
738: unset($this->_reg_objects[$object]);
739: }
740:
741:
742: 743: 744: 745: 746: 747:
748: function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)
749: {
750: $this->_plugins['block'][$block] =
751: array($block_impl, null, null, false, $cacheable, $cache_attrs);
752: }
753:
754: 755: 756: 757: 758:
759: function unregister_block($block)
760: {
761: unset($this->_plugins['block'][$block]);
762: }
763:
764: 765: 766: 767: 768: 769:
770: function register_compiler_function($function, $function_impl, $cacheable=true)
771: {
772: $this->_plugins['compiler'][$function] =
773: array($function_impl, null, null, false, $cacheable);
774: }
775:
776: 777: 778: 779: 780:
781: function unregister_compiler_function($function)
782: {
783: unset($this->_plugins['compiler'][$function]);
784: }
785:
786: 787: 788: 789: 790: 791:
792: function register_modifier($modifier, $modifier_impl)
793: {
794: $this->_plugins['modifier'][$modifier] =
795: array($modifier_impl, null, null, false);
796: }
797:
798: 799: 800: 801: 802:
803: function unregister_modifier($modifier)
804: {
805: unset($this->_plugins['modifier'][$modifier]);
806: }
807:
808: 809: 810: 811: 812: 813:
814: function register_resource($type, $functions)
815: {
816: if (count($functions)==4) {
817: $this->_plugins['resource'][$type] =
818: array($functions, false);
819:
820: } elseif (count($functions)==5) {
821: $this->_plugins['resource'][$type] =
822: array(array(array(&$functions[0], $functions[1])
823: ,array(&$functions[0], $functions[2])
824: ,array(&$functions[0], $functions[3])
825: ,array(&$functions[0], $functions[4]))
826: ,false);
827:
828: } else {
829: $this->trigger_error("malformed function-list for '$type' in register_resource");
830:
831: }
832: }
833:
834: 835: 836: 837: 838:
839: function unregister_resource($type)
840: {
841: unset($this->_plugins['resource'][$type]);
842: }
843:
844: 845: 846: 847: 848: 849:
850: function register_prefilter($function)
851: {
852: $this->_plugins['prefilter'][$this->_get_filter_name($function)]
853: = array($function, null, null, false);
854: }
855:
856: 857: 858: 859: 860:
861: function unregister_prefilter($function)
862: {
863: unset($this->_plugins['prefilter'][$this->_get_filter_name($function)]);
864: }
865:
866: 867: 868: 869: 870: 871:
872: function register_postfilter($function)
873: {
874: $this->_plugins['postfilter'][$this->_get_filter_name($function)]
875: = array($function, null, null, false);
876: }
877:
878: 879: 880: 881: 882:
883: function unregister_postfilter($function)
884: {
885: unset($this->_plugins['postfilter'][$this->_get_filter_name($function)]);
886: }
887:
888: 889: 890: 891: 892: 893:
894: function register_outputfilter($function)
895: {
896: $this->_plugins['outputfilter'][$this->_get_filter_name($function)]
897: = array($function, null, null, false);
898: }
899:
900: 901: 902: 903: 904:
905: function unregister_outputfilter($function)
906: {
907: unset($this->_plugins['outputfilter'][$this->_get_filter_name($function)]);
908: }
909:
910: 911: 912: 913: 914: 915:
916: function load_filter($type, $name)
917: {
918: switch ($type) {
919: case 'output':
920: $_params = array('plugins' => array(array($type . 'filter', $name, null, null, false)));
921: require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
922: smarty_core_load_plugins($_params, $this);
923: break;
924:
925: case 'pre':
926: case 'post':
927: if (!isset($this->_plugins[$type . 'filter'][$name]))
928: $this->_plugins[$type . 'filter'][$name] = false;
929: break;
930: }
931: }
932:
933: 934: 935: 936: 937: 938: 939: 940: 941:
942: function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
943: {
944:
945: if (!isset($compile_id))
946: $compile_id = $this->compile_id;
947:
948: if (!isset($tpl_file))
949: $compile_id = null;
950:
951: $_auto_id = $this->_get_auto_id($cache_id, $compile_id);
952:
953: if (!empty($this->cache_handler_func)) {
954: return call_user_func_array($this->cache_handler_func,
955: array('clear', &$this, &$dummy, $tpl_file, $cache_id, $compile_id, $exp_time));
956: } else {
957: $_params = array('auto_base' => $this->cache_dir,
958: 'auto_source' => $tpl_file,
959: 'auto_id' => $_auto_id,
960: 'exp_time' => $exp_time);
961: require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
962: return smarty_core_rm_auto($_params, $this);
963: }
964:
965: }
966:
967:
968: 969: 970: 971: 972: 973:
974: function clear_all_cache($exp_time = null)
975: {
976: return $this->clear_cache(null, null, null, $exp_time);
977: }
978:
979:
980: 981: 982: 983: 984: 985: 986: 987:
988: function is_cached($tpl_file, $cache_id = null, $compile_id = null)
989: {
990: if (!$this->caching)
991: return false;
992:
993: if (!isset($compile_id))
994: $compile_id = $this->compile_id;
995:
996: $_params = array(
997: 'tpl_file' => $tpl_file,
998: 'cache_id' => $cache_id,
999: 'compile_id' => $compile_id
1000: );
1001: require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
1002: return smarty_core_read_cache_file($_params, $this);
1003: }
1004:
1005:
1006: 1007: 1008: 1009:
1010: function clear_all_assign()
1011: {
1012: $this->_tpl_vars = array();
1013: }
1014:
1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024:
1025: function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
1026: {
1027: if (!isset($compile_id)) {
1028: $compile_id = $this->compile_id;
1029: }
1030: $_params = array('auto_base' => $this->compile_dir,
1031: 'auto_source' => $tpl_file,
1032: 'auto_id' => $compile_id,
1033: 'exp_time' => $exp_time,
1034: 'extensions' => array('.inc', '.php'));
1035: require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
1036: return smarty_core_rm_auto($_params, $this);
1037: }
1038:
1039: 1040: 1041: 1042: 1043: 1044:
1045: function template_exists($tpl_file)
1046: {
1047: $_params = array('resource_name' => $tpl_file, 'quiet'=>true, 'get_source'=>false);
1048: return $this->_fetch_resource_info($_params);
1049: }
1050:
1051: 1052: 1053: 1054: 1055: 1056: 1057:
1058: function &get_template_vars($name=null)
1059: {
1060: if(!isset($name)) {
1061: return $this->_tpl_vars;
1062: } elseif(isset($this->_tpl_vars[$name])) {
1063: return $this->_tpl_vars[$name];
1064: } else {
1065:
1066: $_tmp = null;
1067: return $_tmp;
1068: }
1069: }
1070:
1071: 1072: 1073: 1074: 1075: 1076: 1077:
1078: function &get_config_vars($name=null)
1079: {
1080: if(!isset($name) && is_array($this->_config[0])) {
1081: return $this->_config[0]['vars'];
1082: } else if(isset($this->_config[0]['vars'][$name])) {
1083: return $this->_config[0]['vars'][$name];
1084: } else {
1085:
1086: $_tmp = null;
1087: return $_tmp;
1088: }
1089: }
1090:
1091: 1092: 1093: 1094: 1095: 1096:
1097: function trigger_error($error_msg, $error_type = E_USER_WARNING)
1098: {
1099: $msg = htmlentities($error_msg);
1100: trigger_error("Smarty error: $msg", $error_type);
1101: }
1102:
1103:
1104: 1105: 1106: 1107: 1108: 1109: 1110:
1111: function display($resource_name, $cache_id = null, $compile_id = null)
1112: {
1113: $this->fetch($resource_name, $cache_id, $compile_id, true);
1114: }
1115:
1116: 1117: 1118: 1119: 1120: 1121: 1122: 1123:
1124: function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
1125: {
1126: static $_cache_info = array();
1127:
1128: $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
1129: ? $this->error_reporting : error_reporting() & ~E_NOTICE);
1130:
1131: if (!$this->debugging && $this->debugging_ctrl == 'URL') {
1132: $_query_string = $this->request_use_auto_globals ? $_SERVER['QUERY_STRING'] : $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING'];
1133: if (@strstr($_query_string, $this->_smarty_debug_id)) {
1134: if (@strstr($_query_string, $this->_smarty_debug_id . '=on')) {
1135:
1136: @setcookie('SMARTY_DEBUG', true);
1137: $this->debugging = true;
1138: } elseif (@strstr($_query_string, $this->_smarty_debug_id . '=off')) {
1139:
1140: @setcookie('SMARTY_DEBUG', false);
1141: $this->debugging = false;
1142: } else {
1143:
1144: $this->debugging = true;
1145: }
1146: } else {
1147: $this->debugging = (bool)($this->request_use_auto_globals ? @$_COOKIE['SMARTY_DEBUG'] : @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']);
1148: }
1149: }
1150:
1151: if ($this->debugging) {
1152:
1153: $_params = array();
1154: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1155: $_debug_start_time = smarty_core_get_microtime($_params, $this);
1156: $this->_smarty_debug_info[] = array('type' => 'template',
1157: 'filename' => $resource_name,
1158: 'depth' => 0);
1159: $_included_tpls_idx = count($this->_smarty_debug_info) - 1;
1160: }
1161:
1162: if (!isset($compile_id)) {
1163: $compile_id = $this->compile_id;
1164: }
1165:
1166: $this->_compile_id = $compile_id;
1167: $this->_inclusion_depth = 0;
1168:
1169: if ($this->caching) {
1170:
1171: array_push($_cache_info, $this->_cache_info);
1172: $this->_cache_info = array();
1173: $_params = array(
1174: 'tpl_file' => $resource_name,
1175: 'cache_id' => $cache_id,
1176: 'compile_id' => $compile_id,
1177: 'results' => null
1178: );
1179: require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
1180: if (smarty_core_read_cache_file($_params, $this)) {
1181: $_smarty_results = $_params['results'];
1182: if (!empty($this->_cache_info['insert_tags'])) {
1183: $_params = array('plugins' => $this->_cache_info['insert_tags']);
1184: require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
1185: smarty_core_load_plugins($_params, $this);
1186: $_params = array('results' => $_smarty_results);
1187: require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
1188: $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
1189: }
1190: if (!empty($this->_cache_info['cache_serials'])) {
1191: $_params = array('results' => $_smarty_results);
1192: require_once(SMARTY_CORE_DIR . 'core.process_compiled_include.php');
1193: $_smarty_results = smarty_core_process_compiled_include($_params, $this);
1194: }
1195:
1196:
1197: if ($display) {
1198: if ($this->debugging)
1199: {
1200:
1201: $_params = array();
1202: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1203: $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $_debug_start_time;
1204: require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
1205: $_smarty_results .= smarty_core_display_debug_console($_params, $this);
1206: }
1207: if ($this->cache_modified_check) {
1208: $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
1209: $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
1210: $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
1211: if (@count($this->_cache_info['insert_tags']) == 0
1212: && !$this->_cache_serials
1213: && $_gmt_mtime == $_last_modified_date) {
1214: if (php_sapi_name()=='cgi')
1215: header('Status: 304 Not Modified');
1216: else
1217: header('HTTP/1.1 304 Not Modified');
1218:
1219: } else {
1220: header('Last-Modified: '.$_gmt_mtime);
1221: echo $_smarty_results;
1222: }
1223: } else {
1224: echo $_smarty_results;
1225: }
1226: error_reporting($_smarty_old_error_level);
1227:
1228: $this->_cache_info = array_pop($_cache_info);
1229: return true;
1230: } else {
1231: error_reporting($_smarty_old_error_level);
1232:
1233: $this->_cache_info = array_pop($_cache_info);
1234: return $_smarty_results;
1235: }
1236: } else {
1237: $this->_cache_info['template'][$resource_name] = true;
1238: if ($this->cache_modified_check && $display) {
1239: header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
1240: }
1241: }
1242: }
1243:
1244:
1245: if (count($this->autoload_filters)) {
1246: foreach ($this->autoload_filters as $_filter_type => $_filters) {
1247: foreach ($_filters as $_filter) {
1248: $this->load_filter($_filter_type, $_filter);
1249: }
1250: }
1251: }
1252:
1253: $_smarty_compile_path = $this->_get_compile_path($resource_name);
1254:
1255:
1256:
1257: $_cache_including = $this->_cache_including;
1258: $this->_cache_including = false;
1259: if ($display && !$this->caching && count($this->_plugins['outputfilter']) == 0) {
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: } else {
1266: ob_start();
1267: if ($this->_is_compiled($resource_name, $_smarty_compile_path)
1268: || $this->_compile_resource($resource_name, $_smarty_compile_path))
1269: {
1270: include($_smarty_compile_path);
1271: }
1272: $_smarty_results = ob_get_contents();
1273: ob_end_clean();
1274:
1275: foreach ((array)$this->_plugins['outputfilter'] as $_output_filter) {
1276: $_smarty_results = call_user_func_array($_output_filter[0], array($_smarty_results, &$this));
1277: }
1278: }
1279:
1280: if ($this->caching) {
1281: $_params = array('tpl_file' => $resource_name,
1282: 'cache_id' => $cache_id,
1283: 'compile_id' => $compile_id,
1284: 'results' => $_smarty_results);
1285: require_once(SMARTY_CORE_DIR . 'core.write_cache_file.php');
1286: smarty_core_write_cache_file($_params, $this);
1287: require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
1288: $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
1289:
1290: if ($this->_cache_serials) {
1291:
1292: $_smarty_results = preg_replace('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!s'
1293: ,''
1294: ,$_smarty_results);
1295: }
1296:
1297: $this->_cache_info = array_pop($_cache_info);
1298: }
1299: $this->_cache_including = $_cache_including;
1300:
1301: if ($display) {
1302: if (isset($_smarty_results)) { echo $_smarty_results; }
1303: if ($this->debugging) {
1304:
1305: $_params = array();
1306: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1307: $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime($_params, $this) - $_debug_start_time);
1308: require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
1309: echo smarty_core_display_debug_console($_params, $this);
1310: }
1311: error_reporting($_smarty_old_error_level);
1312: return;
1313: } else {
1314: error_reporting($_smarty_old_error_level);
1315: if (isset($_smarty_results)) { return $_smarty_results; }
1316: }
1317: }
1318:
1319: 1320: 1321: 1322: 1323: 1324: 1325:
1326: function config_load($file, $section = null, $scope = 'global')
1327: {
1328: require_once($this->_get_plugin_filepath('function', 'config_load'));
1329: smarty_function_config_load(array('file' => $file, 'section' => $section, 'scope' => $scope), $this);
1330: }
1331:
1332: 1333: 1334: 1335: 1336: 1337:
1338: function &get_registered_object($name) {
1339: if (!isset($this->_reg_objects[$name]))
1340: $this->_trigger_fatal_error("'$name' is not a registered object");
1341:
1342: if (!is_object($this->_reg_objects[$name][0]))
1343: $this->_trigger_fatal_error("registered '$name' is not an object");
1344:
1345: return $this->_reg_objects[$name][0];
1346: }
1347:
1348: 1349: 1350: 1351: 1352:
1353: function clear_config($var = null)
1354: {
1355: if(!isset($var)) {
1356:
1357: $this->_config = array(array('vars' => array(),
1358: 'files' => array()));
1359: } else {
1360: unset($this->_config[0]['vars'][$var]);
1361: }
1362: }
1363:
1364: 1365: 1366: 1367: 1368: 1369: 1370:
1371: function _get_plugin_filepath($type, $name)
1372: {
1373: $_params = array('type' => $type, 'name' => $name);
1374: require_once(SMARTY_CORE_DIR . 'core.assemble_plugin_filepath.php');
1375: return smarty_core_assemble_plugin_filepath($_params, $this);
1376: }
1377:
1378: 1379: 1380: 1381: 1382: 1383: 1384:
1385: function _is_compiled($resource_name, $compile_path)
1386: {
1387: if (!$this->force_compile && file_exists($compile_path)) {
1388: if (!$this->compile_check) {
1389:
1390: return true;
1391: } else {
1392:
1393: $_params = array('resource_name' => $resource_name, 'get_source'=>false);
1394: if (!$this->_fetch_resource_info($_params)) {
1395: return false;
1396: }
1397: if ($_params['resource_timestamp'] <= filemtime($compile_path)) {
1398:
1399: return true;
1400: } else {
1401:
1402: return false;
1403: }
1404: }
1405: } else {
1406:
1407: return false;
1408: }
1409: }
1410:
1411: 1412: 1413: 1414: 1415: 1416: 1417:
1418: function _compile_resource($resource_name, $compile_path)
1419: {
1420:
1421: $_params = array('resource_name' => $resource_name);
1422: if (!$this->_fetch_resource_info($_params)) {
1423: return false;
1424: }
1425:
1426: $_source_content = $_params['source_content'];
1427: $_cache_include = substr($compile_path, 0, -4).'.inc';
1428:
1429: if ($this->_compile_source($resource_name, $_source_content, $_compiled_content, $_cache_include)) {
1430:
1431: if ($this->_cache_include_info) {
1432: require_once(SMARTY_CORE_DIR . 'core.write_compiled_include.php');
1433: smarty_core_write_compiled_include(array_merge($this->_cache_include_info, array('compiled_content'=>$_compiled_content, 'resource_name'=>$resource_name)), $this);
1434: }
1435:
1436: $_params = array('compile_path'=>$compile_path, 'compiled_content' => $_compiled_content);
1437: require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
1438: smarty_core_write_compiled_resource($_params, $this);
1439:
1440: return true;
1441: } else {
1442: return false;
1443: }
1444:
1445: }
1446:
1447: 1448: 1449: 1450: 1451: 1452: 1453: 1454:
1455: function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null)
1456: {
1457: if (file_exists(SMARTY_DIR . $this->compiler_file)) {
1458: require_once(SMARTY_DIR . $this->compiler_file);
1459: } else {
1460:
1461: require_once($this->compiler_file);
1462: }
1463:
1464:
1465: $smarty_compiler = new $this->compiler_class;
1466:
1467: $smarty_compiler->template_dir = $this->template_dir;
1468: $smarty_compiler->compile_dir = $this->compile_dir;
1469: $smarty_compiler->plugins_dir = $this->plugins_dir;
1470: $smarty_compiler->config_dir = $this->config_dir;
1471: $smarty_compiler->force_compile = $this->force_compile;
1472: $smarty_compiler->caching = $this->caching;
1473: $smarty_compiler->php_handling = $this->php_handling;
1474: $smarty_compiler->left_delimiter = $this->left_delimiter;
1475: $smarty_compiler->right_delimiter = $this->right_delimiter;
1476: $smarty_compiler->_version = $this->_version;
1477: $smarty_compiler->security = $this->security;
1478: $smarty_compiler->secure_dir = $this->secure_dir;
1479: $smarty_compiler->security_settings = $this->security_settings;
1480: $smarty_compiler->trusted_dir = $this->trusted_dir;
1481: $smarty_compiler->use_sub_dirs = $this->use_sub_dirs;
1482: $smarty_compiler->_reg_objects = &$this->_reg_objects;
1483: $smarty_compiler->_plugins = &$this->_plugins;
1484: $smarty_compiler->_tpl_vars = &$this->_tpl_vars;
1485: $smarty_compiler->default_modifiers = $this->default_modifiers;
1486: $smarty_compiler->compile_id = $this->_compile_id;
1487: $smarty_compiler->_config = $this->_config;
1488: $smarty_compiler->request_use_auto_globals = $this->request_use_auto_globals;
1489:
1490: if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) {
1491: $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path];
1492: }
1493: $smarty_compiler->_cache_include = $cache_include_path;
1494:
1495:
1496: $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content);
1497:
1498: if ($smarty_compiler->_cache_serial) {
1499: $this->_cache_include_info = array(
1500: 'cache_serial'=>$smarty_compiler->_cache_serial
1501: ,'plugins_code'=>$smarty_compiler->_plugins_code
1502: ,'include_file_path' => $cache_include_path);
1503:
1504: } else {
1505: $this->_cache_include_info = null;
1506:
1507: }
1508:
1509: return $_results;
1510: }
1511:
1512: 1513: 1514: 1515: 1516: 1517:
1518: function _get_compile_path($resource_name)
1519: {
1520: return $this->_get_auto_filename($this->compile_dir, $resource_name,
1521: $this->_compile_id) . '.php';
1522: }
1523:
1524: 1525: 1526: 1527: 1528: 1529: 1530: 1531: 1532: 1533: 1534: 1535: 1536:
1537:
1538: function _fetch_resource_info(&$params)
1539: {
1540: if(!isset($params['get_source'])) { $params['get_source'] = true; }
1541: if(!isset($params['quiet'])) { $params['quiet'] = false; }
1542:
1543: $_return = false;
1544: $_params = array('resource_name' => $params['resource_name']) ;
1545: if (isset($params['resource_base_path']))
1546: $_params['resource_base_path'] = $params['resource_base_path'];
1547: else
1548: $_params['resource_base_path'] = $this->template_dir;
1549:
1550: if ($this->_parse_resource_name($_params)) {
1551: $_resource_type = $_params['resource_type'];
1552: $_resource_name = $_params['resource_name'];
1553: switch ($_resource_type) {
1554: case 'file':
1555: if ($params['get_source']) {
1556: $params['source_content'] = $this->_read_file($_resource_name);
1557: }
1558: $params['resource_timestamp'] = filemtime($_resource_name);
1559: $_return = is_file($_resource_name) && is_readable($_resource_name);
1560: break;
1561:
1562: default:
1563:
1564: if ($params['get_source']) {
1565: $_source_return = isset($this->_plugins['resource'][$_resource_type]) &&
1566: call_user_func_array($this->_plugins['resource'][$_resource_type][0][0],
1567: array($_resource_name, &$params['source_content'], &$this));
1568: } else {
1569: $_source_return = true;
1570: }
1571:
1572: $_timestamp_return = isset($this->_plugins['resource'][$_resource_type]) &&
1573: call_user_func_array($this->_plugins['resource'][$_resource_type][0][1],
1574: array($_resource_name, &$params['resource_timestamp'], &$this));
1575:
1576: $_return = $_source_return && $_timestamp_return;
1577: break;
1578: }
1579: }
1580:
1581: if (!$_return) {
1582:
1583: if (!empty($this->default_template_handler_func)) {
1584: if (!is_callable($this->default_template_handler_func)) {
1585: $this->trigger_error("default template handler function \"$this->default_template_handler_func\" doesn't exist.");
1586: } else {
1587: $_return = call_user_func_array(
1588: $this->default_template_handler_func,
1589: array($_params['resource_type'], $_params['resource_name'], &$params['source_content'], &$params['resource_timestamp'], &$this));
1590: }
1591: }
1592: }
1593:
1594: if (!$_return) {
1595: if (!$params['quiet']) {
1596: $this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"');
1597: }
1598: } else if ($_return && $this->security) {
1599: require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
1600: if (!smarty_core_is_secure($_params, $this)) {
1601: if (!$params['quiet'])
1602: $this->trigger_error('(secure mode) accessing "' . $params['resource_name'] . '" is not allowed');
1603: $params['source_content'] = null;
1604: $params['resource_timestamp'] = null;
1605: return false;
1606: }
1607: }
1608: return $_return;
1609: }
1610:
1611:
1612: 1613: 1614: 1615: 1616: 1617: 1618: 1619: 1620:
1621:
1622: function _parse_resource_name(&$params)
1623: {
1624:
1625:
1626: $_resource_name_parts = explode(':', $params['resource_name'], 2);
1627:
1628: if (count($_resource_name_parts) == 1) {
1629:
1630: $params['resource_type'] = $this->default_resource_type;
1631: $params['resource_name'] = $_resource_name_parts[0];
1632: } else {
1633: if(strlen($_resource_name_parts[0]) == 1) {
1634:
1635: $params['resource_type'] = $this->default_resource_type;
1636: $params['resource_name'] = $params['resource_name'];
1637: } else {
1638: $params['resource_type'] = $_resource_name_parts[0];
1639: $params['resource_name'] = $_resource_name_parts[1];
1640: }
1641: }
1642:
1643: if ($params['resource_type'] == 'file') {
1644: if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $params['resource_name'])) {
1645:
1646:
1647: foreach ((array)$params['resource_base_path'] as $_curr_path) {
1648: $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name'];
1649: if (file_exists($_fullpath) && is_file($_fullpath)) {
1650: $params['resource_name'] = $_fullpath;
1651: return true;
1652: }
1653:
1654: $_params = array('file_path' => $_fullpath);
1655: require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
1656: if(smarty_core_get_include_path($_params, $this)) {
1657: $params['resource_name'] = $_params['new_file_path'];
1658: return true;
1659: }
1660: }
1661: return false;
1662: } else {
1663:
1664: return file_exists($params['resource_name']);
1665: }
1666: } elseif (empty($this->_plugins['resource'][$params['resource_type']])) {
1667: $_params = array('type' => $params['resource_type']);
1668: require_once(SMARTY_CORE_DIR . 'core.load_resource_plugin.php');
1669: smarty_core_load_resource_plugin($_params, $this);
1670: }
1671:
1672: return true;
1673: }
1674:
1675:
1676: 1677: 1678: 1679: 1680: 1681: 1682:
1683: function _run_mod_handler()
1684: {
1685: $_args = func_get_args();
1686: list($_modifier_name, $_map_array) = array_splice($_args, 0, 2);
1687: list($_func_name, $_tpl_file, $_tpl_line) =
1688: $this->_plugins['modifier'][$_modifier_name];
1689:
1690: $_var = $_args[0];
1691: foreach ($_var as $_key => $_val) {
1692: $_args[0] = $_val;
1693: $_var[$_key] = call_user_func_array($_func_name, $_args);
1694: }
1695: return $_var;
1696: }
1697:
1698: 1699: 1700: 1701: 1702: 1703:
1704: function _dequote($string)
1705: {
1706: if ((substr($string, 0, 1) == "'" || substr($string, 0, 1) == '"') &&
1707: substr($string, -1) == substr($string, 0, 1))
1708: return substr($string, 1, -1);
1709: else
1710: return $string;
1711: }
1712:
1713:
1714: 1715: 1716: 1717: 1718: 1719:
1720: function _read_file($filename)
1721: {
1722: if ( file_exists($filename) && is_readable($filename) && ($fd = @fopen($filename, 'rb')) ) {
1723: $contents = '';
1724: while (!feof($fd)) {
1725: $contents .= fread($fd, 8192);
1726: }
1727: fclose($fd);
1728: return $contents;
1729: } else {
1730: return false;
1731: }
1732: }
1733:
1734: 1735: 1736: 1737: 1738: 1739: 1740: 1741: 1742: 1743:
1744: function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null)
1745: {
1746: $_compile_dir_sep = $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
1747: $_return = $auto_base . DIRECTORY_SEPARATOR;
1748:
1749: if(isset($auto_id)) {
1750:
1751: $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id)));
1752:
1753: $_return .= $auto_id . $_compile_dir_sep;
1754: }
1755:
1756: if(isset($auto_source)) {
1757:
1758: $_filename = urlencode(basename($auto_source));
1759: $_crc32 = sprintf('%08X', crc32($auto_source));
1760:
1761:
1762: $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
1763: substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
1764: $_return .= '%%' . $_crc32 . '%%' . $_filename;
1765: }
1766:
1767: return $_return;
1768: }
1769:
1770: 1771: 1772: 1773: 1774: 1775:
1776: function _unlink($resource, $exp_time = null)
1777: {
1778: if(isset($exp_time)) {
1779: if(time() - @filemtime($resource) >= $exp_time) {
1780: return @unlink($resource);
1781: }
1782: } else {
1783: return @unlink($resource);
1784: }
1785: }
1786:
1787: 1788: 1789: 1790: 1791: 1792: 1793:
1794: function _get_auto_id($cache_id=null, $compile_id=null) {
1795: if (isset($cache_id))
1796: return (isset($compile_id)) ? $cache_id . '|' . $compile_id : $cache_id;
1797: elseif(isset($compile_id))
1798: return $compile_id;
1799: else
1800: return null;
1801: }
1802:
1803: 1804: 1805: 1806: 1807: 1808: 1809: 1810: 1811: 1812:
1813: function _trigger_fatal_error($error_msg, $tpl_file = null, $tpl_line = null,
1814: $file = null, $line = null, $error_type = E_USER_ERROR)
1815: {
1816: if(isset($file) && isset($line)) {
1817: $info = ' ('.basename($file).", line $line)";
1818: } else {
1819: $info = '';
1820: }
1821: if (isset($tpl_line) && isset($tpl_file)) {
1822: $this->trigger_error('[in ' . $tpl_file . ' line ' . $tpl_line . "]: $error_msg$info", $error_type);
1823: } else {
1824: $this->trigger_error($error_msg . $info, $error_type);
1825: }
1826: }
1827:
1828:
1829: 1830: 1831: 1832:
1833: function _process_compiled_include_callback($match) {
1834: $_func = '_smarty_tplfunc_'.$match[2].'_'.$match[3];
1835: ob_start();
1836: $_func($this);
1837: $_ret = ob_get_contents();
1838: ob_end_clean();
1839: return $_ret;
1840: }
1841:
1842:
1843: 1844: 1845: 1846: 1847: 1848:
1849:
1850:
1851:
1852: function _smarty_include($params)
1853: {
1854: if ($this->debugging) {
1855: $_params = array();
1856: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1857: $debug_start_time = smarty_core_get_microtime($_params, $this);
1858: $this->_smarty_debug_info[] = array('type' => 'template',
1859: 'filename' => $params['smarty_include_tpl_file'],
1860: 'depth' => ++$this->_inclusion_depth);
1861: $included_tpls_idx = count($this->_smarty_debug_info) - 1;
1862: }
1863:
1864: $this->_tpl_vars = array_merge($this->_tpl_vars, $params['smarty_include_vars']);
1865:
1866:
1867:
1868: array_unshift($this->_config, $this->_config[0]);
1869:
1870: $_smarty_compile_path = $this->_get_compile_path($params['smarty_include_tpl_file']);
1871:
1872:
1873: if ($this->_is_compiled($params['smarty_include_tpl_file'], $_smarty_compile_path)
1874: || $this->_compile_resource($params['smarty_include_tpl_file'], $_smarty_compile_path))
1875: {
1876: include($_smarty_compile_path);
1877: }
1878:
1879:
1880: array_shift($this->_config);
1881:
1882: $this->_inclusion_depth--;
1883:
1884: if ($this->debugging) {
1885:
1886: $_params = array();
1887: require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
1888: $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $debug_start_time;
1889: }
1890:
1891: if ($this->caching) {
1892: $this->_cache_info['template'][$params['smarty_include_tpl_file']] = true;
1893: }
1894: }
1895:
1896:
1897: 1898: 1899: 1900: 1901:
1902: function &_smarty_cache_attrs($cache_serial, $count) {
1903: $_cache_attrs =& $this->_cache_info['cache_attrs'][$cache_serial][$count];
1904:
1905: if ($this->_cache_including) {
1906:
1907: $_return = current($_cache_attrs);
1908: next($_cache_attrs);
1909: return $_return;
1910:
1911: } else {
1912:
1913: $_cache_attrs[] = array();
1914: return $_cache_attrs[count($_cache_attrs)-1];
1915:
1916: }
1917:
1918: }
1919:
1920:
1921: 1922: 1923: 1924:
1925: function _include($filename, $once=false, $params=null)
1926: {
1927: if ($once) {
1928: return include_once($filename);
1929: } else {
1930: return include($filename);
1931: }
1932: }
1933:
1934:
1935: 1936: 1937: 1938:
1939: function _eval($code, $params=null)
1940: {
1941: return eval($code);
1942: }
1943:
1944: 1945: 1946: 1947: 1948: 1949:
1950: function _get_filter_name($function)
1951: {
1952: if (is_array($function)) {
1953: $_class_name = (is_object($function[0]) ?
1954: get_class($function[0]) : $function[0]);
1955: return $_class_name . '_' . $function[1];
1956: }
1957: else {
1958: return $function;
1959: }
1960: }
1961:
1962:
1963:
1964: }
1965:
1966:
1967:
1968: ?>
1969: