找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1916|回复: 0
打印 上一主题 下一主题

yii,CI,yaf框架+smarty模板使用方法

[复制链接]

2617

主题

2617

帖子

7789

积分

论坛元老

Rank: 8Rank: 8

积分
7789
跳转到指定楼层
楼主
发表于 2018-2-14 05:40:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            本文实例讲述了yii,CI,yaf框架+smarty模板使用方法。分享给大家供大家参考,具体如下:
最近折腾了框架的性能测试,其中需要测试各个模板跟smarty配合的性能,所以折腾了一桶,现总结一下。之前已经写过kohana框架+smarty模板,这里不再重复了。
一、yii框架+smarty模板
yii是覆盖了viewRenderer组件。
1.1,下载yii框架并解压,下载smarty框架并解压,将smarty/libs文件夹拷到yii框架application/protected/vendors下面,并重命名smarty。
1.2,yii配置文件main.php
'components'=>array(
'viewRenderer' => array(
  'class'=>'batman.protected.extensions.SmartyViewRender',
  // 这里为Smarty支持的属性
  'config' => array (
    'left_delimiter' => "{#",
    'right_delimiter' => "#}",
    'template_dir' => APP_DIR . "/views/",
    'config_dir' => APP_DIR . "/views/conf/",
    'debugging' => false,
    'compile_dir' => 'D:/temp/runtime',
  )
)
其中batman是我已经在index.php定义好的别名。
Yii::setPathOfAlias('batman', dirname(__FILE__));
Yii::import("batman.protected.vendors.*");
define('APP_DIR', dirname(__FILE__).'/protected/');
1.3,在protected/extensions/下面新建SmartyViewRender.php
_smarty = new Smarty();
  // configure smarty
  if (is_array ( $this->config )) {
   foreach ( $this->config as $key => $value ) {
    if ($key {0} != '_') { // not setting semi-private properties
     $this->_smarty->$key = $value;
    }
   }
  }
  Yii::registerAutoloader('smartyAutoload');
}
public function renderFile($context, $file, $data, $return) {
   foreach ($data as $key => $value)
    $this->_smarty->assign($key, $value);
  $return = $this->_smarty->fetch($file);
  if ($return)
    return $return;
  else
    echo $return;
}
}
1.4,验证
新建一个HelloController.php
render('world', array('content'=>'hello world'));
}
}
新建一个word.html

{#$content#}

二、CI框架+smarty模板
网上很多方法,将smarty作为一个普通的library,在使用的时候,controller代码类似于下面:
public function index()
{
  $this->load->library('smarty/Ci_smarty', '', 'smarty');
  $this->smarty->assign("title","恭喜你smarty安装成功!");
  $this->smarty->assign("body","欢迎使用smarty模板引擎");
  $arr = array(1=>'zhang',2=>'xing',3=>'wang');
  $this->smarty->assign("myarray",$arr);
  $this->smarty->display('index_2.html');
}
这种方法跟CI自带的使用模板的方法
[U]复制代码[/U] 代码如下this->load->view();
不和谐,而且要一系列的
[U]复制代码[/U] 代码如下this->smarty->assign();
语句,麻烦不说,还破坏了原本CI的简洁美,所以果断唾弃之。
那怎么保持CI加载view时的简洁美呢,答案就是覆盖Loader类的view()方法。好吧,let's begin。
2.1,条件:
到官网上现在CI框架和smarty模板。
2.2,确保CI已经能跑起来
将CI框架解压到网站跟目录下,先写一个不带smarty模板的controller输出“hello world”。
2.3,引入smarty
将smarty解压,将libs文件夹考到application/third_paty下面,并将libs重命名smarty,重命名取什么都ok了,这里就叫smarty吧。
2.4,覆盖loader类的view()方法
因为view()方法在Loader类里,所以我要覆盖Loader的view()方法。
先看看$this->load->view()是怎么工作的?CI_Controller类的构造函数里有这么一行
[U]复制代码[/U] 代码如下this->load =& load_class('Loader', 'core');
load_class函数会先在application/core下面找config_item('subclass_prefix').Loader.php文件,找不到再到system/core下面找Loader.php。config_item('subclass_prefix')就是在配置文件里写的你要继承CI核心类的子类的前缀。我使用的是默认值'MY_'。找到文件后,require该文件,然后new MY_Loader(如果application/core/MY_Loader.php存在),或者是new Loader,赋值给$this->load。
在application/core下面新建一个MY_Loader.php文件
smarty = new Smarty ();
  // smarty 配置
  $this->smarty->template_dir= APPPATH.'views'.DS;//smarty模板文件指向ci的views文件夹
  $this->smarty->compile_dir = 'd:/temp/tpl_c/';
  $this->smarty->config_dir = APPPATH.'libraries/smarty/configs/';
  $this->smarty->cache_dir  = 'd:/temp/cache';
  $this->smarty->left_delimiter = '{#';
  $this->smarty->right_delimiter = '#}';
}
public function view($view, $vars = array(), $return = FALSE)
{
  // check if view file exists
  $view .= config_item('templates_ext');
  $file = APPPATH.'views'.DS.$view;
  if (! file_exists ( $file ) || realpath ( $file ) === false) {
   exit( __FILE__.' '.__LINE__."
View file {$file} does not exist,
{$file} => {$view}");
  }
  // changed by simeng in order to use smarty debug
  foreach ( $vars as $key => $value ) {
   $this->smarty->assign ( $key, $value );
  }
  // render or return
  if ($return) {
   ob_start ();
  }
  $this->smarty->display ( $view );
  if ($return) {
   $res = ob_get_contents ();
   ob_end_clean ();
   return $res;
  }
}
}
我把template_ext配置成了".html",这样就ok了。我们来验证一下吧。
2.5,验证
在controller下面建一个home.php
class Home extends CI_Controller {
public function index() {
  $data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');
  $data['title'] = "恭喜你smarty安装成功!";
  $data['body'] = "欢迎使用smarty模板引";
  $arr = array(1=>'zhang',2=>'xing',3=>'wang');
  $data['myarray'] = $arr;
  $this->load->view('index_2', $data);
}
}
在views下面建一个index_2.html


