【问题标题】:Using specific drupal-related functions in a non-drupal.php file INSIDE the drupal dir在 drupal 目录内部的 non-drupal.php 文件中使用特定的 drupal 相关函数
【发布时间】:2011-07-27 09:23:34
【问题描述】:

大家早上好。 我在尝试使函数“field_file_load”在我为处理 AJAX 调用而完成的 php 脚本中工作时遇到了一些问题。

我已经阅读了有关在内部引导 drupal 核心元素的信息,但它似乎不起作用。

到目前为止,我已经成功地使用来自另一个选择框的数据填充了一个选择框,对这个 php 文件进行了 AJAX 调用(在 drupal 目录文件夹中,准确地说是在一个主题中)

<?php
$var = $_GET['q'];

$con = mysql_connect('*******', '******', '********');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("drupal", $con);

$sql="SELECT DISTINCT xc.field_brand_value FROM node 
      INNER JOIN term_node AS tn ON node.vid = tn.vid
      LEFT JOIN content_type_extra_content AS xc ON node.vid = xc.vid 
      WHERE tn.tid IN (SELECT th.tid FROM term_hierarchy AS th WHERE th.parent = '149')
      AND xc.field_location_value = '".$var."'";

$result = mysql_query($sql);
      echo(' <select name="brand" id="brand">
      <option value="default" selected>Select a brand</option>
      ');

while($row = mysql_fetch_array($result))
      {
      echo('<option value="'.$row['field_brand_value'].'">'.$row['field_brand_value'].'</option>');
      }

echo('</select>');
mysql_close($con);
?>

这就像一个魅力,因为我所要做的就是连接到 drupal 数据库并获取所需的值。

当我想获取一些图片的 url(使用使用第一个和第二个下拉列表中的值的查询)并使用“file_field_load”加载给定图片的 url 时,就会出现问题。

我(显然)收到“调用未定义函数”错误。 所以我尝试引导drupal。

但无论如何它都不起作用。

/** bootstrap Drupal **/
chdir("/path/to/drupal/site/htdocs");
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

由于我没有对托管站点的服务器的完全访问权限,假设 drupal 安装在 root 中很方便,我如何找出 drupal 站点 htdocs 的路径?

此外,调用完整的引导程序(而不仅仅是所需的部分)会导致一些问题吗?

所以,简而言之: 1]我如何在一个非drupal php脚本中调用一个drupal函数(在这种情况下来自filefiled模块)但是驻留在drupal目录中?

2] 哪种引导方式是正确的? 3] 除了引导之外,我是否需要连接到数据库(如前面的工作示例)?

或者,最后。您知道如何做我需要做的事,还有另一种更快的方法吗?

提前感谢您的回复。

【问题讨论】:

    标签: drupal drupal-6 bootstrapping


    【解决方案1】:

    嗯,这很奇怪。如果启用了 FileField 模块,则该功能应该可用。那么可能 FileField 并没有真正启用?

    如果是这种情况,您将不得不手动添加包含函数定义的文件,即模块目录中的 field_file.inc 文件,因此您需要将该依赖项添加到你的引导代码:

    <?php
    /** bootstrap Drupal **/
    chdir("/path/to/drupal/site/htdocs");
    require_once './includes/bootstrap.inc';
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
    module_load_include('filefield', 'inc', 'field_file');
    

    AFAIK 你为从外部脚本引导 Drupal 所做的是“正确”的方式。

    现在,我不确定从大局来看,无论您尝试做什么都是个好主意...也就是说:您正在赚一点非Drupal脚本:

    1. 使用普通的 mysql 函数而不是 Drupal 的 DB API 函数手动连接到 Drupal 数据库,以便
    2. 使用 100% 易受 SQL 注入攻击的查询获取 CCK 信息,并且
    3. 所有这些都放在一个主题目录中!

    所以你可能想在这里重新考虑你的攻角,你知道吗?也许为此制作一个自定义模块。

    但如果你只是不得不以这种方式做事(出于我想不出的原因),那么至少使用db_query 这样你就不必做整个 mysql_connect( ) 的东西,然后做类似的事情

    <?php 
    db_query("YOUR BIG QUERY HERE... xc.field_location_value = '%s'", $var); 
    

    ...至少某种程度的安全性。

    我还建议您稍微浏览一下所涉及的模块(FileField 等),看看它们是否有 API(或至少一些内部函数)可能会返回您尝试通过普通 DB 查询获得的内容。

    【讨论】:

    • 感谢您的反馈。是的,我知道这是一个糟糕的解决方案,特别是用于直接连接到您提到的数据库。它实际上更像是对我正在从事的项目的测试,是关于流程“功能”的测试。最后可能我会重写所有这些,我只是在调查链接的 AJAX 调用是否按预期工作。好吧,在一个过时的笔记上(因为我正在重做这个) FileField 已启用 我非常感谢你的提示,我对大量的 drupal 自定义有点陌生,所以我对我的解决方案很糟糕并不感到惊讶我会研究这个模块方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多