⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smarty_compiler.class.php

📁 转载中国源码下载站 1) 基于PHP语言开发,MYSQL数据库驱动的多用户留言本 2) 采用PHP官方提供的编译模板引擎smarty 3) 代码、页面分离
💻 PHP
📖 第 1 页 / 共 5 页
字号:
            $output .= 'while ($_block_repeat) { ob_start(); ?>';        } else {            $output = '<?php $this->_block_content = ob_get_contents(); ob_end_clean(); ';            $_out_tag_text = $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], $this->_block_content, $this, $_block_repeat=false)';            if ($tag_modifier != '') {                $this->_parse_modifiers($_out_tag_text, $tag_modifier);            }            $output .= 'echo '.$_out_tag_text.'; } ';			$output .= " array_pop(\$this->_tag_stack); " . $this->_pop_cacheable_state('block', $tag_command) . '?>';        }        return true;    }	/**	 * compile custom function tag	 *	 * @param string $tag_command	 * @param string $tag_args	 * @param string $tag_modifier     * @return string	 */    function _compile_custom_tag($tag_command, $tag_args, $tag_modifier)    {		        $this->_add_plugin('function', $tag_command);        $_cacheable_state = $this->_push_cacheable_state('function', $tag_command);        $attrs = $this->_parse_attrs($tag_args);        $arg_list = $this->_compile_arg_list('function', $tag_command, $attrs, $_cache_attrs='');	    $_return = $this->_compile_plugin_call('function', $tag_command).'(array('.implode(',', $arg_list)."), \$this)";		if($tag_modifier != '') {			$this->_parse_modifiers($_return, $tag_modifier);		}        		if($_return != '') {            $_return =  '<?php ' . $_cacheable_state . $_cache_attrs . 'echo ' . $_return . ';'                . $this->_pop_cacheable_state('function', $tag_command) . "?>" . $this->_additional_newline;		}        		return $_return;     }	/**	 * compile a registered object tag	 *	 * @param string $tag_command	 * @param array $attrs	 * @param string $tag_modifier     * @return string	 */    function _compile_registered_object_tag($tag_command, $attrs, $tag_modifier)    {        if ($tag_command{0} == '/') {            $start_tag = false;            $tag_command = substr($tag_command, 1);        } else {            $start_tag = true;        }		list($object, $obj_comp) = explode('->', $tag_command);        $arg_list = array();		if(count($attrs)) {			$_assign_var = false;        	foreach ($attrs as $arg_name => $arg_value) {				if($arg_name == 'assign') {					$_assign_var = $arg_value;					unset($attrs['assign']);					continue;				}            	if (is_bool($arg_value))                	$arg_value = $arg_value ? 'true' : 'false';            	$arg_list[] = "'$arg_name' => $arg_value";        	}		}				        if($this->_reg_objects[$object][2]) {            // smarty object argument format            $args = "array(".implode(',', (array)$arg_list)."), \$this";        } else {            // traditional argument format            $args = implode(',', array_values($attrs));            if (empty($args)) {                $args = 'null';            }        }        $prefix = '';        $postfix = '';        $newline = '';		if(!is_object($this->_reg_objects[$object][0])) {			$this->_trigger_fatal_error("registered '$object' is not an object");		} elseif(!empty($this->_reg_objects[$object][1]) && !in_array($obj_comp, $this->_reg_objects[$object][1])) {			$this->_trigger_fatal_error("'$obj_comp' is not a registered component of object '$object'");		} elseif(method_exists($this->_reg_objects[$object][0], $obj_comp)) {			// method            if(in_array($obj_comp, $this->_reg_objects[$object][3])) {                // block method                 if ($start_tag) {                    $prefix = "\$this->_tag_stack[] = array('$obj_comp', $args); ";                    $prefix .= "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], null, \$this, \$_block_repeat=true); ";                    $prefix .= "while (\$_block_repeat) { ob_start();";                    $return = null;                    $postfix = '';			} else {                    $prefix = "\$this->_obj_block_content = ob_get_contents(); ob_end_clean(); ";                    $return = "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], \$this->_obj_block_content, \$this, \$_block_repeat=false)";                    $postfix = "} array_pop(\$this->_tag_stack);";                }            } else {                // non-block method                $return = "\$this->_reg_objects['$object'][0]->$obj_comp($args)";			}		} else {			// property			$return = "\$this->_reg_objects['$object'][0]->$obj_comp";		}        if($return != null) {            if($tag_modifier != '') {                $this->_parse_modifiers($return, $tag_modifier);            }            if(!empty($_assign_var)) {                $output = "\$this->assign('" . $this->_dequote($_assign_var) ."',  $return);";            } else {                $output = 'echo ' . $return . ';';                $newline = $this->_additional_newline;            }        } else {            $output = '';        }        return '<?php ' . $prefix . $output . $postfix . "?>" . $newline;    }	/**	 * Compile {insert ...} tag	 *	 * @param string $tag_args     * @return string	 */    function _compile_insert_tag($tag_args)    {        $attrs = $this->_parse_attrs($tag_args);        $name = $this->_dequote($attrs['name']);        if (empty($name)) {            $this->_syntax_error("missing insert name", E_USER_ERROR, __FILE__, __LINE__);        }        if (!empty($attrs['script'])) {            $delayed_loading = true;        } else {            $delayed_loading = false;					}        foreach ($attrs as $arg_name => $arg_value) {            if (is_bool($arg_value))                $arg_value = $arg_value ? 'true' : 'false';            $arg_list[] = "'$arg_name' => $arg_value";        }        $this->_add_plugin('insert', $name, $delayed_loading);		$_params = "array('args' => array(".implode(', ', (array)$arg_list)."))";		        return "<?php require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.run_insert_handler.php');\necho smarty_core_run_insert_handler($_params, \$this); ?>" . $this->_additional_newline;    }	/**	 * Compile {include ...} tag	 *	 * @param string $tag_args     * @return string	 */    function _compile_include_tag($tag_args)    {        $attrs = $this->_parse_attrs($tag_args);        $arg_list = array();        if (empty($attrs['file'])) {            $this->_syntax_error("missing 'file' attribute in include tag", E_USER_ERROR, __FILE__, __LINE__);        }        foreach ($attrs as $arg_name => $arg_value) {            if ($arg_name == 'file') {                $include_file = $arg_value;                continue;            } else if ($arg_name == 'assign') {                $assign_var = $arg_value;                continue;            }            if (is_bool($arg_value))                $arg_value = $arg_value ? 'true' : 'false';            $arg_list[] = "'$arg_name' => $arg_value";        }        $output = '<?php ';        if (isset($assign_var)) {			$output .= "ob_start();\n";        }        $output .=              "\$_smarty_tpl_vars = \$this->_tpl_vars;\n";						$_params = "array('smarty_include_tpl_file' => " . $include_file . ", 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))";		$output .= "\$this->_smarty_include($_params);\n" .        "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" .        "unset(\$_smarty_tpl_vars);\n";        if (isset($assign_var)) {			$output .= "\$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n";        }        $output .= ' ?>';		return $output;    }	/**	 * Compile {include ...} tag	 *	 * @param string $tag_args     * @return string	 */    function _compile_include_php_tag($tag_args)    {        $attrs = $this->_parse_attrs($tag_args);        if (empty($attrs['file'])) {            $this->_syntax_error("missing 'file' attribute in include_php tag", E_USER_ERROR, __FILE__, __LINE__);        }        $assign_var = $this->_dequote($attrs['assign']);				$once_var = ( $attrs['once'] == 'false' ) ? 'false' : 'true';		    	foreach($attrs as $arg_name => $arg_value) {        	if($arg_name != 'file' AND $arg_name != 'once' AND $arg_name != 'assign') {            	if(is_bool($arg_value))                	$arg_value = $arg_value ? 'true' : 'false';            	$arg_list[] = "'$arg_name' => $arg_value";        	}    	}    	$_params = "array('smarty_file' => " . $attrs['file'] . ", 'smarty_assign' => '$assign_var', 'smarty_once' => $once_var, 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))";				return "<?php require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 'core.smarty_include_php.php');\nsmarty_core_smarty_include_php($_params, \$this); ?>" . $this->_additional_newline;    }		/**	 * Compile {section ...} tag	 *	 * @param string $tag_args     * @return string	 */    function _compile_section_start($tag_args)    {        $attrs = $this->_parse_attrs($tag_args);        $arg_list = array();        $output = '<?php ';        $section_name = $attrs['name'];        if (empty($section_name)) {            $this->_syntax_error("missing section name", E_USER_ERROR, __FILE__, __LINE__);        }        $output .= "if (isset(\$this->_sections[$section_name])) unset(\$this->_sections[$section_name]);\n";        $section_props = "\$this->_sections[$section_name]";        foreach ($attrs as $attr_name => $attr_value) {            switch ($attr_name) {                case 'loop':                    $output .= "{$section_props}['loop'] = is_array(\$_loop=$attr_value) ? count(\$_loop) : max(0, (int)\$_loop); unset(\$_loop);\n";                    break;                case 'show':                    if (is_bool($attr_value))                        $show_attr_value = $attr_value ? 'true' : 'false';                    else                        $show_attr_value = "(bool)$attr_value";                    $output .= "{$section_props}['show'] = $show_attr_value;\n";                    break;                case 'name':                    $output .= "{$section_props}['$attr_name'] = $attr_value;\n";                    break;                case 'max':                case 'start':                    $output .= "{$section_props}['$attr_name'] = (int)$attr_value;\n";                    break;                case 'step':                    $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n";                    break;                default:                    $this->_syntax_error("unknown section attribute - '$attr_name'", E_USER_ERROR, __FILE__, __LINE__);                    break;            }        }        if (!isset($attrs['show']))            $output .= "{$section_props}['show'] = true;\n";        if (!isset($attrs['loop']))            $output .= "{$section_props}['loop'] = 1;\n";        if (!isset($attrs['max']))            $output .= "{$section_props}['max'] = {$section_props}['loop'];\n";        else            $output .= "if ({$section_props}['max'] < 0)\n" .                       "    {$section_props}['max'] = {$section_props}['loop'];\n";        if (!isset($attrs['step']))            $output .= "{$section_props}['step'] = 1;\n";        if (!isset($attrs['start']))            $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n";        else {            $output .= "if ({$section_props}['start'] < 0)\n" .                       "    {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" .                       "else\n" .                       "    {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n";        }        $output .= "if ({$section_props}['show']) {\n";        if (!isset($attrs['start']) && !isset($attrs['step']) && !isset($attrs['max'])) {            $output .= "    {$section_props}['total'] = {$section_props}['loop'];\n";        } else {            $output .= "    {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n";        }        $output .= "    if ({$section_props}['total'] == 0)\n" .                   "        {$section_props}['show'] = false;\n" .                   "} else\n" .                   "    {$section_props}['total'] = 0;\n";        $output .= "if ({$section_props}['show']):\n";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -