Magento PHP 5.4 PDF 发票 Zend 错误

9

当我尝试创建PDF发票时(因为我的客户正在运行PHP 5.4.19),Magento抛出了一个PHP错误。

Fatal error: Declaration of Zend_Pdf_FileParserDataSource_File::__construct() must be compatible with Zend_Pdf_FileParserDataSource::__construct() in /var/www/vhosts/website/httpdocs/includes/src/Zend_Pdf_FileParserDataSource_File.php on line 41

通常情况下,通过编辑FileParserDataSource.php并注释掉两行即可轻松解决此问题。但问题是他们运行一个扩展此脚本的Zend_Pdf_FileParserDataSource_File.php (http://pastebin.com/J64VNsRP)。

是否有任何解决方案,可以在运行PHP 5.4的服务器上使用Magento创建PDF发票?

4个回答

36

这是PHP版本5.4.4与zend Framework之间的不兼容问题。

通过更改此函数lib/Zend/Pdf/FileParserDataSource.php进行修复。

更改

abstract public function __construct();
abstract public function __construct($filePath);

非常好用!谢谢。 - Hashid Hameed
谢谢,但这需要编辑核心文件,我不喜欢这样做。我一定会向Magento核心团队报告此事。感谢您的信息。 - Adarsh Khatri
嘿,大家好,当我打开lib/Zend/Pdf/FileParserDataSource.php时,我没有看到abstract public function __construct(); 我只有abstract public function __destruct(); 将其注释掉无法解决问题。我也尝试了编译和禁用编译,但也无法解决问题。是否有其他方法可以解决发票打印问题? - lvekua
感谢您提供快速解决方案。 - Wasiq Shahrukh

6
这是针对Zend Core的问题,具体情况请参见http://framework.zend.com/issues/browse/ZF-12093。解决方法是在lib/Zend/Pdf/FileParserDataSource.php中将__construct__destruct方法注释掉。
//    abstract public function __construct();

    /**
     * Object destructor. Closes the data source.
     *
     * May also perform cleanup tasks such as deleting temporary files.
     */
//    abstract public function __destruct();`

由于第二个文件的原因,这是不可能的。 - Hidde
@Hidde,第二个文件是什么意思? - Rajiv Ranjan
如果我在lib/Zend/Pdf/FileParseDataSource.php中注释掉函数__construct();和函数__destruct();,那么不会有任何变化,因为FileParseDataSource.php被Zend_Pdf_FileParserDataSource_File.php扩展。如果我还注释掉那个文件中的代码,我会得到一个“包含2个抽象方法,因此必须声明为抽象或实现剩余方法”的错误。 - Hidde
@Hidde,你尝试过在注释这些函数后再试吗?因为我已经为我的项目修复了相同的问题。 - Rajiv Ranjan
此外,这个错误在ZF中很久以前就被修复了。Magento使用的是相当旧的框架版本。 - Tim Fountain
显示剩余4条评论

2

在运行了PHP 5.4补丁之后,“运行编译流程”起到了作用。 - Timo002

1
你需要更改lib/Zend/Pdf/FileParserDataSource.php和lib/Zend/Pdf/FileParserDataSource/File.php文件。
查找
             abstract public function __construct();

在FileParserDataSource.php中进行更改,将其更改为。
             abstract public function __construct($filePath);

同时在File.php文件中做同样的操作

             public function __construct()

转换为

             public function __construct($filePath)

这对我有用。希望能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接