smarty模板引擎在模板中定义变量的技巧

在开发网站时,遇到一个变量调用的问题。

变量{$module}为模块的名称

需要根据模块名称调用对应的中文名称,在语言文件中有对应的写出.调用格式{$lng.英文模块名}

因模块有多个,无法通过固定赋值得出.

所有通过在模板中定义变量实现,方法如下:

{assign var="module" value="{$lng.{$li.l_module}}"}//其中{$li.l_module}为调出的模块英文名
{$module}//{$module}实际上就是{$lng.英文模块名}格式.

通过以上方法,实现了smarty模板引擎在模板中定义变量,满足实际需求.

 

 

快速的模块式开发框架

当写完一个程序之后,需要再写另一个程序时,比如当你写完一个留言版之后,需要再写一个文章管理程序。请看,一般留言板程序执行文件结构:
config.php
header.inc.php
footer.inc.php
index.php
globals.php
.....
文件管理程序或其它程序的结构也可以是这样子的。因为,如果程序是放在同一个网站动行,配置是相同的,在讲究程序与代码分离的的现阶段,还要配置模板引擎,就有很多重复工作要做。如果有一个程序,可以把自已以前写的程序整合在一起,又要保持原有的独立性。程序拥有独立性与整合性并存。这就是我要说的,模块式开发。这,就需要一个适合自已的框架。
首先,从目录结构上区分一个这个框架,为易于理解,简主要结构如下:
includes/
modules/
index.php
config.php
......
1、目录includex下可以放一些常用的类库,如smarty类库,ado数据类库,或自定义类、函数库等等,每一类一个目录,然后把这些配置路经统一放置在config.php文件中
2、modules目录用来存放模块,如留言模块。每个模块为一个目录。
3、将index.php设为统一程序入口
4、config.php为全局使用的配置文件
下面就举个简单的例子:
输入网址index.php?module=article&action=list就引入下面的文件
index.php
config.php
modules/article/index.php
modules/article/list.php
QUOTE:
index.php内容如:
define('SHOW', true);//定义入口常量
require_once('config.php');//调入配置文件
$module = $_GET['module'];//调用模块
if (empty($_GET['module'])) $module = 'public';//默认值
if (!preg_match ("/^[a-z_]+$/i", $module)) die('参数错误!'); //使模块名字参数只接受字母及_字符组成,防注入
$path_module = PATH_MODULE.$module.'/';//模块路径
is_file($path_module.'index.php') or die(FILE_NULL);//如果模块不存在就停止
require_once($path_module.'index.php');//调用模块
……
config.php内容如:
defined('SHOW') or die(header("HTTP/1.1 403 Not Forbidden"));//检测是否有入口常量
define('DB_HOST', '127.0.0.1');//数据库地址
define('DB_USER', 'qh663');//数据库用户名
……//其它数据库配置与全局环境设置,如定义上面的常量(PATH_MODULE)
modules/article/index.php//模块入口,接受操作动作
defined('SHOW') or die(header("HTTP/1.1 403 Not Forbidden"));//检测是否有入口常量
$action = $_POST['action'];接受动作
if (!preg_match ("/^[a-z_]+$/i", $action)) die('参数错误!'); //使模块名字参数只接受字母及_字符组成,防注入
……//这里处理载入action之类的
modules/article/list.php//相应动作的执行,这里,可以包含任意所需代码实现
defined('SHOW') or die(header("HTTP/1.1 403 Not Forbidden"));//检测是否有入口常量

一个模块,只一个参数。一个动作,也只一个参数。看下,是不是很爽?
程序的独立与整合,只操作modules目录下的mod即可。并且程序只一个入口,非常安全!

php遍历引入文件夹中所有的文件

php遍历引入文件夹中所有的文件

在开发程序时,使用语言文件,需要在语言文件夹中设置多个php文件,分别存储不同的类型语言,在引入时进行遍历循环,方便后期维护及管理。

示例代码:

