www.91084.com

GVKun编程网logo

PHP smarty(php smarty框架)

3

想了解PHPsmarty的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于phpsmarty框架的相关问题,此外,我们还将为您介绍关于PHP+Smarty+MySQL、PHP/Smarty–如

想了解PHP smarty的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于php smarty框架的相关问题,此外,我们还将为您介绍关于PHP + Smarty + MySQL、PHP / Smarty – 如何检查数组中是否有具有特定值的对象,并创建这些对象的临时数组、php autoload:解决 PHP 中的 __autoload 和 Smarty 冲突、PHP CodeIngiter 2.x.x 框架与 Smarty 3.x.x 模板引擎整合的新知识。

本文目录一览:

PHP smarty(php smarty框架)

PHP smarty(php smarty框架)

载好后Smarty-stable-3.1.12解压缩会得到一个 Smarty-3.1.12 文件夹,里面有两个主要文件夹demo和libs demo文件夹为示例文件夹,里面包含默认文件夹结构,是我们要进行编写程序代码的主要文件夹。demo里文件夹的名称都是smarty默认的目录结构名称,可以通过改smarty对应属性值,再把文件夹名改成我们想要的名称。 libs为smarty代码源文件夹,一般不动。 /libs/Smarty.class.php #主文件 /libs/sysplugins/ #内部plugin /libs /plugins/ #外部plugin,可自由扩充 /demo/cahce/ #放置缓存文件 /demo/configs / #放置可以载入的配置文件 /demo/templates/ #放置模板文件 /demo/templates_c/ #放置对模板编译后的文件 可以把解压得到的 Smarty-3.1.12 文件夹名改成我们想要的项目名,demo也可以改成我们想要的具体存放编码的文件夹的名称 2、调试Smarty-3.1.12 创建自己的文件,在demo文件夹下创建index.php。 在templates目录中创建模板index.tpl (几乎可以是任何文本文件的扩展名,常用的是tpl,php,html,不建议使用后两者,因为可以从浏览器直接访问而不安全。可以对apache的httpd.conf进行设置,禁止直接访问.tpl文件。或者将templats目录放在网站文档树之外。) *///index.php代码require(''../libs/Smarty.class.php''); $smarty = new Smarty; //在调用的模板里可以通过{$name}来输出name的值zhang,{}为这里的smarty分界符$smarty->assign(''name'',''zhang''); //调用模板tpl文件里不能执行PHP语句块$smarty->display(''templates/index.tpl''); /* index.tpl页面内容 你好, {$name} *//* Smarty编译时的处理过程是源php文件->模板文件(可能调用多个或多次)->源php文件。。。 也就是说不影响原php文件的其他处理和输出。所以smarty模板文件可以是完整的html,也可以是其中一部分。 smarty处理过程 smarty将php源文件,首先编译成中间文件(也是php),如果启用缓存,再根据编译文件生成缓存文件(也是php),需要缓存的部分全部是硬编码。 之后的每次访问都会访问编译文件(如果编译文件已经存在),一次编译多次调用(可以是单文件的多次,也可以是多文件的多次),如果启用缓存且有缓存文件而且没有过期,则直接访问缓存文件,跳过编译文件。 编译文件一经生成,就不会被自动更新,除非模板文件或者配置文件更改。源php文件修改是不会引发重新编译的。一旦编译文件重新生成,缓存文件也必然重新生成。 *///Smarty允许有两种特殊的编译设置存在: //1、 任何时候都不自动重新编译(上线阶段):只有没有该文件的编译文件时才生成,模板文件或者配置文件的更改,不会引发重新编译。$smarty->setCompile_check(false);//默认为true,false表示任何时候都不在文件发生变更的情况下生成编译文件,除了无编译文件。$smarty->getCompile_check();//获得当前编译检查的设置 //2、任何时候都重新编译(调试阶段):任何时候都重新编译。$smarty->setForce_compile(true);//默认为false,true表示每次都重新编译(启用缓存的话,每次都重新缓存)$smarty->getForce_compile();//获得当前强制编译的设置 //开启缓存$smarty->setCaching(true); $smarty->getCaching();//获取当前缓存状态,默认是false关闭的$smarty->setcache_lifetime(60);//设置缓存时间单位秒 //{*模版文件*} //{nocache} //{$name} //{/nocache} //{*如果开启缓存的话放在nocache标签内的变量不会缓存,每次读取PHP源文件的值*}/* smarty分界符 在模板文件中,区分普通html代码和smarty代码靠的是分界符。默认是 {} ,但可能会与js和css相冲突。可以进行变更。 在3.0中模板标签将不支持空格,如{ $abc }在Smarty2中可以识别的,但是3.0里头就不行了,必须这样{$abc},这样是为了能够更好的支持javascript和css。 */$smarty->left_delimiter = "{"; //左分界符,2.0属性,3.0沿用$smarty->right_delimiter = "}"; /* 分界符就相当于PHP的echo,分界符中的值都将输出,除非赋值等操作 smarty tpl文件中分界符中两个**之间的内容为注释内容如 tpl文件: {*这是模板注释内容*} *///设置缓存目录路径,不设默认"cache"$smarty->setCacheDir("cache"); //获取缓存目录路径$smarty->getCacheDir(); //设置配置目录路径,不设默认"configs"$smarty->setConfigDir("configs"); //添加配置目录路径,所有路径将会以数组形式保存,调用文件时将在所有路径中查找$smarty->addConfigDir("configs/test"); //获取配置目录路径的数组$smarty->getConfigDir(); //设置插件目录路径,不设默认"plugins"$smarty->setPluginsDir("plugins"); //添加插件目录路径,所有路径将会以数组形式保存,调用文件时将在所有路径中查找,plugins文件夹里放的就是可以在前台或后台按不同规则调用的函数的存储文件,文件名及函数名的命名按不同调用规则有不同写法要求$smarty->addPluginsDir("plugins/test"); //获取插件目录路径的数组$smarty->getPluginsDir(); //设置模板目录路径,不设默认"templates"$smarty->setTemplateDir("templates"); //添加模板目录路径,所有路径将会以数组形式保存,调用文件时将在所有路径中查找$smarty->addTemplateDir("templates/test"); //获取模板目录路径的数组$smarty->getTemplateDir(); //设置编译目录路径,不设默认"templates_c"$smarty->setCompileDir("templates_c"); //获取编译目录路径$smarty->getCompileDir(); /* 我们可以建不同的php源文件文件夹,把编写的php文件按一定的分类放在不同的文件夹中。 然后在每个文件夹中都创建一个自定义的config文件,在config文件中创建一个新的$smarty = new Smarty 对象 然后把所有不同的文件夹的php文件的缓存,配置文件,插件,模版,编译目录都设置到同一个缓存,配置文件,插件,模版,编译目录 让该文件夹下所有PHP源文件都引用该配置文件即可获取相同配置 *///模版变量$arr = array(array("zhang","li"),''a''=>array("liu","wang"),array("ming","yi")); $smarty->assign("testArr", $arr); //设置模版变量,为将要调用的模版提供变量,在接下来调用的模版中可以通过{$testArr}或者{$testArr[''a''][0]}或者{$testArr.a.0}来访问具体某数组元素 //在模版中可以直接通过 {$testArr = "testValue" scope="global"} 来更改传过来的模板变量的值(如果不存在则在模板中创建并设置该模版变量),scope属性是标注模板变量使用范围的可不写 //在模版中更改或创建成其他数组 {$testArr = [1,2,3]}也可以{$testArr = [1,''a''=>2,2=>3]}也可以{$testArr[] = 4}或其他类似PHP中创建数组方式 //php源文件可通过 $smarty->getTemplateVars("testArr") 获取指定模版变量,如要获取模板中改变或创建的模版变量,在模板中创建或更改其值时必须加上scope属性并把值设置为scope="global"或scope="parent"class A{ function aa($nam){ echo$nam; } } $smarty->assign("obj", new A); //设置的模版变量是对象时在模版页可以如下这样调用,给模版传类对象时也是传址 //{$obj->aa(''my name is y'')} //Smarty可以识别嵌入在双引号中的模版变量,只要此变量只包含数字、字母、下划线。但貌似只支持能直接转换成字符串的模版变量$smarty->assign("testStr", "this is testStr"); //模板中可通过{"$testStr OK !"}来访问/* tpl模板包含模板 模板文件: {include file="header.tpl"} header.tpl内容: 这是顶部内容!!,欢迎你,{$name} 模板包含模板也可以是这样格式 {include file="header.tpl" testVar="这是顶部内容!!!"} header.tpl则可以通过{$testVar}使用调用页包含时传来的模板变量 header.tpl内容: {$testVar},欢迎你,{$name}
*//* 可以预先规定一系列的变量与值的对应,并放在配置文件中,在使用时载入。 配置文件默认放在configs文件夹中,可以自定义修改文件夹名。 *//* #模板test.conf文件: #键对应的值可以不用引号括起来 title = Welcome to Smarty!! cutoff_size = 40 [china] language = chinese [england] language = english #[china],[england]为标签,未设置标签的键值为全局的只要调用该配置文件就可以在模版中使用,设置了标签的键值只有在调用配置文件时指定了对应标签才可以使用 #在PHP源文件调用配置文件语句$smarty->configLoad(''test.conf'', $sections = ''england'');该语句下面调用的模版才可以使用该配置文件,通过$sections属性指定使用哪个标签下的键和值 #$sections参数可以不写,默认值为null,$smarty->configLoad(''test.conf'')则只使用全局的键值,而不能使用标签下的键值 #在模版下通过{config_load file="test.conf" section="china" scope="global"}语句调用配置文件 #section属性可以不写,默认是null,scope属性必须写{config_load file="test.conf" scope="global"} #section属性可赋三种值 #local 只有当前模版可以使用该配置文件 #parent 只有当前模版引入该配置文件语句后包含的模版中,或在php源文件中smarty对象调用该配置文件后调用的模版中可以使用该配置文件中的键值 #global 测试效果和parent相同 #在模版中通过{#language#}来使用键值,也可以通过{$smarty.config.language}来访问配置文件键值 #PHP源文件中可以使用$smarty->getConfigVars(''language'')或$smarty->getConfigVariable(''language'')来获取键值,$smarty->getConfigVars(''language'')获取的还可能是数组 *//* tpl文件中常用函数 tpl文件: {capture name="testCapture"} {include file="f1.tpl"} {/capture} {if true} {$smarty.capture.testCapture} {/if} {if $name == "wang"} Welcome wang. {elseif $name == "zhang"} Welcome zhang. {else} Welcome, whatever you are. {/if} {*操作符可以是 ==,>= 等也可以是 eq,ne等*} {for $x=0; $x {foreach name="testForeach" from=$testArr key=arId item=arVal} {$arId}对应的值为:{$arVal}
{$smarty.foreach.testForeach.index} {$smarty.foreach.testForeach.iteration} {$smarty.foreach.testForeach.first} {$smarty.foreach.testForeach.last} {$smarty.foreach.testForeach.total}
{foreachelse} $testArr is null {/foreach} {*也可以如下两种类PHP格式*} {foreach $testArr as $n} {$n} {/foreach} {foreach $testArr as $key=>$n} {$key} {/foreach} {$sectionArr = [0=>"a",4=>"b","c","d","e",6,7,8,9,10,11,12,13,14,15,16]} {section name="testSection" loop=$sectionArr start=0 step=4 max=6 show=true} {$smarty.section.testSection.index}- {$sectionArr[testSection]}- {$smarty.section.testSection.iteration}-
{sectionelse} $sectionArr is null {/section}
*//* tpl模板文件: {literal} {/literal} {* literal 标签区域内的数据将被当作网页html文本处理,此时模板将忽略且不分析其内部的所有字符信息。 该特性用于显示有可能包含大括号等字符信息的 js、css 。当这些信息处于 {literal}{/literal} 标签中时,模板引擎将不分析它们,而直接显示。 *} *///PHP文件: //$smarty->setDebugging(true);//对后续调用的模板进行调试。 //$smarty->getDebugging();//得到当前是否进行调试,默认false //或在需要调试的模版中写入{debug}/* 模板文件: smarty3.0支持了模版继承系统,例如 f1.tpl: {block name=''top''} f1.header
{/block} {block name=''middle''} f1.middle
{/block} {block name=''buttom''} f1.buttom
{/block} f2.tpl: {extends file="f1.tpl"} {block name=''top''} f2.header
{/block} {block name=''other''} it can`t be show
{/block} {* 如果f2.tpl中没有block标签,或f2.tpl中没有和f1.tpl中相同命名的block标签,则f2.tpl完整引入显示f1.tpl中所有内容包括block标签的内容,而f2.tpl中所有内容将忽略 如果f2.tpl中有和f1.tpl中同名block标签,则在f2.tpl显示时f2.tpl中block标签内容将覆盖f1.tpl中同名block标签的内容,在f2.tpl页面显示时,内容仍将按f1.tpl设置的格式位置显示,f2.tpl其他所有文本包括未同名的block标签及其内容都将被忽略,不显示。 block标签的内容只会覆盖父模版中同名block标签的内容,或在子模版中显示,在本页面中如果没有调用父模版或父模版中没有要覆盖的同名block标签,block标签内容在本页面中不显示 这种继承支持多文件,多重继承,意味着可以无限的继承下去 *} {fetch file="http://www.126.com" assign="testAssign"} {$testAssign} {fetch file="http://www.126.com"} {*fetch可以引用外部http,ftp的页面,如指定assign的值则把引用的内容存在指定名的变量中,否则在哪有fetch在哪显示*}
*///php页面: //调用模版也可以使用此方法,在输出前做一些处理 //$output = $smarty->fetch("index.tpl"); //do something with $output here对将要输出的内容进行处理 //echo $output;//然后将模板输出/* 模板中提交表单
action属性可以直接写要提交到的php文件名,或者不写空action=""则提交到调用该模板的php文件中
*///连接数据库mysql_connect("localhost","root","root"); mysql_select_db("test"); $smarty->assign(''webDir'',$_SERVER[''DOCUMENT_ROOT'']);//$_SERVER[''DOCUMENT_ROOT'']为当前项目文件夹的绝对路径 //配置JQuery的src路径最好写绝对路径或写要运行文件能找到该JQuery的相对路径因为要编译成编译文件,而编译后的文件和原路径环境不一样 ?>

以上就介绍了PHP smarty,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

PHP + Smarty + MySQL

PHP + Smarty + MySQL

Help me please! How to transfer data from table to smarty?

Function:

public function getBanLog() {
    global $mysqli;
    $result = $query = $mysqli->query("SELECT * FROM `bans`") or die($mysqli->error);
    $rows = array();
    while($row = $result->fetch_array(MYSQLI_ASSOC)) {
        $rows[] = $row;
    }
}

index.php:

$user = new UserInfo();
$smarty = new Smarty();

$smarty->assign("userInfo", $user);
$smarty->assign(''ban'', $user->getBanLog());
$smarty->display(''template/ban.tpl'');

ban.tpl:

{foreach from=$ban item=row}
    <td>{$row.id}</td>
    <td>{$row.banned}</td>
    <td>{$row.admin}</td>
    <td>{$row.reason}</td>
{/foreach}
php  mysql  smarty
share improve this question
asked  Jul 27 ''13 at 12:08
user2491101
1021
  • 1
    code looks fine whats the problem ? – M Khalid Junaid Jul 27 ''13 at 12:10
  •  
    Only thing suspect here is the lack of a WHERE clause in your query, which appears to return all bans for all users, not just the user as implied by the UserInfo(). – Michael Berkowski Jul 27 ''13 at 12:11
  •  
    @dianuj getBanLog() returns nothing, and $result = $query = $mysqli->query – bansi Jul 27 ''13 at 12:14 
add a comment

1 Answer

active oldest votes
up vote 4down vote

Your getBanLog() function returns nothing, need to add a return statement. Also $result = $query = $mysqli->.. is not correct.

Try this

public function getBanLog() {
    global $mysqli;
    $result = $mysqli->query("SELECT * FROM `bans`") or die($mysqli->error);
    $rows = array();
    while($row = $result->fetch_array(MYSQLI_ASSOC)) {
        $rows[] = $row;
    }
    return $rows;
}
share improve this answer

PHP / Smarty – 如何检查数组中是否有具有特定值的对象,并创建这些对象的临时数组

PHP / Smarty – 如何检查数组中是否有具有特定值的对象,并创建这些对象的临时数组

这里的第一个计时器,我希望我能够解释得这么好……

PHP / Smarty,我正在处理页面的一部分,该页面显示与常规页面或该页面上的各个位置相关联的注释的项目符号列表.有些地方没有笔记.就像是:

一般

>注1

纽约

>注意2
>注3

波士顿

>注4

我有两个分配给我正在使用的.tpl的数组,并由UI类填充:$places和$notes

$places包含place对象,每个对象由place_id唯一

$notes包含唯一标识的注释对象,每个注释对象可能有也可能没有place_id作为其中一个属性

这就是我的想法:

{if (**ANY NOTES EXIST IN $notes WITH NO place_id**)}
    <ul id="list-general">
        <h4>General</h4>
        {foreach from=**[NOTES WITH NO place_id]** item=note}
            <li id="note-{$note->get_id()}">$note->get_text()</li> 
    {/foreach}
    </ul>
{else}
    <ul id="list-general">
        <h4>General</h4>
    </ul>
{/if}

{foreach from=$places item=place}
     {assign var=curr_place_id value=$place->get_id()}
     {if (**ANY NOTES EXIST IN $notes WHERE place_id == $curr_place_id**)}
     <ul id="list-{$curr_place_id}">
             <h4>{$place->get_name()}</h4>
             {foreach from=**[NOTES WHERE place_id == $curr_place_id]** item=note}
                 <li id="note-{$note->get_id()}">$note->get_text()</li> 
         {/foreach}
         </ul>
     {else}
        <ul id="list-{$curr_place_id}">
            <h4>{$place->get_name()}</h4> 
        </ul>
     {/if}
{/foreach}

我对这一切都很陌生,而且我很难掌握CAPS中的项目……所以,我的问题是:什么是评估两个不同数组中对象属性的最佳方法,以及可能构建只包含我需要的笔记的临时数组.

(如果你想知道,我正在创建隐藏的节点,所以我可以通过javascript访问它们,而不必担心订单)

解决方法:

虽然我猜测在Smarty中可以做到这一点,但似乎你在这里混合了你的业务逻辑和表示逻辑.就个人而言,我会考虑在调用此模板的PHP中将数组拼接成两部分(一般和地点).

$placesNotes = array();
$generalNotes = array();

array_filter($notes, function($note) {
    global $placesNotes, $generalNotes;
    if($note->get_place_id() == null) {
        $generalNotes[] = $note;
    } else {
        $placesNotes[$note->get_place_id()][] = $note;
    }
});

(注意:这使用匿名函数,因此只有> 5.3 – 如果您希望它在旧版本上运行,请将函数移动到它自己的命名函数并使用Callback类型)

然后你最终得到两个你可以轻松循环的数组,在Places循环中使用isset($notes_places.$curr_place_id)来查明这个地方是否有任何注释.

另外,你忘记了get_text()调用周围的{}.

我发了一个快速的样本,发现于:http://gist.github.com/479392 – 希望有帮助吗?

顺便说一句:你的问题非常明确,并解释了你想做什么,甚至详细说明了你做的事情背后的决定,当时不是很明显 – 所以这是第一次:优秀的问题!

php autoload:解决 PHP 中的 __autoload 和 Smarty 冲突

php autoload:解决 PHP 中的 __autoload 和 Smarty 冲突


        最近,在项目中发现,PHP 的 __autoload 方法失效了。调试了好久,百思不得其解,查了下资料才知道原来是 Smarty 的原因。新版的 Smarty 改变了autoload的方式。
        解决方法是:在 Smarty 的包含类文件后加一段代码,spl_autoload_register("__autoload");
        如下:
define(''ROOT_PATH'', dirname(__FILE__));
require_once ROOT_PATH . ''/includes/smarty/Smarty.class.php'';
spl_autoload_register("__autoload"); // 添加这段代码
?>
本文链接http://www.cxybl.com/html/wlbc/Php/20121013/32997.html



PHP CodeIngiter 2.x.x 框架与 Smarty 3.x.x 模板引擎整合

PHP CodeIngiter 2.x.x 框架与 Smarty 3.x.x 模板引擎整合

目前 CI 框架已经推出了 2.0 的版本了。一直想尝试修改我的网站的核心。经过测试可以正常使用,以下提供配置方案和已经配置好的文件,
下面是配置步骤的详细说明一下:
第一步:安装 CodeIngiter。 这个不需要详细说,下载地址为:http://codeigniter.com/downloads/
第二步:下载最新版本的 Smarty 库,下载地址:http://www.smarty.net/download
第三步:在安装好的 ci 项目的根目录下的入口文件 index.php 文件开头添加如下代码

define(''APP_NAME'',''application'');

if(!defined(''ROOT''))define(''ROOT'',dirname(__FILE__));

if (!defined(''DS'')) define(''DS'', DIRECTORY_SEPARATOR);

第四步:在安装好的 ci 项目的根目录下 application\config 下添加 smarty.php 配置文件

<php  

if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed'');
	/* smarty 设置 */
	$config[''caching'']			=   false;
	$config[''cache_lifetime'']		=   3600;
	$config[''template_dir'']                 =   ROOT.DS.APP_NAME.DS.''views''.DS;
	$config[''compile_dir'']  		=   ROOT.DS.APP_NAME.DS.''cache''.DS.''views_c''.DS;
	$config[''cache_dir '']    		=   ROOT.DS.APP_NAME.DS.''cache''.DS.''smarty_cache''.DS;
	$config[''left_delimiter''] 		=   ''<!--{'';
	$config[''right_delimiter '']		=   ''}---->'';

第五步:在安装好的 ci 项目的根目录下 \application\libraries, 把下载好的 smarty 文件包中 libs 放到这里,并改名为 smarty
第六步:在安装好的 ci 项目的根目录下 \application\libraries 下添加 smarty 扩展类 CI_Smarty.php

<?php
require (ROOT.DS.APPPATH."libraries".DS."smarty".DS."Smarty.class.php");
class CI_Smarty extends Smarty
{
	protected $ci;

	public function __construct()
	{
	    parent::__construct();
	    $this->ci = & get_instance();
	    $this->ci->load->config(''smarty'');
	    self::loadSetting();
	}

 	public function loadSetting()
 	{
 		$this->caching		=   $this->ci->config->item(''caching'');
 		$this->cache_lifetime	=   $this->ci->config->item(''cache_lifetime'');
  		$this->template_dir		=   $this->ci->config->item(''template_dir'');
   		$this->compile_dir  		=   $this->ci->config->item(''compile_dir'');
   		$this->cache_dir     	=   $this->ci->config->item(''cache_dir'');
   		$this->left_delimiter 	=   $this->ci->config->item(''left_delimiter'');
  		$this->right_delimiter 	=   $this->ci->config->item(''right_delimiter'');
	}

}

第七步:在 application\config\autoload.php, 设置自动加载 smarty 扩展类 CI_Smarty.php

$autoload[''libraries''] = array(''ci_smarty'');

第八步:在 application\core 添加 MY_Controller.php 文件

<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed'');

	class MY_Controller extends CI_Controller
	{

		public function __construct()
		{
			parent::__construct();
		}

		public function assign($key,$val)
		{
			$this->ci_smarty->assign($key,$val);
		}

		public function display($html)
		{
			$this->ci_smarty->display($html);
		}

	}

第九步:已经配置完成 开始测试 在 application\controllers\welcome.php

<?php if ( ! defined(''BASEPATH'')) exit(''No direct script access allowed'');

	class Welcome extends MY_Controller {

		public function index()
		{
			$this->assign("hello","<a href=''http://www.pvsky.com/blog''>我的博客</a>");
			$this->display("test.html");
		}
	}

模板文件 \application\views\test.html

    <html>
    <head></head>
    <body>
	<!--{$hello}-->
    </body>
    </html>

访问你的本地 index.php 就可以看到

关于PHP smartyphp smarty框架的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于PHP + Smarty + MySQL、PHP / Smarty – 如何检查数组中是否有具有特定值的对象,并创建这些对象的临时数组、php autoload:解决 PHP 中的 __autoload 和 Smarty 冲突、PHP CodeIngiter 2.x.x 框架与 Smarty 3.x.x 模板引擎整合等相关内容,可以在本站寻找。

本文标签: