我正在为已经等待的模板编写模板引擎。
现在在你说这是多么重要之前。我得到报酬并且我不知道为什么他们坚持要拥有自己的一个(可能因为模板已经完成并且已经标记了它)。
他们已经标记了这样的模板:
的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链接是不可能的。
答案 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)
答案 3 :(得分:1)
使用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
不使用复制文件
文件的静态表示
缺点:
答案 7 :(得分:1)
我建议,资产包含也应该由您的模板引擎完成。
所以不要写
<link href="css/style.css" rel="stylesheet" type="text/css" />
在你的模板中,做这样的事情
[stylesheet css/style.css]
然后在您的引擎中使用前置资源路径创建相应的HTML。 或者您将相对目录中的css文件复制到根目录。
答案 8 :(得分:0)
我不认为模板的链接是问题,因为它不能从模板目录访问.css / .js。 这里重要的是渲染它们的文件的位置,因为链接将在渲染后被读取。 因此,只要index.php与之前的目录相同,模板中的链接仍然可以正常工作。