$folder_url='include/lang/' . WEB_LANG . '/';//文件夹路径,相对于根目录,与代码文件所在位置无关。
foreach( glob($folder_url.'*.php') as $filename ) include_once $filename;//循环所有语言文件

 

win7 win10下80端口被System进程占用的解决方法

用如下方法可以解决System进程占用80端口的问题:
打开RegEdit:开始-运行-输入regedit-调出注册表
找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesHTTP
找到一个DWORD值Start,将其改为0
重启电脑,System进程将不会占用80端口
就可以打开你的apache了

这种方法确实暂时解决了我的问题,应该就是这样的,但是后面又来问题了。Apache又无缘无故的打不开了。于是,最后终于发现了进程有个SQL Server ReportingServices,这个是sql servers带有的,而且自动运行,关闭它,就可以了。但是切记,可能这个进程会自动打开,所以先把apache打开,这个的话后面SQL Server ReportingServices运行也不会占用80端口了。我用的360查找的
我的问题总算是解决了。最后总结一下吧。

查询:查看占用80端口的信息,那么可以在cmd窗口输入netstat -ano | findstr "80" 命令
常见的几种情况:
1、迅雷等程序或者一些其他有上传功能的软件都会占用电脑的80端口
2、netstat -abno后查看,经过查找为pid=4的system进程,因为是系统进程,也无法结束它,经查SQL Server ReportingServices (SQLEXPRESS) 服务占用80端口,停止SQL Server ReportingServices后APache正常启动.
3、卸载internet信息服务-->万维网服务。这个是最常见的故障,或者其他一些第三方的服务器软件,必须在进程里面结束,才有效果。
备注:杀掉进程的命令:taskkill /pid 4 /f其中 /f表示强制关闭该进程

$_get未传值时报NOTICE错误

$_get未传值时报NOTICE错误

加一个判断就可以了
if(is_set($_GET["module"])){
$module = $_GET["module"];
}

例子:

$module = isset($_GET['module'])? $_GET['module']:'index';

 

或者屏蔽NOTICE错误

加入
error_reporting(E_ALL ^ E_NOTICE);

 

smarty模板引擎,列表循环方法

说明:mysql_connect()方法连接mysql数据库

inc.php代码:

$con = @mysql_connect($dburl, $uname, $upass);
if (!$con) die('MYSQL.Connect.Error!');
mysql_query("set names 'utf8'");
mysql_select_db($dbname, $con);

 

list.php代码

include_once 'include/inc.php';
include 'include/smarty/Smarty.class.php';
$smarty = new Smarty();//实例化
$smarty -> template_dir = './templates/'.THEME.'/';//模板目录
$sql="select * from content";
$res=mysql_query($sql);
$data = array();
while ($row = mysql_fetch_assoc($res))
{
$data[] = $row;
}
$smarty -> assign('list', $data);//给变量赋值

$smarty -> display('list.html');//显示模板

 

list.html模板代码:

代码一:

{foreach item=item from=$list}
<br>
标题:<a target="_blank" href="detail.php?id={$item.id}">{$item.c_title}</a>
内容:{$item.c_content}<br>
{/foreach}

代码二:
{section loop=$list name=list}

{$list[list].c_title}
{$list[list].c_content}

{/section}

 

 

smarty半小时快速上手入门教程

本文讲述了smarty快速上手入门的方法,可以让读者在半小时内快速掌握smarty的用法。分享给大家供大家参考。具体实现方法如下:

一、smarty的程序设计部分:

在smarty的模板设计部分我简单的把smarty在模板中的一些常用设置做了简单的介绍,这一节主要来介绍一下如何在smarty中开始我们程序设计。下载Smarty文件放到你们站点中。

index.php代码如下:

 

<?php
/**
*
* @version $Id: index.php
* @package
* @author www.jb51.net
* @action 显示实例程序
*/
include_once("./Smarty/Smarty.class.php"); //包含smarty类文件 

