模板库

时间:2013-10-17 18:50:38

标签: php codeigniter

我正在尝试使用由Phil Sturgeon创建的模板库。他的模板库有一些很棒的文档,但是我对文件结构的完成方式遇到了一些问题。

-views
    -layouts
        -default.php
    -partials
        -header_view.php
        -footer_view.php
        -metadata_view.php
    login_view.php

在我的登录控制器索引函数内部,我有以下代码来确定要使用哪个布局以及要加载哪个视图作为模板的主体。我还在header_view.php文件中包含了我所拥有的内容,我认为这是我无法正常工作的内容。我希望能够将header_view内部的元数据部分定位。根据我正在正确执行的文档,我收到来自header_view.php文件的错误未定义索引元数据。关于这个问题的任何启示。

来自github repostitory的文件:https://github.com/philsturgeon/codeigniter-template

$this->template
        ->title('Login Form')
        ->set_partial('header', 'partials/header_view')
        ->set_partial('metadata', 'partials/metadata_view')
        ->set_partial('footer', 'partials/footer_view')
        ->set_layout('default')
        ->build('login_form_view');

如default.php

<?php echo $template['partials']['header']; ?>

<?php echo $template['body']; ?>

<?php echo $template['partials']['footer']; ?>

header_view.php

<!DOCTYPE html>
<html>
<head>
    <title><?php echo $template['title']; ?></title>
    <?php echo $template['partials']['metadata']; ?>

</head>

    <body

1 个答案:

答案 0 :(得分:2)

好吧,我是一个代码签名粉丝;我真的认为CI的真正力量并没有带来花哨的“TEMPLATING lib”或auth lib;然而,它为你提供了所有工具,可以迅速而非常快速地建立自己的工具;

所以我的答案不是你真正要求的,而是一个简单的例子,说明你如何在不到10分钟的时间内在ci中建立你自己所谓的模板化lib,并且无条件地工作;

  1. 在applicaiton / core文件夹中创建MY_Controller;

    class MY_Controller extends CI_Controller {
    
    protected $noEcho=true,$body = 'base/layout', $title = 'YOUR CONTROLLER TITLE',
    $js = array(), //filename
    $inline_js = '', //script
    $css = array(), 
    $inline_css = '', //style
    $content = array(); //html
    
  2. 里面将是3个基本功能

    1. 为您设置页面部分;
    2. 管理您的资产
    3. 打印出您的最终结果页面;
    4. 1

      function output($data,$section='content'){
      
      //checking type of data to be pushed its either array or string(html)
      //this is a view it should be formated like this array( viewname,$data )
      if( is_array($data) ){
        $this->content[ $section ][] = $this->load->view( $data[0], $data[1], TRUE );
      
        return $this;//to allow chaing
      
      }elseif( is_string($data) ){//this is html
      
        $this->content[ $section ][] = $data;
        return $this;//to allow chaing
      }
      
      }
      

      2nd是一个允许你向这个页面添加js,css和内联js&amp; css的函数;

      function _asset( $link, $txt = FALSE ) {
      
      if ( $txt !== FALSE ) {
        if ( $txt == 'js' )
          $this->inline_js[] = $txt;
        elseif ( $txt == 'css' )
          $this->inline_css[] = $txt;
      }else{
        if ( pathinfo( $link, PATHINFO_EXTENSION ) == 'css' ){
          $this->css[] = link_tag( base_url( 'assets/css/' . trim( $link, "/\\" ) ) );
        }else{
          $this->js[] = '<script src="' . base_url( 'assets/js/' . trim( $link, "/\\" ) ) . '"></script>';
        }   
      }
      return $this;
      }
      

      最后是一个将所有部分组合在一起的功能;

      protected function print_page(){
      
        if ( $this->noEcho ) ob_clean();
      
        $data=array();
      
        $data[ 'title' ] = $this->title;
        $data[ 'css' ]        = is_array( $this->css ) ? implode( "\n", $this->css ) : '';
        $data[ 'js' ]         = is_array( $this->js ) ? implode( "\n", $this->js ) : '';
        $data[ 'inline_css' ] = ( $this->inline_css ) ? '<style>' . implode( "\n", $this->inline_css ) . '</style>' : '';
        $data[ 'inline_js' ]  = ( $this->inline_js ) ? implode( "\n", $this->inline_js ) : '';
      
        foreach ( $this->content as $section => $content ) {
          $data[ $section ] = is_array( $content ) ? implode( "\n\n\n ", $content ) : $content;
        } //$this->content as $section => $content
      
        return $this->load->view( $this->body, $data );
      
      }
      

      现在将所有三个放在一起并将控制器扩展到此基本控制器;

      现在对于您正在尝试构建的示例页面,我会这样做:

      控制器:

      public function __construct() {
        parent::__construct();
        $this->title = 'Controller title';
        $this->body = 'base/default';
        //load all your assets.. if its across all pages then load them in MY_controller construct
        $this->assets('jquery.min.js')
             ->assets('bootstrap.css')
             ->assets('alert("itworks");','js');//will be added to $inline_js
      }
      
      function index(){
      
      $var = $This->some_model->get_data();
      
      $this->output( array('some_View',$var) )
           ->output('<hr/>')
           ->output('THIS WILL BE IN $FOOTER','footer')
           ->print_page();
      
      }
      

      现在有多干净了:) ?;

      现在您的控制器将加载this->body上的视图集,并将所有部分传递给它。 所以对于上面的示例,您的视图将收到2个变量。

      1. $ content:ill contail some_view view +
      2. $ footer:将包含我们传递给它的html;
      3. $ css,$ js,$ inline_js,$ inline_css变量包含您的所有资产
      4. $ title包含您的页面标题;
      5. 结束 我希望我希望这个小型演示可以帮助您理解这三个小功能可以通过CI本机视图加载器实现的无限可能性。