0

我正在 mydomain.com/drupalsite 上的一个 drupal 6 站点上工作,设计师在其中放置了许多硬编码的图像路径,例如 mydomain.com/drupalsite/img 中的自定义 img 文件夹。所以很多网站都使用指向/drupalsite/img/myimg1.png 的链接。

这就是问题所在——通过将 finaldomain.com 指向 mydomain.com/drupalsite,该站点最终会迁移到 finaldomain.com。所以现在像 /drupalsite/img/myimg1.png 这样的路径将解析为 finaldomain.com/drupalsite/img/myimg1.png,而不是应该是 finaldomain.com/img/myimg1.png。finaldomain.com 站点必须指向该子目录,以便访问 index.php。

我的第一直觉是使用 .htaccess 文件将 /drupalsite 替换为“”,但我尝试了大约十几种不同的解决方案,但都没有奏效。我的解决方案是使用一些 ln -s 链接,但我真的不喜欢它:) tia

安德鲁

4

3 回答 3

2

事后看来,最好的方法是确保人们使用 Drupal 函数来建立所有链接:

  • l(那是字母L)
  • drupal_get_path()
  • base_path()

l()函数解决了基本路径问题,并提供了一种系统化的方式来定义您的 URL。使用诸如theme_image()plusl()功能之类的东西是肯定的。如果您必须编写自己的<a>标签并在主题函数(如theme_image().

但是对于您目前的情况:

至于 Andy 的解决方案,如果您可以将更改限制在您知道链接所在的某些数据库字段中,那就更好了。

所以编写一个查询来选择所有这些字段(例如所有正文字段):

$my_query = db_query("SELECT vid, body FROM {node_revisions}");

例如,这将使您获得表body中的每个字段node_revisions,因此即使您的旧修订版也将具有正确的链接。

然后运行这些结果,str_replace()对每个结果进行操作,然后将更改写回:

while($node = db_fetch_object($my_query)) {
  $new_body = str_replace('what you have', 'what you want', $node->body);
  db_query("UPDATE {node_revisions} SET body = '%s' WHERE vid = %d", $new_body, $node->vid);
}

我显然会先在一个记录上尝试它,以确保您的代码按预期运行(只需添加一个WHERE vid = 5,例如,将其缩小到一个修订版)。此外,我没有利用node_loadand node_save,它更适合正确加载和保存节点,以便提供更通用的解决方案(供您替换块中的文本等)。

对于您的文件,我会建议一个好的 ol'sed命令,通过在您的“站点”文件夹中运行类似以下内容:

find ./ -type f -exec sed -i ’s/string1/string2/’ {} \;

从这里找到了,所以看看那个网站以获得更多解释。如果你要使用路径,你要么需要/在你的命令版本中转义路径sed,要么使用不同的sed分隔符(即你可以写s#string1#string2#而不是s/string1/string2/,所以你可以写s#/drupalsite/img/#/img#而不是s/\/drupalsite\/img\//\/img/:- )。另请参阅 Drupal 手册页面以获取快速sed命令:http ://drupal.org/node/128513 。

有点乱,这就是为什么我尝试预先使用正确的功能。但是,如果您希望他们创建 Drupal 内容但又不想让他们访问“PHP 过滤器”输入格式,或者他们根本不了解 PHP,这将是困难的。正确的 Drupal 主题,在基本的 HTML/CSS 工作之后的任何时候,都需要 PHP 和 Drupal 的主题相关函数的知识。

于 2010-07-27T15:04:16.567 回答
0

我之前通过获取完整的数据库转储,在文本编辑器中打开它并在路径上进行全局搜索和替换来完成此操作。然后在新主机上,加载修改后的转储文件,它将有正确的路径。

于 2010-07-27T08:25:01.840 回答
0

您可以尝试Pathologic,它应该能够纠正这样的路径。

于 2010-07-27T08:25:04.040 回答