$smarty = new Smarty(); //建立smarty实例对象$smarty
$smarty->templates("./templates"); //设置模板目录
$smarty->templates_c("./templates_c"); //设置编译目录
$smarty->cache("./cache"); //缓存目录
$smarty->cache_lifetime = 0; //缓存时间
$smarty->caching = true; //缓存方式

$smarty->left_delimiter = "{#";
$smarty->right_delimiter = "#}";
$smarty->assign("name", "zaocha"); //进行模板变量替换
$smarty->display("index.htm"); //编译并显示位于./templates下的index.htm模板
?>

二、解释smarty的程序

 

我们可以看到,smarty的程序部分实际就是符合php语言规范的一组代码,我们依次来解释一下:

1:/**/语句:

包含的部分为程序篇头注释。主要的内容应该为对程序的作用,版权与作者及编写时间做一个简单的介绍,这在smarty中不是必需的,但从程序的风格来讲,这是一个好的风格。

2:include_once语句:

它将安装到网站的smarty文件包含到当前文件中,注意包含的路径一定要写正确。

3:$smarty = new Smarty():

这一句新建一个Smarty对象$smarty,简单的一个对象的实例化。

4:$smarty->templates(""):

这一句指明$smarty对象使用tpl模板时的路径,它是一个目录,在没有这一句时,Smarty默认的模板路径为当前目录的templates目录,实际在写程序时,我们要将这一句写明,这也是一种好的程序风格。

5:$smarty->templates_c(""):

这一句指明$smarty对象进行编译时的目录。在模板设计篇我们已经知道Smarty是一种编译型模板语言,而这个目录,就是它编译模板的目录,要注意,如果站点位于linux服务器上,请确保

teamplates_c里定义的这个目录具有可写可读权限,默认情况下它的编译目录是当前目录下的templates_c,出于同样的理由我们将其明确的写出来。

6:$smarty->left_delimiter与$smarty->right_delimiter:

指明在查找模板变量时的左右分割符。默认情况下为"{"与"}",但在实际中因为我们要在模板中使用<script>,Script中的函数定义难免会使用{},虽然它有自己的解决办法,但习惯上我们将它重新定义

为"{#"与"#}"或是"<!--{"与"}-->"或其它标志符,注意,如果在这里定义了左右分割符后,在模板文件中相应的要使每一个变量使用与定义相同的符号,例如在这里指定为"<{"与"}>",htm模板中也要

相应的将{$name}变成<{$name}>,这样程序才可以正确的找到模板变量。

7:$smarty->cache("./cache"):

告诉Smarty输出的模板文件缓存的位置。上一篇我们知道Smarty最大的优点在于它可以缓存,这里就是设置缓存的目录。默认情况下为当前目录下的cache目录,与templates_c目录相当,在linux系统中

我们要确保它的可读可写性。

8:$smarty->cache_lifetime = 60 * 60 * 24:

这里将以秒为单位进行计算缓存有效的时间。第一次缓存时间到期时当Smarty的caching变量设置为true时缓存将被重建。当它的取值为-1时表示建立起的缓存从不过期,为0时表示在程序每次执行时缓

存总是被重新建立。上面的设置表示将cache_lifetime设置为一天。

9:$smarty->caching = 1:

这个属性告诉Smarty是否要进行缓存以及缓存的方式。它可以取3个值,0:Smarty默认值,表示不对模板进行缓存;1:表示Smarty将使用当前定义的cache_lifetime来决定是否结束cache;2:表示

Smarty将使用在cache被建立时使用cache_lifetime这个值。习惯上使用true与false来表示是否进行缓存。

10:$smarty->assign("name", "zaocha"):

该数的原型为assign(string varname, mixed var),varname为模板中使用的模板变量,var指出要将模板变量替换的变量名;其第二种原形为assign(mixed var),我们要在后面的例子详细的讲解这个成员函数的使用方法,assign是Smarty的核心函数之一,所有对模板变量的替换都要使用它。

11:$smarty->display("index.tpl"):

