1

FPDFを使用して、チャネルデータをExpressionEngineからPDFファイルにエクスポートしています。私が使用しているFPDFは、以前に別のプロジェクトで使用したコードなので、機能するはずです。FPDFオブジェクトの通常のメソッドは機能しますが、関数にラップされるとすぐに次のようになります。

Fatal error: Call to a member function MultiCell() on a non-object

したがって、これは機能します。

include '../apps/assets/fpdf.php';
// setup the PDF object:
$pdf = new FPDF();
$pdf->SetMargins(0,0,0);
$pdf->SetAuthor("Author");
$pdf->addPage("P", "A4");
$pdf->SetTextColor(82,82,82);

// write something to the PDF:
$pdf->MultiCell(80, 6, "some text here", 0, "L");

しかし、これはしません:

include '../apps/assets/fpdf.php';
// setup the PDF object:
$pdf = new FPDF();
$pdf->SetMargins(0,0,0);
$pdf->SetAuthor("Author");
$pdf->addPage("P", "A4");
$pdf->SetTextColor(82,82,82);

writeStuff("some stuff to write");

function writeStuff($stuff) {
    global $pdf;
    $pdf->MultiCell(80, 6, $stuff, 0, "L");
}

コードの最後のブロックは、上記のようにエラーをスローします。

まったく同じセットアップが以前は機能していたので、それは奇妙です。主な違いは、今回はPHPがExpressionEngineテンプレートにラップされていることです。テンプレートではPHP解析が有効になっており、同じアプリケーションで他の多くのテンプレートを使用しており、多くのPHPが機能しています。

それはExpressionEngineの解析順序と関係がありますか?$ pdfオブジェクトが作成される前に、メソッド'writeStuff'が呼び出されていますか?

何か案は?

4

1 に答える 1

2

問題は、EECMS テンプレートの php が eval() を使用して実行されることです。これは、php がローカルスコープで実行されていることを意味します。したがって、関数定義の内外の変数で GLOBAL キーワードを使用する必要があります。

例:

<?php

global $foo;
$foo = 'Hello World!';

bar();

function bar() {
  global $foo;
  echo $foo;
}
?>

したがって、テンプレートを次のように変更するだけです。

include '../apps/assets/fpdf.php';
// setup the PDF object:
global $pdf;
$pdf = new FPDF();

以前はすばらしい KB 記事がありましたが、現在はなくなっているようです。オリジナルのウェイバック アーカイブを取得できました。

http://web.archive.org/web/20090207200929/http://expressionengine.com/knowledge_base/article/my_php_functions_cannot_reference_global_php_variables/

それが役立つことを願っています!

于 2012-04-29T18:54:14.317 に答える