2012-04-27 67 views
0

我正在使用FPDF将ExpressionEngine的通道数据导出到PDF文件。我使用的FPDF-stuff是我之前在另一个项目中使用的代码,所以它应该工作。在FPDF对象正常的工作方法,但只要他们得到包裹在一个函数,我得到:ExpressionEngine中的PHP&FDPF错误'致命错误:调用非对象上的成员函数'

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方法?

任何想法?

回答

1

问题是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/

希望帮助!

+0

太好了,谢谢。将永远无法自己弄清楚这一点;) – Rein 2012-05-02 14:36:52