该函数原形为display(string varname),作用为显示一个模板。简单的讲,它将分析处理过的模板显示出来,这里的模板文件不用加路径,只要使用一个文件名就可以了,它路径我们已经在$smarty->templates(string path)中定义过了。

程序执行完后我们可以打开当前目录下的templates_c与cache目录,就会发现在下边多出一些%%的目录,这些目录就是Smarty的编译与缓存目录,它由程序自动生成,不要直接对这些生成的文件进行修改。

以上我简单的把Smarty程序中的一些常用的基本元素介绍了一下,在后边的例子中你可以看到将它们将被多次的使用。

三、模板说明

接下来介绍一个section循环块与foreach循环块,本来它应该属于模板部分,但是由于它们是smarty的精华所在,而且与smarty程序设计部分联系非常紧密,所以就在本节单独拿出来讲一下。

1: foreach:用于循环简单数组,它是一个选择性的section循环,它的定义格式为:

 

{foreach from=$array item=array_id}
{foreachelse}
{/foreach}

其中,from 指出要循环的数组变量,item为要循环的变量名称,循环次数由from所指定的数组变量的个数所决定。{foreachelse}用来当程序中传递过来的数组为空时的处理,下面是一个简单的例子:

 

模板文件:

example.htm页面如下:

 

foreach 输出一个“二维关联数组”的数据: 

