PHP——smarty模板(第二天)
Test.php
<?php //加载初始化文件 require "init.inc.php"; $smarty->assign("data",array(1,2,3,4,5)); $smarty->assign("aa",6); $smarty->assign("attrr",array(1,2,3,4,5,6)); include("page.class.php"); //用assign()方法将变量植入到模板内 $smarty->assign("title","测试网页"); $page = new Page(11,5,"",true); //1.造连接对象 $db = new mysqli("localhost","root","123","mydb"); !mysqli_connect_error() or die("连接失败!"); //or: echo "连接失败!";exit; //3.写SQL语句 $sql = "select * from Info ".$page->limit; //4.执行SQL语句 $result = $db->query($sql); //5.处理数据(提取数据) $attr = $result->fetch_all(); $smarty->assign("attr",$attr); //print_r($attr); $str = $page->fpage(); $smarty->assign("page",$str); //用smarty对象中的display()方法将网页输出 $smarty->display("Test.html"); ?>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?php define("ROOT",str_replace("\\","/",dirname(__FILE__)).'/'); //常量ROOT中指定项目根目录 require ROOT.'libs/Smarty.class.php'; //加载Smarty类文件 $smarty = new Smarty(); //实例化Smarty对象<br> //$smarty -> auto_literal = false; //就可以让定界符号使用空格 $smarty->setTemplateDir(ROOT.'templates/'); //设置所有模板文件存放位置 //$smarty->addTemplateDir(ROOT.'templates2/'); //添加一个模板文件夹 $smarty->setCompileDir(ROOT.'templates_c/'); //设置编译过的模板存放的目录 $smarty->addPluginsDir(ROOT.'plugins/'); //设置为模板扩充插件存放目录 $smarty->setCacheDir(ROOT.'cache/'); //设置缓存文件存放目录 $smarty->setConfigDir(ROOT.'configs'); //设置模板配置文件存放目录 $smarty->caching = false; //设置Smarty缓存开关功能 $smarty->cache_lifetime = 60*60*24; //设置缓存模板有效时间一天 $smarty->left_delimiter = '<{'; //设置模板语言中的左结束符 $smarty->right_delimiter = '}>'; //设置模板语言中的右结束符 ?>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 private $listRows; //每页显示行数 private $limit; //SQL语句使用limit从句,限制获取记录个数 private $uri; //自动获取url的请求地址 private $pageNum; //总页数 private $page; //当前页 private $config = array( 'head' => "条记录", 'prev' => "上一页", 'next' => "下一页", 'first'=> "首页", 'last' => "末页" ); //在分页信息中显示内容,可以自己通过set()方法设置 private $listNum = 10; //默认分页列表显示的个数 /** 构造方法,可以设置分页类的属性 @param int $total 计算分页的总记录数 @param int $listRows 可选的,设置每页需要显示的记录数,默认为25条 @param mixed $query 可选的,为向目标页面传递参数,可以是数组,也可以是查询字符串格式 @param bool $ord 可选的,默认值为true, 页面从第一页开始显示,false则为最后一页 */ public function __construct($total, $listRows=25, $query="", $ord=true){ $this->total = $total; $this->listRows = $listRows; $this->uri = $this->getUri($query); $this->pageNum = ceil($this->total / $this->listRows); /*以下判断用来设置当前面*/ if(!empty($_GET["page"])) { $page = $_GET["page"]; }else{ if($ord) $page = 1; else $page = $this->pageNum; } if($total > 0) { if(preg_match('/\D/', $page) ){ $this->page = 1; }else{ $this->page = $page; } }else{ $this->page = 0; } $this->limit = "LIMIT ".$this->setLimit(); } /** 用于设置显示分页的信息,可以进行连贯操作 @param string $param 是成员属性数组config的下标 @param string $value 用于设置config下标对应的元素值 @return object 返回本对象自己$this, 用于连惯操作 */ function set($param, $value){ if(array_key_exists($param, $this->config)){ $this->config[$param] = $value; } return $this; } /* 不是直接去调用,通过该方法,可以使用在对象外部直接获取私有成员属性limit和page的值 */ function __get($args){ if($args == "limit" || $args == "page") return $this->$args; else return null; } /** 按指定的格式输出分页 @param int 0-7的数字分别作为参数,用于自定义输出分页结构和调整结构的顺序,默认输出全部结构 @return string 分页信息内容 */ function fpage(){ $arr = func_get_args(); $html[0] = "<span class='p1'> 共<b> {$this->total} </b>{$this->config["head"]} </span>"; $html[1] = " 本页 <b>".$this->disnum()."</b> 条 "; $html[2] = " 本页从 <b>{$this->start()}-{$this->end()}</b> 条 "; $html[3] = " <b>{$this->page}/{$this->pageNum}</b>页 "; $html[4] = $this->firstprev(); $html[5] = $this->pageList(); $html[6] = $this->nextlast(); $html[7] = $this->goPage(); $fpage = '<div style="font:12px \'\5B8B\4F53\',san-serif;">'; if(count($arr) < 1) $arr = array(0, 1,2,3,4,5,6,7); for($i = 0; $i < count($arr); $i++) $fpage .= $html[$arr[$i]]; $fpage .= '</div>'; return $fpage; } /* 在对象内部使用的私有方法,*/ private function setLimit(){ if($this->page > 0) return ($this->page-1)*$this->listRows.", {$this->listRows}"; else return 0; } /* 在对象内部使用的私有方法,用于自动获取访问的当前URL */ private function getUri($query){ $request_uri = $_SERVER["REQUEST_URI"]; $url = strstr($request_uri,'?') ? $request_uri : $request_uri.'?'; if(is_array($query)) $url .= http_build_query($query); else if($query != "") $url .= "&".trim($query, "?&"); $arr = parse_url($url); if(isset($arr["query"])){ parse_str($arr["query"], $arrs); unset($arrs["page"]); $url = $arr["path"].'?'.http_build_query($arrs); } if(strstr($url, '?')) { if(substr($url, -1)!='?') $url = $url.'&'; }else{ $url = $url.'?'; } return $url; } /* 在对象内部使用的私有方法,用于获取当前页开始的记录数 */ private function start(){ if($this->total == 0) return 0; else return ($this->page-1) * $this->listRows+1; } /* 在对象内部使用的私有方法,用于获取当前页结束的记录数 */ private function end(){ return min($this->page * $this->listRows, $this->total); } /* 在对象内部使用的私有方法,用于获取上一页和首页的操作信息 */ private function firstprev(){ if($this->page > 1) { $str = " <a href='{$this->uri}page=1'>{$this->config["first"]}</a> "; $str .= "<a href='{$this->uri}page=".($this->page-1)."'>{$this->config["prev"]}</a> "; return $str; } } /* 在对象内部使用的私有方法,用于获取页数列表信息 */ private function pageList(){ $linkPage = " <b>"; $inum = floor($this->listNum/2); /*当前页前面的列表 */ for($i = $inum; $i >= 1; $i--){ $page = $this->page-$i; if($page >= 1) $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> "; } /*当前页的信息 */ if($this->pageNum > 1) $linkPage .= "<span style='padding:1px 2px;background:#BBB;color:white'>{$this->page}</span> "; /*当前页后面的列表 */ for($i=1; $i <= $inum; $i++){ $page = $this->page+$i; if($page <= $this->pageNum) $linkPage .= "<a href='{$this->uri}page={$page}'>{$page}</a> "; else break; } $linkPage .= '</b>'; return $linkPage; } /* 在对象内部使用的私有方法,获取下一页和尾页的操作信息 */ private function nextlast(){ if($this->page != $this->pageNum) { $str = " <a href='{$this->uri}page=".($this->page+1)."'>{$this->config["next"]}</a> "; $str .= " <a href='{$this->uri}page=".($this->pageNum)."'>{$this->config["last"]}</a> "; return $str; } } /* 在对象内部使用的私有方法,用于显示和处理表单跳转页面 */ private function goPage(){ if($this->pageNum > 1) { return ' <input style="width:20px;height:17px !important;height:18px;border:1px solid #CCCCCC;" type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'page=\'+page+\'\'}" value="'.$this->page.'"><input style="cursor:pointer;width:25px;height:18px;border:1px solid #CCCCCC;" type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'page=\'+page+\'\'"> '; } } /* 在对象内部使用的私有方法,用于获取本页显示的记录条数 */ private function disnum(){ if($this->total > 0){ return $this->end()-$this->start()+1; }else{ return 0; } } }
Test.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><{$title}></title> </head> <body> <!--系统自带函数--> <{html_select_date start_year="2000" end_year="2020"}><!--普通函数日期--> <{textformat}><{/textformat}><!--去空格--> <{html_table loop=$data cols=2}><!--表格--> <!--自定义函数--> <!--function.hello.php plugins目录下--> <{hello}> <!--自定义块--> <!--block.style.php--> <{style}><!--开始时--> aa <{/style}><!--结束时--> <{color name="color"}> <{date name="date" value="2016-3-13" time=true}> <{textarea name="text" toolbar="full"}> <{/textarea}> <{capture name="one"}> <div><{$title}></div> <div><{$title}></div> <div><{$title}></div> <div><{$title}></div> <{/capture}> <{$smarty.capture.one}> <{if $aa==5}> 555555 <{else}> 66666 <{/if}> <{for $i=0 to 10 step=2 max=4}> <{$i}> <{forelse}><!--循环失败执行的语句--> 555555 <{/for}> <{foreach $attrr as $key=>$values}> <{$key}>-><{$values}> <{/foreach}> <table border="1" cellpadding="0" cellspacing="0" width="100%"> <tr> <td>代号</td> <td>姓名</td> <td>性别</td> <td>民族</td> <td>生日</td> </tr> <{foreach $attr as $row}> <!--隔行换色 even偶数 取索引加判断--> <{if $row@index is even}> <tr style="background-color:green"> <{else}> <tr> <{/if}> <{foreach $row as $value}> <td><{$value}></td> <{/foreach}> </tr> <{/foreach}> </table> <br /> <{$page}> </body> </html>
function.hello.php
<?php function smarty_function_hello($args) { for($i=0;$i<10;$i++) { echo "aaaaaaaa<br>"; } }
block.style.php
<?php function smarty_block_style($args,$content,$smarty,$a) { if(!$a)//结束时候执行 { $content = "<span style='color:red; font-size:30px'>".$content."</span>"; } return $content; }
modifier.mystyle.php
<?php function smarty_block_style($args,$content,$smarty,$a) { if(!$a)//结束时候执行 { $content = "<span style='color:red; font-size:30px'>".$content."</span>"; } return $content; }
function.date.php
<?php /** * 日期时间控件 * * @param $name 控件name,id * @param $value 选中值 * @param $isdatetime 是否显示时间 * @param $loadjs 是否重复加载js,防止页面程序加载不规则导致的控件无法显示 * @param $showweek 是否显示周,使用,true | false */ function smarty_function_date($args, $smarty) { // public static function date($name, $value = '', $isdatetime = 0, $loadjs = 0) { $name = $args['name']; $value = !empty($args['value']) ? $args['value'] : ''; $isdatetime = !empty($args['time']) ? $args['time'] : 0; $loadjs = 0; if($value == '0000-00-00 00:00:00') $value = ''; $id = preg_match("/\[(.*)\]/", $name, $m) ? $m[1] : $name; if($isdatetime) { $size = 21; $format = '%Y-%m-%d %H:%M:%S'; $showsTime = 12; } else { $size = 10; $format = '%Y-%m-%d'; $showsTime = 'false'; } $str = ''; if($loadjs || !defined('CALENDAR_INIT')) { define('CALENDAR_INIT', 1); $str .= '<script src="./js/date/js/jscal2.js"></script> <script src="./js/date/js/lang/cn.js"></script> <link rel="stylesheet" type="text/css" href="./js/date/css/jscal2.css" /> <link rel="stylesheet" type="text/css" href="./js/date/css/border-radius.css" /> <link rel="stylesheet" type="text/css" href="./js/date/css/steel/steel.css" />'; } $str .= '<input type="text" name="'.$name.'" id="'.$id.'" value="'.$value.'" size="'.$size.'" class="date" readonly> '; $str .= '<script type="text/javascript"> Calendar.setup({ weekNumbers: true, inputField : "'.$id.'", trigger : "'.$id.'", dateFormat: "'.$format.'", showTime: '.$showsTime.', minuteStep: 1, onSelect : function() {this.hide();} }); </script>'; return $str; }
function.color.php
<?php /** * 颜色控件 * * @param $name 控件name * @param $value 选中值 * <{color name='titlecolor' value='FF00FF'}> */ function smarty_function_color($args, $smarty) { $name = $args['name']; $value = !empty($args['value']) ? $args['value'] : '000000'; if(!defined('COLOR_INIT')) { define('COLOR_INIT', 1); $str= '<script src="./js/jscolor/jscolor.js"></script>'; } $str .= '<input class="color" style="width:48px;height:16px;overfrom:hidden" name="'.$name.'" value="'.$value.'" />'; return $str; }
block.textarea.php
<?php /** * 编辑器 * @param int $textareaid * @param int $toolbar 有basic full 和desc三种 * @param int $color 编辑器颜色 * @param string $alowuploadexts 允许上传类型 * @param string $height 编辑器高度 * @param string $disabled_page 是否禁用分页和子标题 */ function smarty_block_textarea($args, $content, $smarty, &$repeat) { //public static function editor($textareaid = 'content', $toolbar = 'basic', $height = 200, $color = '', $up=true) { if(!$repeat) { $textareaid = !empty($args['name']) ? $args['name'] : 'content'; $toolbar = !empty($args['toolbar']) ? $args['toolbar'] : 'basic'; $height = !empty($args['height']) ? $args['height'] : '200'; $color = !empty($args['color']) ? $args['color'] : ''; $up = !empty($args['up']) ? $args['up'] : true; $str ='<textarea name="'.$textareaid.'">'.$content.'</textarea>'; if(!defined('EDITOR_INIT')) { $str .= '<script type="text/javascript" src="./js/ckeditor/ckeditor.js"></script>'; define('EDITOR_INIT', 1); } if($toolbar == 'basic') { $toolbar = "['Bold', 'Italic','Underline','Strike','NumberedList', 'BulletedList', 'TextColor','BGColor', 'Link', 'Unlink', '-', 'Image','Flash','Table','Smiley','SpecialChar'],['RemoveFormat'], \r\n"; } elseif($toolbar == 'full') { $toolbar = "['Source','-','Templates'], ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print'], ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],['ShowBlocks'],['Image','Capture','Flash'],['Maximize'], '/', ['Bold','Italic','Underline','Strike','-'], ['Subscript','Superscript','-'], ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'], ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'], ['Link','Unlink','Anchor'], ['Table','HorizontalRule','Smiley','SpecialChar'], '/', ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'], ['attachment'],\r\n"; } elseif($toolbar == 'desc') { $toolbar = "['Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink', '-', 'Image', '-','Source'],\r\n"; } else { $toolbar = ''; } $str .= "<script type=\"text/javascript\">\r\n"; $str .= "CKEDITOR.replace( '$textareaid',{"; $str .= "height:{$height},"; if($color) { $str .= "extraPlugins : 'uicolor',uiColor: '$color',"; } /* if($up) { $str .="filebrowserImageUploadUrl:'".B_URL."/upimage',"; $str .="filebrowserFlashUploadUrl:'".B_URL."/upflash',"; } */ $str .= "toolbar :\r\n"; $str .= "[\r\n"; $str .= $toolbar; $str .= "]\r\n"; //$str .= "fullPage : true"; $str .= "});\r\n"; $str .= '</script>'; return $str; } }