1

我正在使用 FPDF 将频道数据从 ExpressionEngine 导出到 PDF 文件。我使用的 FPDF-stuff 是我之前在另一个项目中使用的代码,所以它应该可以工作。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();

曾经有一篇很棒的知识库文章,但现在似乎已经消失了。我能够获得原始文件的回溯存档:

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 回答