Magento - 在控制器中加载外部 php 脚本
Magento - loading external php scripts inside controller
任何时候我想从符合 Magento 模块方法的 class 内部加载外部库。我总是遇到以下错误:
require_once(): Failed opening required 'http://example.com/HTML2PDF/tcpdf.php'
尽管 URL 是正确的。例如:
class Foo_Bar_AccountController extends Mage_Customer_AccountController
{
public function whatever() {
require_once(Mage::getBaseUrl() . 'HTML2PDF/tcpdf.php');
}
}
任何人都可以帮助理解为什么我不能以这种方式包含文件吗?
我想我可能已经明白了。不知道为什么,但我相信 Magento 以某种方式不允许在您自己的模块之外包含文件。无论如何,这似乎有效:
require_once Mage::getModuleDir('', 'Foo_Bar'). DS . 'lib' . DS . 'tcpdf_6_2_11' . DS . 'tcpdf.php';
只需在我的模块中添加自定义文件夹,然后调用 Magento 的 Mage::getModuleDir 方法即可!
如果有人能更好地解释为什么会发生这种情况,那么它可能会帮助其他人(包括我自己)更好地理解。
谢谢
Mage::getBaseUrl()
函数用于 URL,而不是文件路径。因此,它将 return 一个以 "http://" 开头的字符串。你要的是Mage::getBaseDir('lib')
.
您提供的解决方案有效,但通常(并且可以说)您应该将第三方/外部 PHP 脚本放在顶级 lib
文件夹中。这样所有第三方库都在一个地方,您甚至不必调用 Mage::getModuleDir()
。您的文件夹结构将是:
/magento/
app/
code/
local/
Foo/
Bar/
controllers/
AccountController.php
...
lib/
HTML2PDF/
tcpdf.php
您的控制器将是:
<?php
class Foo_Bar_AccountController extends Mage_Customer_AccountController
{
public function whatever() {
require_once(Mage::getBaseDir('lib') . DS . 'HTML2PDF/tcpdf.php');
}
}
更好的是,当您在基础 lib
中有文件时,它们会包含在自动加载器对 class 的搜索中。因此,有时您可以简单地实例化 class,自动加载器会完成查找所需文件的工作。
任何时候我想从符合 Magento 模块方法的 class 内部加载外部库。我总是遇到以下错误:
require_once(): Failed opening required 'http://example.com/HTML2PDF/tcpdf.php'
尽管 URL 是正确的。例如:
class Foo_Bar_AccountController extends Mage_Customer_AccountController
{
public function whatever() {
require_once(Mage::getBaseUrl() . 'HTML2PDF/tcpdf.php');
}
}
任何人都可以帮助理解为什么我不能以这种方式包含文件吗?
我想我可能已经明白了。不知道为什么,但我相信 Magento 以某种方式不允许在您自己的模块之外包含文件。无论如何,这似乎有效:
require_once Mage::getModuleDir('', 'Foo_Bar'). DS . 'lib' . DS . 'tcpdf_6_2_11' . DS . 'tcpdf.php';
只需在我的模块中添加自定义文件夹,然后调用 Magento 的 Mage::getModuleDir 方法即可!
如果有人能更好地解释为什么会发生这种情况,那么它可能会帮助其他人(包括我自己)更好地理解。
谢谢
Mage::getBaseUrl()
函数用于 URL,而不是文件路径。因此,它将 return 一个以 "http://" 开头的字符串。你要的是Mage::getBaseDir('lib')
.
您提供的解决方案有效,但通常(并且可以说)您应该将第三方/外部 PHP 脚本放在顶级 lib
文件夹中。这样所有第三方库都在一个地方,您甚至不必调用 Mage::getModuleDir()
。您的文件夹结构将是:
/magento/
app/
code/
local/
Foo/
Bar/
controllers/
AccountController.php
...
lib/
HTML2PDF/
tcpdf.php
您的控制器将是:
<?php
class Foo_Bar_AccountController extends Mage_Customer_AccountController
{
public function whatever() {
require_once(Mage::getBaseDir('lib') . DS . 'HTML2PDF/tcpdf.php');
}
}
更好的是,当您在基础 lib
中有文件时,它们会包含在自动加载器对 class 的搜索中。因此,有时您可以简单地实例化 class,自动加载器会完成查找所需文件的工作。