使用Codeigniter的Smarty模板,当层次结构中的目录太多时无法加载模板

时间:2014-08-28 05:32:02

标签: php codeigniter templates smarty

我正在使用CI Smarty

https://github.com/Vheissu/Ci-Smarty

据我所知,这有两个问题。但是我打开这个问题的问题是,如果.tpl文件在另一个目录的目录中,我就无法加载.tpl文件。

e-g这是我目前SmartyTemplate的目录结构

--Themes
  --SomeOtherThemeName
  --Default //Default Theme Directory i am currently using
    --css
    --js
    --images
    --views
      --admin (directory)
          --sitesettings (directory)
            --site-settings.tpl (template file) //This Template file will Not Work

如果我将此模板文件移动到admin的父目录,如果我调用它,它将起作用,但如果我从sitesettings目录中调用它,它将无效。

我在此称呼它。

function functionName(){
    $data['title']="Some Title";
    $this->parser->parse('admin/sitesettings/site-settings.tpl',$this->data);
}

简单地说,仅限Smarty允许我在视图文件夹下的层次结构中有一个额外的目录,我想知道是否有任何修复,以便我可以在层次结构中拥有无限的或至少更多的目录,所以我不会' t搞砸了文件系统。


更新: 如果有人想看我的项目编码,请转到这个github项目。

https://github.com/pakistanihaider/HouseRentSystem

有关此项目的数据库。

http://www.mediafire.com/view/1jp9u906r8i10u0/houserentsystem.sql

注意:无法在此处附加文件,因此在mediafire上传了.sql文件并添加了链接。如果有任何针对它的规则,管理员肯定可以删除该链接,但请让我知道提供文件链接的正确方法。


感谢@Sauryabhatt以某种方式找到了主要问题。 我认为问题存在于{{extends file='adminLayout.tpl'}} 它是如何知道文件存在的位置的,我的意思是如果我在大多数内部目录中移动文件,它将如何知道主布局文件退出到哪个子项。扩展文件时是否需要定义路径?


更新 还想尝试定义布局的路径,但似乎它也没有为我做好。

$this->parser->parse('extends:layouts/adminLayout.tpl|file:systemConfigurationSitePreferences.tpl',$this->data);

如果我将失败放在管理员目录中,它会起作用,但如果我将文件移到另一个管理目录目录中,它就会停止工作。

5 个答案:

答案 0 :(得分:1)

更改

{{include file="../admin/ui_components/user-media.tpl" name="user media"}}
<!-- #menu -->
{{include file="../admin/ui_components/left_menu.tpl" name="left menus"}}

进入这个

{{include file="{{getBasePath()}}/themes/{{$themeName}}/views/admin/ui_components/user-media.tpl" name="user media"}}
<!-- #menu -->
{{include file="{{getBasePath()}}themes/{{$themeName}}/views/admin/ui_components/left_menu.tpl" name="left menus"}}

{{include file="../admin/ui_components/top_navigation.tpl" name="top navigation"}}

进入这个

{{include file="{{getBasePath()}}/themes/{{$themeName}}/views/admin/ui_components/top_navigation.tpl" name="top navigation"}}

然后在site_helper.php文件中定义此代码

//Returns the BASEPATH for the Template
if (!function_exists('getBasePath')) {
    function getBasePath()
    {
        return FCPATH;
    }
}

最后在MY_Controller

中定义您的主题
$this->data['themeName'] = 'default';

然后你们都完成了。尝试并运行该应用程序。希望它现在适合你。

答案 1 :(得分:0)

答案似乎很简单:一个错字。您已经错误地写了模板文件的路径。根据你提供的目录结构,你应该有这个:

$this->parser->parse('admin/sitesettings/site-settings.tpl',$this->data);

而不是:

$this->parser->parse('admin/sitesitesettings/site-settings.tpl',$this->data);

我还使用CI-Smarty进行了快速的CI设置,以确保它与多个子目录一起正常工作。

答案 2 :(得分:0)

