0

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

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

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

索引.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>

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

索引.php

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

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

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

$e->show();

当它们在同一目录中时,它可以正常工作。

现在我想将我的资产移动到另一个名为模板的目录。

所以我必须这样称呼我的模板:

index.php

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

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

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

有什么解决方法吗?请记住,模板已经完成,创建某种 GLOBALbase_url类并更改所有图像和 .js/.css 链接是不可能的。

4

9 回答 9

3

我还建议创建一个 .htaccess 文件,重写对“templates/”子目录的每个请求,除非请求的文件存在(因此 index.php 或 webroot 中的其他文件仍然可以正常服务):

为 apache2 启用“mod_rewrite”。在外壳类型:

a2enmod rewrite

将名为“.htaccess”的文件放在您的 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]

现在,如果您请求“css/style.css”,“RewriteCond”语句将注意到没有“css/style.css”并将请求重写为“template/css/style.css”。但是,如果您请求“index.php”,重写条件会注意到有一个具有这样名称的文件并像往常一样提供它。

于 2013-02-28T09:56:04.467 回答
2

只需使用媒体文件的绝对路径而不是相对路径。所以,而不是使用类似的东西

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

或者

采用

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

然后,您的处理发生在哪里、模板所在的位置、文件从哪个服务器目录调用等都不再重要。您可以将它们转移到您心中的内容,这不会有任何区别。

于 2013-02-26T08:20:29.253 回答
2

您可以使用 .htaccess 使用重写引擎

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

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

于 2013-02-27T06:12:50.513 回答
1

目录名(文件)呢。'/example.php';

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

于 2013-02-20T21:18:15.750 回答
1

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

于 2013-02-22T21:58:49.277 回答
1

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

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

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

于 2013-02-26T09:20:46.220 回答
1

在 HTML 中有一个简单的 hack 可以用来做你需要的事情。黑客是通过基本网址,你必须添加额外的标签链接:

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

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

临:

  • 不使用 .htaccess

  • 不使用复制文件

  • 文档的静态表示

缺点:

  • 它将所有href标签链接到提供的基本href,包括锚、链接或任何使用href的东西
于 2013-02-27T10:17:04.033 回答
1

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

所以不要写

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

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

[stylesheet css/style.css]

然后在您的引擎中使用您预先添加的资产路径创建适当的 HTML。或者将相对目录中的 css 文件复制到根目录。

于 2013-03-01T10:21:35.337 回答
0

我认为模板的链接不是问题,因为它没有从模板目录访问 .css/.js 。这里重要的是呈现它们的文件的位置,因为链接将在呈现后被读取。所以只要 index.php 和以前在同一个目录下,模板中的链接应该仍然可以正常工作。

于 2013-03-01T06:48:14.290 回答