创建模板类:通过更改模板文件的目录来丢失图像和样式

时间:2013-02-20 21:08:33

标签: php html template-engine

我正在为已经等待的模板编写模板引擎。

现在在你说这是多么重要之前。我得到报酬并且我不知道为什么他们坚持要拥有自己的一个(可能因为模板已经完成并且已经标记了它)。

他们已经标记了这样的模板:

的index.html

<html>
<head><title> [title] </title></head>
<link href="css/style.css" rel="stylesheet" type="text/css" />

<body>
<img class="header" src="images/header.jpg" />
[contents]
</body>

</html>

我正在使用一种非常简单的查找和替换方法,它的效果非常好:

的index.php

$e = new tengine ;
$e->load_template('index.html');// basically file_get_contents 

$e->replace('title' , 'zzzzzzz'); 

$e->replace( 'contents' , 'xxxx');

$e->show();

它们在同一目录中时工作正常。

现在我想将我的资源移动到另一个名为templates的目录。

所以我必须像这样调用我的模板:

index.php

    $e->load_template('template/index.html');

现在,呈现模板的页面(index.php)与模板文件(index.html)不在同一目录中。

它仍然有效,但我丢失了模板页面中的所有样式和图像以及.js,因为它们位于模板目录中,我将页面呈现在它们上面的一个目录中。

有任何变通方法吗?请记住,模板已经完成并创建某种类型的GLOBAL base_url并且更改所有图像和.js / .css链接是不可能的。

9 个答案:

答案 0 :(得分:3)

我还建议创建一个.htaccess文件,将每个请求重写为&#34; templates /&#34;子目录,除非所请求的文件存在(因此,index.php或webroot中的其他文件仍可正常提供):

启用&#34; mod_rewrite&#34;对于apache2。在shell类型:

a2enmod rewrite

放一个名为&#34; .htaccess&#34;的文件在Web应用程序的根目录中,包含以下内容:

RewriteEngine On

# If the requested file does not exist redirect it to the "template/" subdirectory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.*)$ template/$1 [L]

现在,如果你需要&#34; css / style.css&#34; &#34; RewriteCond&#34;声明会注意到没有&#34; css / style.css&#34;并将请求重写为&#34; template / css / style.css&#34;。但是如果你要求&#34; index.php&#34;重写条件会注意到有一个具有这样名称的文件,并且通常会提供它。

答案 1 :(得分:2)

只使用媒体文件的绝对路径而不是相对路径。所以,而不是使用像

这样的东西
 <img src='../assets/img/temp.png' />

或     

使用

 <img src='/assets/img/temp.png' />

和      

然后,你的处理过程,你的模板所在的位置,调用文件的server-dir等等都不再重要。你可以将它们转移到你心中的内容,它不会有任何区别。

答案 2 :(得分:2)

您可以使用.htaccess重写引擎

例如,为css文件夹创建重写规则并将其发送到http://www.mysite.com/css/

使用重写模块我相信你可以以某种方式处理它。

答案 3 :(得分:1)

怎么样?     目录名(文件) '/使用example.php'。

使用dirname文件,您就在文件所在的位置

答案 4 :(得分:1)

这是因为'css'目录位于模板目录中,浏览器无法访问它。 将'css'目录放在视图目录中或使用精确的地址。

答案 5 :(得分:1)

如果可以选择修改模板的html标题,则可以使用 base 标记更改文档中所有相对网址的基本网址:

<head>
<base href="http://yourdomain/template/">
...
</head>

请记住在使用任何相对路径之前将其插入顶部。

答案 6 :(得分:1)

在HTML中,有一个简单的黑客可以做你需要的东西。黑客通过基本网址,您必须添加额外的标记链接:

<head>
      <base href="domin.com/directory">
</head>

请注意,所有内容都有使用基本html标记的优点和缺点

临:

  • 不使用.htaccess

  • 不使用复制文件

  • 文件的静态表示

缺点:

  • 它会将所有href标签链接到提供的基本href,包括Anchor,link或任何使用href的东西

答案 7 :(得分:1)

我建议,资产包含也应该由您的模板引擎完成。

所以不要写

<link href="css/style.css" rel="stylesheet" type="text/css" />

在你的模板中,做这样的事情

[stylesheet css/style.css]

然后在您的引擎中使用前置资源路径创建相应的HTML。 或者您将相对目录中的css文件复制到根目录。

答案 8 :(得分:0)

我不认为模板的链接是问题,因为它不能从模板目录访问.css / .js。 这里重要的是渲染它们的文件的位置,因为链接将在渲染后被读取。 因此,只要index.php与之前的目录相同,模板中的链接仍然可以正常工作。