检查库,我认为你应该修改文件libraries/MY_Parserhttps://github.com/Vheissu/Ci-Smarty/blob/master/libraries/MY_Parser.php)。在那里,您可以找到以下方法:

  • parse:您调用的方法
  • _find_view:该方法将检查文件是否存在

当您调用parse时,它会调用_find_view从两个位置加载路径:在第307行,加载

$locations = $this->_template_locations;

其中_template_locations是第375行中方法_update_theme_paths()中加载的数组:

$this->_template_locations = array(
    config_item('smarty.theme_path') . $this->_theme_name . '/views/modules/' . $this->_module .'/layouts/',
    config_item('smarty.theme_path') . $this->_theme_name . '/views/modules/' . $this->_module .'/',
    config_item('smarty.theme_path') . $this->_theme_name . '/views/layouts/',
    config_item('smarty.theme_path') . $this->_theme_name . '/views/',
    APPPATH . 'modules/' . $this->_module . '/views/layouts/',
    APPPATH . 'modules/' . $this->_module . '/views/',
    APPPATH . 'views/layouts/',
    APPPATH . 'views/'
    // Here, load your custom path:
    APPPATH . 'views/admin/sitesettings'
);

和第314行,使用$ new_locations:

$new_locations = array(
    config_item('smarty.theme_path') . $this->_theme_name . '/views/modules/' . $current_module .'/layouts/',
    config_item('smarty.theme_path') . $this->_theme_name . '/views/modules/' . $current_module .'/',
    APPPATH . 'modules/' . $current_module . '/views/layouts/',
    APPPATH . 'modules/' . $current_module . '/views/'
);

我还没有测试过,抱歉,但我认为如果你在那里添加文件夹的路径,它会找到你的文件,你就可以增加你的目录路径了。如果要在方法_update_theme_paths()中自动将文件夹结构添加到数组中,请检查: PHP SPL RecursiveDirectoryIterator RecursiveIteratorIterator retrieving the full tree并将其添加到_update_theme_paths(),它会自动执行,XD

答案 3 :(得分:0)

如果您的智能版本是2.1或更高版本,则无需编写目录名称,只需文件名即可。

使用此

$this->parser->parse('site-settings.tpl',$this->data);

而不是

$this->parser->parse('admin/sitesettings/site-settings.tpl',$this->data);

前端控制器代码

class   Frontend_Controller extends CI_Controller{

function __construct() {
    parent::__construct();
    $this->data['errors'] = array();
    $this->data['site_name'] = array();
    $this->load->library('Smarty.php');
    $this->load->library('parser');
    $this->load->model('Common_Model');
    $this->load->model('users_management/login_check');
   }
}

main.php index.php函数的代码

$myArray = array('Controller' => $this->router->fetch_class(), 'Method' => $this->router->fetch_method());
    $this->smarty->assign('Fetch', $myArray);

    $this->smarty->assign("lang", "english");
    $data['template'] = "home.tpl";
    $data['templateName'] = "Home template";
    $this->parser->parse('test/test1/test2/testsaurabh.tpl', $data);

答案 4 :(得分:0)

OMG,Aftr很长一段时间,我几乎尝试了所有东西,我甚至下载了斑马CMS,看看为什么代码工作而不是我的,xD我甚至尝试用我的代码更改代码,即使知道它不会解决任何问题只是希望。的xD

但最后我终于看到了真正的问题, 当我试图将模板文件放在目录的另一个目录中时,相对路径在管理员布局中受到干扰。

我在单独的文件中有一些文件组件,比如菜单选项卡,我在主布局文件中包含了这些文件。 E-G:

{{include file="../admin/ui_components/user-media.tpl" name="user media"}}

所以如果模板位于1个目录中,那么模板正在工作但是当我尝试添加1个目录并将文件放入其中时,路径给出了错误。

CI Smarty的最大问题是,如果有关于tpl文件的任何错误,它永远不会给错误提供白色空白页。

如果错误系统会很好,我可能会更快地找到解决方案。

无论如何,现在只是添加了基本路径,所以无论我进入多少目录,它都不会给出任何问题..

感谢您的所有支持。看起来像我的Bounty Wasted xD ..