{#foreach item=new from=$news#}

新闻编号:{#$new.id#}

新闻内容:{#$new.title#}

{#foreachelse#}
数据库中没有新闻输出!

{#/foreach#}

{foreach from=$newsArray item=newsID}
新闻编号:{$newsID}
新闻内容:{$newsTitle}
{foreachelse}
对不起,数据库中没有新闻输出!

{/foreach}

这是一个错误的不显示数据,本文做了更正。

 

程序文件:example.php如下:

 

<?php
/*********************************************
*
* 文件名: example.php
* 作 用: 显示实例程序2
*********************************************/
include_once("./Smarty/Smarty.class.php");
$smarty = new Smarty();
$smarty->templates("./templates");
$smarty->templates_c("./templates_c");
$smarty->cache("./cache");
$smarty->cache_lifetime = 0;
$smarty->caching = true;
$smarty->left_delimiter = "{#";
$smarty->right_delimiter = "#}";
$array[] = array("newsID"=>1, "newsTitle"=>"第1条新闻");
$array[] = array("newsID"=>2, "newsTitle"=>"第2条新闻");
$array[] = array("newsID"=>3, "newsTitle"=>"第3条新闻");
$array[] = array("newsID"=>4, "newsTitle"=>"第4条新闻");
$array[] = array("newsID"=>5, "newsTitle"=>"第5条新闻");
$array[] = array("newsID"=>6, "newsTitle"=>"第6条新闻");
//这是一个二维关联数组
$smarty->assign("newsArray", $array);
//编译并显示位于./templates下的index.htm模板
$smarty->display("example.htm");
?>

输入结果:example.php输出如下:

 

 

这里将输出一个数组: 

新闻编号:1

新闻内容:第1条新闻

新闻编号:2

新闻内容:第2条新闻

新闻编号:3

新闻内容:第3条新闻

新闻编号:4

新闻内容:第4条新闻

新闻编号:5

新闻内容:第5条新闻

新闻编号:6

新闻内容:第6条新闻

 

foreach还可以用foreachelse来匹配,用foreachelse来表示当传递给foreach的数组为空值时程序要执行的操作,具体的使用方法,请参考手册的说明。

2. section:

section的产生是为解决foreach的不足的,与foreach一样,它用于设计模板内的循环块,它较为复杂,可极大程序上满足程序需要,所以在程序中我习惯使用它而不使用foreach,基本原形为:

 

{section name = name loop = $varName[, start = $start, step = $step, max = $max, show = true]}

 

参数解释如下:

name: section的名称,不用加$

$loop: 要循环的变量,在程序中要使用assign对这个变量进行操作。

$start: 开始循环的下标,循环下标默认由0开始

$step: 每次循环时下标的增数

$max: 最大循环下标

$show: boolean类型,决定是否对这个块进行显示,默认为true
这里有个名词需要说明:

循环下标:实际它的英文名称为index,是索引的意思,这里我将它译成"下标",主要是为了好理解。它表示在显示这个循环块时当前的循环索引,默认从0开始,受$start的影响,如果将$start设为5,它也将从5开始计数,在模板设计部分我们使用过它,这是当前{section}的一个属性,调用方式为Smarty.section.sectionName.index,这里的sectionName指的是函数原型中的name属性。

{section}块具有的属性值,分别为:

1. index: 上边我们介绍的"循环下标",默认为0

2. index_prev: 当前下标的前一个值,默认为-1

3. index_next: 当前下标的下一个值,默认为1

4. first: 是否为第一下循环

5. last: 是否为最后一个循环

6. iteration: 循环次数

7. rownum: 当前的行号,iteration的另一个别名

8. loop: 最后一个循环号,可用在section块后统计section的循环次数

9. total: 循环次数,可用在section块后统计循环次数

10. show: 在函数的声明中有它,用于判断section是否显示

它们的具体属性大家可以参考手册,在程序中可灵活使用它的这些属性,模板部分我就使用过index属性,大家可以回过头去看看。

同样,{section}也可以配合使用{sectionelse},用来表示传入的数组变量为空时对模板进行的处理。

我们把上边的那个例子使用{section}来替代{foreach}来实现现样的功能,注意,在这个例子中我只将tpl模板中的{foreach}用{section}来实现,php程序文件中没有任何改动,同时加了{sectionelse}处理块:

example.tpl模板文件如下:

 

这里将输出一个数组: 

{section name=loop loop=$News}
新闻编号:{$News[loop].newsID}
新闻标题:{$News[loop].newsTitle}
{sectionelse}
对不起,没有任何新闻输入!
{/section}

 

example.php文件如下:

 

<?php
/********************************************* 

*

* 文件名: example7.php

* 作 用: 显示实例程序2

*********************************************/

include_once("./comm/Smarty.class.php");

$smarty = new Smarty();

$smarty->templates("./templates");

$smarty->templates_c("./templates_c");

$smarty->cache("./cache");

$smarty->cache_lifetime = 0;

$smarty->caching = true;

$smarty->left_delimiter = "{";

$smarty->right_delimiter = "}";

$array[] = array("newsID"=>1, "newsTitle"=>"第1条新闻");

$array[] = array("newsID"=>2, "newsTitle"=>"第2条新闻");

$array[] = array("newsID"=>3, "newsTitle"=>"第3条新闻");

$array[] = array("newsID"=>4, "newsTitle"=>"第4条新闻");

$array[] = array("newsID"=>5, "newsTitle"=>"第5条新闻");

$array[] = array("newsID"=>6, "newsTitle"=>"第6条新闻");

$smarty->assign("newsArray", $array);

//编译并显示位于./templates下的index.tpl模板

$smarty->display("example.tpl");

?>

example.php 输出文件如下:

 

这里将输出一个数组: 

新闻编号:1

新闻内容:第1条新闻

新闻编号:2

新闻内容:第2条新闻

新闻编号:3

新闻内容:第3条新闻

新闻编号:4

新闻内容:第4条新闻

新闻编号:5

新闻内容:第5条新闻

新闻编号:6

新闻内容:第6条新闻

这里的{section}块的对于变量的命名方式感觉有些别扭,不过没关系,你只要记住模板变量使用:

 

$loopName[name].var这种模式就行了,loopName为loop处赋予的变量名,[name]为name处赋予的字符串,.后为为你要在程序数组中设定要与值相对应的下标名称就行了。

好了,本文关于smarty程序设计学习指南就写到这里,对于一般的应用,这些知识已经够用了,其它的一些高级技巧大家请参看手册中的例子,此外相关的还有Smarty在实际应用中的例子,以php内置的mysql语句,phplib中的DB类,ADODB,Pear中DB类等等。

php查询mysql输出例子

< ?php
$sql="select * from content";
mysql_query($sql, $con);

$result = mysql_query($sql);
if ($result){
  echo "
    "; while($row = mysql_fetch_array($result)) { echo '
  • '.$row['id'].'|'.$row['title'].'|'.$row['desc'].'
  • '; } echo ""; } ?>

可口可乐和百事都在失去年轻消费者

可口可乐和百事可乐在相互争夺的过程中似乎找到了一些共同点,这两款可乐的粉丝们在受教育程度和政治倾向性上有着明显的差异,但是根据一家名为Connexity的电子商务和消费者分析公司提供的最新数据,他们的年龄都比较大了。

可口可乐的最大用户群在35岁到44岁之间,而百事可乐的最大用户群则在65岁以上,与此同时他们在18岁到24岁的人群中支持率都比较低。

 

可口可乐和百事可乐都将自己的饮料产品扩展到了苏打汽水之外,他们引入了小包装饮料来吸引不怎么喝苏打汽水的年轻群体。但是,Connexity公司内容总监罗切尔·拜丽丝(Rochelle Bailis)表示,他们都需要在18岁到24岁之间的人群中做得更好。

“可口可乐相较于百事可乐对于年轻人的吸引力更强,但是他们在吸引年轻消费者这件事上做得都不太好,”拜丽丝说道,“年轻消费者们对于健康更为看重,而可口可乐和百事可乐都在争取千年一代的消费群体,我不认为他们之中任何一家做到了完美。”

 

以下就是Connexity对于可口可乐和百事可乐一些相关市场数据的汇总:

1. 百事可乐在左派民主党人之中的支持率高出了12个百分点,但是在对政治不感兴趣的保守派和极端保守派中其支持率比对手分别低16%和11%。与此相反的是,可口可乐在温和共和党人和极端保守派中的支持率分别高出了21%和10%,但是他们在保守民主党人和左派民主党人中的支持率比对手分别低11%和10%。

2. 可口可乐的用户们拥有大学以上学历的比例较高,而百事可乐的用户们更偏向于只拥有高中学历。

3. 百事可乐的支持者们处于低收入水平的几率较大,他们平均年收入低于两万美元的几率比一般人要高出28%,而可口可乐的消费者们年收入低于两万美元的几率比一般人要低20%。

4. 百事可乐的消费者们自认为“看电视上瘾”几率一般人要高出16%,而可口可乐的消费者们自认为“看电视上瘾”的几率比一般人要低12%。

dedecms5.7后台发布文章提示“标题不能为空”的解决方法

有人发现在使用织梦dedecms5.7后台发布文章提示“标题不能为空”了,这个问题很怪我们都是从直接从官网下载的也有问题了,那么要如何解决呢.

问题症状:V5.7登录后台后,发布英文标题没问题,发布中文会提示“标题不能为空”.

问题根源:htmlspecialchars在php5.4默认为utf8编码,gbk编码字符串经 htmlspecialchars 转义后的中文字符串为空,也就是标题为空.

解决办法:给htmlspecialchars添加ENT_COMPAT ,’GB2312’参数修改编码默认值.

具体修改页面,代码如下:

1、dede/article_add.php 和 dede/article_edit.php

$title = htmlspecialchars(cn_substrR($title,$cfg_title_maxlen));

改成
$title = htmlspecialchars(cn_substrR($title,$cfg_title_maxlen),ENT_COMPAT ,'GB2312');

2、include/ckeditor/ckeditor_php5.php 138行:将

htmlspecialchars($value)

替换为

htmlspecialchars($value, ENT_COMPAT ,'GB2312')

测试,发布文章成功.

提示:若不想修改程序源码的话,建议更换到PHP5.3版本,等织梦升级支持PHP5.4以后再更换空间服务器.