css/login.css" rel="stylesheet" type="text/css" />
smarty安装测试

{#$title#}
{#$body#}

  {#foreach from=$myarray item=v#}
  
  • {#$v#}
      {#/foreach#}


    好了,可以试试你的成果了。
    三、yaf框架+smarty模板
    yaf是利用引导文件Bootstrap.php来加载smarty。
    3.1,使用Bootstrap
    在index.php中用
    [U]复制代码[/U] 代码如下app->bootstrap()->run();
    引入Bootstrap.php文件
    3.2,在application/Bootstrap.php文件中导入smarty。
    getConfig()->smarty);
      Yaf_Dispatcher::getInstance()->setView($smarty);
    }
    }
    3.3,添加Smarty_Adapter类
    将smarty解压后放到application/library文件夹下,重命名为Smarty。在Smarty下新建Adapter.php,确保Smarty.class.php在Smarty/libs/下。Adapter.php内容:
    _smarty = new Smarty;
      if (null !== $tmplPath) {
       $this->setScriptPath($tmplPath);
      }
      foreach ($extraParams as $key => $value) {
       $this->_smarty->$key = $value;
      }
    }
    /**
      * Return the template engine object
      *
      * @return Smarty
      */
    public function getEngine() {
      return $this->_smarty;
    }
    /**
      * Set the path to the templates
      *
      * @param string $path The directory to set as the path.
      * @return void
      */
    public function setScriptPath($path)
    {
      if (is_readable($path)) {
       $this->_smarty->template_dir = $path;
       return;
      }
      throw new Exception('Invalid path provided');
    }
    /**
      * Retrieve the current template directory
      *
      * @return string
      */
    public function getScriptPath()
    {
      return $this->_smarty->template_dir;
    }
    /**
      * Alias for setScriptPath
      *
      * @param string $path
      * @param string $prefix Unused
      * @return void
      */
    public function setBasePath($path, $prefix = 'Zend_View')
    {
      return $this->setScriptPath($path);
    }
    /**
      * Alias for setScriptPath
      *
      * @param string $path
      * @param string $prefix Unused
      * @return void
      */
    public function addBasePath($path, $prefix = 'Zend_View')
    {
      return $this->setScriptPath($path);
    }
    /**
      * Assign a variable to the template
      *
      * @param string $key The variable name.
      * @param mixed $val The variable value.
      * @return void
      */
    public function __set($key, $val)
    {
      $this->_smarty->assign($key, $val);
    }
    /**
      * Allows testing with empty() and isset() to work
      *
      * @param string $key
      * @return boolean
      */
    public function __isset($key)
    {
      return (null !== $this->_smarty->get_template_vars($key));
    }
    /**
      * Allows unset() on object properties to work
      *
      * @param string $key
      * @return void
      */
    public function __unset($key)
    {
      $this->_smarty->clear_assign($key);
    }
    /**
      * Assign variables to the template
      *
      * Allows setting a specific key to the specified value, OR passing
      * an array of key => value pairs to set en masse.
      *
      * @see __set()
      * @param string|array $spec The assignment strategy to use (key or
      * array of key => value pairs)
      * @param mixed $value (Optional) If assigning a named variable,
      * use this as the value.
      * @return void
      */
    public function assign($spec, $value = null) {
      if (is_array($spec)) {
       $this->_smarty->assign($spec);
       return;
      }
      $this->_smarty->assign($spec, $value);
    }
    /**
      * Clear all assigned variables
      *
      * Clears all variables assigned to Zend_View either via
      * {@link assign()} or property overloading
      * ({@link __get()}/{@link __set()}).
      *
      * @return void
      */
    public function clearVars() {
      $this->_smarty->clear_all_assign();
    }
    /**
      * Processes a template and returns the output.
      *
      * @param string $name The template to process.
      * @return string The output.
      */
    public function render($name, $value = NULL) {
      return $this->_smarty->fetch($name);
    }
    public function display($name, $value = NULL) {
      echo $this->_smarty->fetch($name);
    }
    }
    3.4,smarty配置文件。
    再来看看我们的conf/application.ini文件
    [common]
    application.directory = APP_PATH "/application"
    application.dispatcher.catchException = TRUE
    application.view.ext="tpl"
    [smarty : common]
    ;configures for smarty
    smarty.left_delimiter = "{#"
    smarty.right_delimiter = "#}"
    smarty.template_dir  = APP_PATH "/application/views/"
    smarty.compile_dir  = '/data1/www/cache/'
    smarty.cache_dir  = '/data1/www/cache/'
    [product : smarty]
    3.5,验证
    新建一个controller,添加方法:
    public function twoAction() {
      $this->getView()->assign('content', 'hello World');
    }
    新建一个模板two.tpl
    A Smarty Adapter Example

    {#$content#}

    希望本文所述对大家PHP程序设计有所帮助。
                
                
    您可能感兴趣的文章:
  • jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
  • firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
  • PHP扩展框架之Yaf框架的安装与使用
  • BootStrap中Datetimepicker和uploadify插件应用实例小结
  • jQuery.Uploadify插件实现带进度条的批量上传功能
  • PHP Yaf框架的简单安装使用教程(推荐)
  • PHP实现多图上传(结合uploadify插件)思路分析
  • 基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端