Das Aufrufen eines PHP-Skripts von Drupal ruft ein anderes Ergebnis ab als das Aufrufen außerhalb von Drupal

7

Ich versuche, ein Modul zu erstellen, das einen Shortlink mit der Google Apps Shortlink-API erstellt (undokumentiert, da es sich noch in den Labors befindet).

Hier ist das Skript (auch unter http://drupalbin.com/18667 ):

function drapps_shortlinks_createlink($url, $verbose = FALSE, $bypass_validattion = FALSE) {
  //loads ShortLink Class
  include_once('ShortLink.php');

  // URL validation with 2 clauses:
  // 1 - FILTER_VALIDATE_URL -> tests if the url is well constructed
  // 2 - @fopen -> tests if the URL actually exist
  if (!filter_var($url, FILTER_VALIDATE_URL) OR !@fopen($url,"r")) {
    // URL not valid or inexistant, so bail
    if ($verbose) {
      $msg = 'Invalid URL';
      return $msg;
    }
    else {
      return;
    }
  }

  // Get configuration values
  $domain = 'mydomain.com';
  $key = 'someHMACKEY';
  $user = '[email protected]';

  // Check if user admin has configured DRAPPS and DRAPPS ShortLinks
  if (!$domain OR !$key OR !$user) {
    //Something is missing so bail
    if ($verbose) {
      $msg = 'DRAPPS Shortlinks is not configured. Please go to <a href="' . base_path() . 'admin/settings/drapps">admin/settings/drapps</a>';
      return $msg;
    }
    else {
      return;
    }
  }

  //PHP Google Apps ShortLinks Implementation
  $slink = new ShortLink($domain, $key, $user);
  $r = clone $slink->pub($url);
  $status = $r->status;

  if ($status == 'ok') {
    return $r;
  }
  elseif ($verbose) {
    return $status;
  }
  else {
    return;
  }
}

Dieses Skript verwendet eine benutzerdefinierte Klasse namens SHortLink.php .

BEARBEITEN: Diese Funktion wird in Drupals node-news.tpl.php wie folgt aufgerufen:

...
<div class="test"><?php print drapps_shortlinks_createlink($url, TRUE, FALSE); ?></div>
...

test.php

<?php

$path = "path/to/drupal"; //changed for security reasons

include_once($path . 'sites/all/modules/drapps_shortlinks/drapps_shortlinks.inc');

$url = 'http://www.google.com/';

print drapps_shortlinks_createlink($url, TRUE, FALSE);

?>

Wenn ich zu http://www.mydomain.com/test/test.php gehe , funktioniert das Skript einwandfrei und ich erhalte eine "OK" -Antwort von Google. Ein kurzer Link wird erstellt und funktioniert einwandfrei. Wenn ich zu einem Nachrichtenknoten navigiere, wird das Skript in Ordnung ausgeführt, Google antwortet jedoch mit einem 403-Fehler (verboten).

EDIT_1: DIESES SCRIPT FUNKTIONIERT. Ich kann also mit Sicherheit davon ausgehen, dass der Resonanz dahinter eher mit Drupal als mit dem Skript selbst zu tun hat.

EDIT_2: Ich denke, die eigentliche Frage dahinter ist: Welche Gründe könnten dazu führen, dass sich ein Skript anders verhält, wenn es von Drupal aufgerufen wird? Jede Eingabe wird geschätzt: Brainstorming, Ideen, Tipps, Methoden zur Fehlerbehebung, alles, was Sie für hilfreich halten, werde ich wirklich schätzen.

Tivie
quelle
Dies ist keine Antwort, aber ich kann keine Kommentare posten: Ich schaue auf Ihren und Googles Code und kann ihn nicht herausfinden (ich bin zu faul, um mich selbst zu testen). Könnte dies möglicherweise ein Codierungsproblem sein?
Pierre
Mit Kodierung meinen Sie die Dateikodierung? Ich habe alle Dateien ohne BOOM auf UTF-8 gesetzt.
Tivie
4
Können Sie angeben, wie Sie diese Funktion sowohl in der separaten Datei als auch in Drupal genau aufrufen? Weil das, was Sie gepostet haben, nicht gültig ist PHP ... ( print function function_name(..))
Berdir
2
Sind Sie sicher, include_once ('ShortLink.php'); funktioniert wie erwartet? Befindet sich diese Datei wirklich im Stammverzeichnis Ihres Drupal-Verzeichnisses?
Daniel Wehner
2
Im Geiste des Brainstormings ist mein erster Gedanke, dass Drupal möglicherweise einige Globals setzt, die einen Namespace mit denen in ShortLink teilen - insbesondere $ user löst Flags aus, obwohl Sie das globale Drupal $ user-Objekt in Ihrem Code nicht initiieren. Versuchen Sie, einige dieser Variablennamen zu ändern und festzustellen, ob noch Probleme auftreten.
Cam8001

Antworten:

3

Sie sollten include_once wirklich nicht verwenden. Stattdessen sollten Sie module_load_include verwenden .

Nachdem Sie dies getan haben, fügen Sie Debug-Code in Ihre Include-Datei ein, um sicherzustellen, dass er geladen wird.

Außerdem enthält Ihre Include-Datei Namespace-Funktionen und keine Variable, die außerhalb eines Funktionsbereichs verwendet wird. Um mögliche Namenskollisionen zu vermeiden.

Abgesehen davon gibt es wirklich nicht viel Hilfe, die jemand leisten kann. Ein Skript funktioniert in Drupal genauso wie in einer regulären PHP-Datei.

Ericduran
quelle
Befolgen Sie Ihren Vorschlag mit module_load_include. Gleiche Sache. Die Datei wird korrekt geladen, aber Google antwortet mit 403 verboten. Die enthaltene Datei ist eine Klasse. Ich habe die 2 Funktionen im \ Namespace entfernt, aber es machte keinen Unterschied.
Tivie