DrupalからPHPスクリプトを呼び出すと、Drupal外で呼び出す場合とは異なる結果が得られます


7

私はGoogle Apps Shortlink Apiを使用してShortlinkを作成するモジュールを作成しようとしています(まだラボにあるので文書化されていません)。

これがスクリプトです(これも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 = 'username@mydomain.com';

  // 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;
  }
}

このスクリプトは、SHortLink.phpと呼ばれるカスタム作成されたクラスを使用します。

編集:この関数は、Drupalのnode-news.tpl.phpで次のように呼び出されます。

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

?>

私がに行くときhttp://www.mydomain.com/test/test.php、スクリプトは正常に動作しますし、私はGoogleからの「OK」の応答を取得します。短いリンクが作成され、正常に動作します。ニュースノードに移動すると、スクリプトは正常に実行されますが、Googleは403(禁止)エラーで応答します。

EDIT_1:このスクリプトは機能します。ですから、この背後にある共鳴は、スクリプト自体ではなくdrupalに関係していると考えることができます。

EDIT_2:これの背後にある本当の質問は次のとおりだと思います:drupalから呼び出されたときにスクリプトが異なる動作をする理由は何ですか?ブレーンストーミング、アイデア、ヒント、トラブルシューティングの方法など、役立つと思われるあらゆる情報をいただければ幸いです。


これは答えではありませんが、コメントを投稿することはできません。私はあなたとgoogleのコードを見ていて、それを理解できません(私は自分をテストするのが面倒なので)エンコーディングの問題かもしれませんか?
ピエール、

エンコーディングとは、ファイルのエンコーディングを意味しますか?すべてのファイルをブームなしのUTF-8に設定しました。
Tivie

4
別のファイルとDrupal内の両方でその関数を正確に呼び出す方法を含めることができますか?あなたが投稿したものが有効なPHPではないため...(print function function_name(..)
Berdir

2
本当にinclude_once( 'ShortLink.php'); 期待どおりに動作しますか?このファイルは本当にdrupalディレクトリのルートにありますか?
ダニエルウェナー

2
ブレインストーミングの精神で、私の最初の考えは、おそらくDrupalがShortLinkのグローバルと名前空間を共有するいくつかのグローバルを設定することです-コードでグローバルDrupal $ userオブジェクトを開始していなくても、特に$ userはフラグを立てます。それらの変数名のいくつかを変更して、まだ問題があるかどうかを確認してください。
cam8001

回答:


3

あなたは本当にinclude_onceを使うべきではなく、代わりにmodule_load_includeを使うべきです

これが完了したら、デバッグコードをインクルードファイルに入れて、確実に読み込まれるようにします。

また、インクルードファイルには名前空間関数が含まれ、関数スコープの外で使用される変数はありません。発生する可能性のある名前の衝突を回避するため。

その上、本当に誰もが提供できる多くの助けはありません。スクリプトは、Drupalでも通常のphpファイルに含まれている場合と同じように機能します。


module_load_includeを使用して提案を追跡しました。同じこと。ファイルは正しくロードされていますが、Googleは403 forbiddenで応答します。インクルードされるファイルはクラスです。\名前空間の2つの関数を削除しましたが、違いはありませんでした。
Tivie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.