Login登陆
Login.html
<DTD…>
<html>
<head></head>
<body>
<formmethod name>
Action为空或者删掉
Action:默认将数据发给当前执行文件
Action指向那个文件
</body>
</html>
Login.php
<?php
……
$tpl->display(“login.html”);
?>
http://…/login.php---执行文件(templates_c/)编译后文件的作用
配置文件
给用户提供一个可选风格下拉菜单
*.html
<select>
<option>卡通风格</option>
<option>浪漫风格</option>
</select>
<{config_loadfile= section=}>
{mytag item='fields'}
{$fields.f1} -- {$fields.f2} <br />
{/mytag}
要实现上面标签,关键是两点:
1、把 mytag 输出的数组输化为 foreach ($arr as $fields) {
2、把 {/mytag} 替换为 ' } '
{$fields.f1} -- {$fields.f2} 这部份任由默认的smarty编译,它实际上得到的源码应该是
<?php echo $this->_tpl_vars['fields']['f1']; ?> -- <?php echo $this->_tpl_vars['fields']['f2']; ?>
这里是不需要我们去理会的,因此关键还是在1、2两点。
由于这种标签是肯定和block相冲突的,所以这里用前缀对自定义标签分开,这里就用dd吧,不过不能用 dd: 而是用 dd_。
即是:
{dd_mytag item='fields'}
{$fields.f1} -- {$fields.f2} <br />
{/dd_mytag}
首先我们打开 Smarty_Compiler.class.php
找到:function _compile_tag
关键部份是在
default:
if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) {
return $output;
} else if ($this->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) {
return $output;
} else if ($this->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) {
return $output;
} else {
$this->_syntax_error("unrecognized tag '$tag_command'", E_USER_ERROR, __FILE__, __LINE__);
}
这里首先对 dd_ 前缀的标签进行拦截
default:
$first = substr($tag_command, 0, 4);
if( preg_match('/^(dd|\/dd)_/', $first) && $this->_compile_myblock_tag($tag_command, $tag_args, $output) ) {
return $output;
} else if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) {
return $output;
} else if ($this->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) {
return $output;
} else if ($this->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) {
return $output;
} else {
$this->_syntax_error("unrecognized tag '$tag_command'", E_USER_ERROR, __FILE__, __LINE__);
}
然后 $this->_compile_myblock_tag($tag_command, $tag_args, $output) 就是我们要实现的关键代码了
_compile_myblock_tag函数具体如下:
/**
* 类似dede风格的块标签(块名称需要用 dd_ 开头)
*
* sets $output to the compiled custom compiler tag
* @param string $tag_command
* @param string $tag_args
* @param string $output
* @return boolean
*/
function _compile_myblock_tag($tag_command, $tag_args, &$output)
{
if( substr($tag_command, 0, 1) == '/' )
{
$output = '<?php } ?>';
return true;
}
$found = false;
$have_function = true;
if (isset($this->_plugins['myblock'][$tag_command]))
{
$found = true;
$plugin_func = $this->_plugins['myblock'][$tag_command][0];
if (!is_callable($plugin_func)) {
$message = "compiler function '$tag_command' is not implemented";
$have_function = false;
}
}
else if ($plugin_file = $this->_get_plugin_filepath('myblock', $tag_command))
{
$found = true;
include_once $plugin_file;
$plugin_func = 'smarty_myblock_' . $tag_command;
if (!is_callable($plugin_func)) {
$message = "plugin function $plugin_func() not found in $plugin_file\n";
$have_function = false;
} else {
$this->_plugins['myblock'][$tag_command] = array($plugin_func, null, null, null, true);
}
}
if ($found)
{
if ($have_function)
{
$this->_add_plugin('myblock', $tag_command);
$attrs = $this->_parse_attrs($tag_args);
$_cache_attrs = '';
$arg_list = $this->_compile_arg_list('myblock', $tag_command, $attrs, $_cache_attrs);
$output = '<?php '." \${$tag_command} = smarty_myblock_{$tag_command}(array(".implode(',', $arg_list)."), \$this);\n";
$fieldname = empty($attrs['item']) ? 'field' : $attrs['item'];
$fieldname = preg_replace('/["\']/', '', $fieldname);
$output .= "foreach( \${$tag_command} as \$this->_tpl_vars['key']=>\$this->_tpl_vars['".$fieldname."'] )\n{\n";
$output .= '?>';
} else {
$this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
}
return true;
} else {
return false;
}
}