【问题标题】:Creating a template class: losing images and style by changing directory of template files创建模板类:通过更改模板文件目录丢失图像和样式
【发布时间】:2013-02-20 21:08:33
【问题描述】:

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

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

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

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();

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

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

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

index.php

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

现在渲染模板的页面(index.php)和模板文件(index.html)不在同一个目录下。

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

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

【问题讨论】:

    标签: php html template-engine


    【解决方案1】:

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

    为 apache2 启用“mod_rewrite”。在 shell 类型处:

    a2enmod rewrite
    

    将名为“.htaccess”的文件放在您的网络应用程序的根目录中,内容如下:

    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”,重写条件会注意到有一个具有这样名称的文件并像往常一样提供它。

    【讨论】:

    • thankx 好主意,但是如果像src="../../images/x.jpg" 这样链接图像,我最终会得到"template/../../images/x.jpg"
    • 您写道,您将模板(及其所有相关内容)移动到子文件夹“template/”中,上面的重写处理了这一点。如果您添加了指向新图像的链接,例如“../../images/x.jpg”,那么您在写“不修改模板”时是不正确的......但我很乐意忽略这一点:) 每个链接当模板被直接在“template/”子目录中调用时工作,当模板被通过 index.php 调用时也将工作。所以“../../images/x.jpg”当然会产生“template/../../images/x.jpg”,它将被解析为“../images/x.jpg”的根路径。
    • 感谢您的好意:) 但是所有图像都在模板目录中的图像目录 => 中......模板目录中可能有一些子目录......比如包含 user_sidebar 的侧边栏.php 和图像像“../img/x.jpg”一样在其中链接../img/x.jpg....任何方式都没有关系,感谢您的回答
    • 无论如何...您在询问相对路径。只要我不知道对 ../../images/x.jpg 的请求来自何处,我就无话可说。相对路径到绝对路径的转换通常由浏览器完成。因此,如果您从作为“/company/aboutus/index.html”的文件中请求“../../images/x.jpg”,那么 apache 看到的请求将是“/images/x.jpg”。 jpg”,因为浏览器已经完成了相对/绝对路径转换。
    【解决方案2】:

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

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

    使用

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

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

    【讨论】:

      【解决方案3】:

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

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

      有了重写模块,我相信你能以某种方式处理它。

      【讨论】:

        【解决方案4】:

        怎么样 目录名(文件).'/example.php';

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

        【讨论】:

        • 很抱歉,我不知道dirname 可以如何帮助我?当我获得模板的内容时,您会看到所有图像都相对于该模板链接,例如 'src="images/header.jpg"` ,但是当我显示/渲染模板时,我在模板上方的另一个目录中执行它所以'src="images/header.jpg"` 应该改为 'src="template/images/header.jpg"` 否则图片不会出现
        • change src="/path/to/img/folder/img.jpg" 就像第一个 / 你从根目录开始然后一切都好,只要你不改变 img 文件夹路径
        • 如果你在服务器上这样尝试它确实有效。你也可以做 src="yourdomain.com/pathToImgFolder/image.jpg" 但我更喜欢第一个斜杠,并且总是从 root 开始
        • 谢谢,但正如我在问题中所说,我不想更改模板(它是链接),因为它已经完成了,要全部更改需要很长时间.. . 我知道绝对路径是答案,但为时已晚。
        【解决方案5】:

        这是因为'css'目录在模板目录中,浏览器无法访问。 把'css'目录放到view目录下或者使用更准确的地址。

        【讨论】:

        • 所有链接都是相对的,所以我把css目录放在哪里都没关系。
        【解决方案6】:

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

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

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

        【讨论】:

        • thanx ,这是一个很好的解决方案,但我也必须更改模板中的相关链接。
        【解决方案7】:

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

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

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

        专业版:

        • 不使用 .htaccess

        • 不使用复制文件

        • 文档的静态表示

        缺点:

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

        【讨论】:

          【解决方案8】:

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

          所以不要写

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

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

          [stylesheet css/style.css]
          

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

          【讨论】:

          • 谢谢,好主意,但不幸的是,页面中有很多图像,它们也有同样的问题....虽然我要去这个 css 文件!
          【解决方案9】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-14
            • 1970-01-01
            • 1970-01-01
            • 2018-08-01
            • 1970-01-01
            相关资源
            最近更新 更多