Gọi một đoạn mã PHP từ Drupal lấy kết quả khác với gọi nó bên ngoài Drupal


7

Tôi đang cố gắng tạo một mô-đun tạo Shortlink bằng Google Apps Shortlink Api (không có giấy tờ kể từ khi nó vẫn còn trong phòng thí nghiệm).

Đây là tập lệnh (cũng tại 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;
  }
}

Kịch bản lệnh này sử dụng một lớp được tạo tùy chỉnh có tên là SHortLink.php .

EDIT: Hàm này được gọi trong nút-news.tpl.php của Drupal như thế này:

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

?>

Khi tôi truy cập http://www.mydomain.com/test/test.php , tập lệnh hoạt động tốt và tôi nhận được phản hồi 'ok' từ google; một liên kết ngắn được tạo ra và nó hoạt động tốt. Khi tôi điều hướng đến một nút tin tức, tập lệnh chạy OK, nhưng Google phản hồi với lỗi 403 (bị cấm).

EDIT_1: CÔNG TRÌNH SCRIPT NÀY. Vì vậy, tôi nghĩ rằng tôi có thể giả định một cách an toàn rằng tiếng vang đằng sau điều này có liên quan đến drupal hơn là chính kịch bản.

EDIT_2: Tôi nghĩ rằng câu hỏi thực sự đằng sau điều này là: Những lý do nào có thể khiến một kịch bản hành xử khác đi khi được gọi từ drupal? Bất kỳ đầu vào nào cũng sẽ được đánh giá cao: động não, ý tưởng, mẹo, phương pháp khắc phục sự cố, bất cứ điều gì bạn nghĩ có thể giúp ích, tôi sẽ thực sự đánh giá cao nó.


Đây không phải là một câu trả lời nhưng tôi không thể đăng bình luận: Tôi đang xem mã của bạn và google và tôi không thể tìm ra nó (tôi quá lười để tự kiểm tra) có thể là một vấn đề mã hóa?
Pierre

bằng cách mã hóa bạn có nghĩa là mã hóa tập tin? Tôi đã đặt tất cả các tệp thành UTF-8 mà không cần BOOM.
Tivie

4
Bạn có thể bao gồm cách bạn gọi chính xác chức năng đó trong cả tệp riêng biệt và bên trong Drupal không? Bởi vì những gì bạn đã đăng không hợp lệ PHP ... ( print function function_name(..))
Berdir

2
Bạn có chắc chắn bao gồm_once ('ShortLink.php'); Công trình như mong đợi? Là tập tin này thực sự trong thư mục gốc của bạn?
Daniel Wehner

2
Theo tinh thần động não, suy nghĩ đầu tiên của tôi là có lẽ Drupal thiết lập một số thế giới chia sẻ một không gian tên với những người trong ShortLink - đặc biệt là người dùng tăng cờ, mặc dù bạn không khởi tạo đối tượng người dùng Drupal $ toàn cầu trong mã của mình. Hãy thử thay đổi một vài trong số các tên biến đó và xem nếu bạn vẫn có vấn đề.
cam8001

Câu trả lời:


3

Bạn thực sự không nên sử dụng include_once, thay vào đó bạn nên sử dụng module_load_include .

Sau khi hoàn thành, hãy bắt đầu nhập mã Debug vào tệp đính kèm của bạn để đảm bảo rằng nó được tải.

Cũng làm cho tệp bao gồm của bạn chứa các hàm không gian tên và không có biến nào được sử dụng ngoài phạm vi hàm. Để tránh bất kỳ va chạm đặt tên có thể xảy ra.

Bên cạnh đó, thực sự không có nhiều trợ giúp ai có thể cung cấp. Một tập lệnh sẽ hoạt động theo cách tương tự trong Drupal giống như khi được đưa vào một tệp php thông thường.


Đã theo dõi đường của bạn bằng module_load_include. Điều tương tự. Tệp đang được tải chính xác nhưng google phản hồi với 403 bị cấm. Các tập tin bao gồm là một lớp. Tôi đã loại bỏ 2 hàm trong không gian tên \ nhưng nó không có gì khác biệt.
Tivie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.