Использование определенных функций, связанных с drupal, в файле, отличном от drupal.php ВНУТРИ dirpal dir - PullRequest
0 голосов
/ 27 июля 2011

Доброе утро всем.У меня возникают некоторые проблемы при попытке заставить функцию «field_file_load» работать в сценарии php, который я сделал для обработки вызова AJAX.

Я читал о начальной загрузке основных элементов drupal внутри, но это непохоже, не работает.

До сих пор я успешно заполнил поле выбора, используя данные из другого окна выбора, выполнив AJAX-вызов этого php-файла (который находится в папке 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 удобно установлен в корне, как я могу выяснить путь к сайту hpdocs сайта drupal?

Кроме того, может ли вызов полной начальной загрузки (а не только необходимой части) вызвать некоторые проблемы?

Итак, вкратце: 1] как я могу вызвать функцию drupal (в данном случае, котораяпроисходит из модуля filefiled) в не-drupal php-скрипте, который, тем не менее, находится в каталоге drupal?

2] Какой правильный способ загрузки?3] Нужно ли подключаться к БД (как в предыдущем рабочем примере) В ДОПОЛНЕНИЕ к начальной загрузке?

Или, наконец,.есть другой, более быстрый способ узнать, как делать то, что мне нужно?

Заранее спасибо за любой ответ.

1 Ответ

2 голосов
/ 27 июля 2011

Хм, это странно. Если модуль 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. вручную подключается к базе данных Drupal с простыми функциями mysql вместо функций API Drupal DB, чтобы
  2. извлечение информации CCK с помощью запроса, который на 100% уязвим для внедрения SQL, и
  3. все это помещается в каталог тем не менее!

Так что вы можете переосмыслить свой угол атаки здесь, понимаете? Может быть, сделать для этого специальный модуль.

Но если вам просто нужно сделать что-то таким образом (по причинам, о которых я не могу думать), то, по крайней мере, используйте db_query , чтобы вам не приходилось делать весь mysql_connect () и делать что-то вроде

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

... для не менее некоторого степени безопасности.

Я бы также рекомендовал вам немного просмотреть соответствующие модули (FileField и т. Д.), Чтобы узнать, есть ли у них API (или, по крайней мере, некоторые внутренние функции), которые могут возвращать то, что вы пытаетесь получить с помощью простых запросов к БД.

...