Magento - 在控制器内部加载外部PHP脚本

时间:2015-11-04 15:28:30

标签: php magento magento-1.9

任何时候我想从符合Magento模块方法的类中加载外部库。我总是面临以下错误:

  

require_once():无法打开所需的“http://example.com/HTML2PDF/tcpdf.php

尽管网址是正确的。例如:

class Foo_Bar_AccountController extends Mage_Customer_AccountController 
{
    public function whatever() {
        require_once(Mage::getBaseUrl() . 'HTML2PDF/tcpdf.php');
    }
}

任何人都可以帮助理解为什么我不能以这种方式包含文件吗?

2 个答案:

答案 0 :(得分:2)

我想我可能已经弄明白了。不知道为什么,但我相信Magento不允许在你自己的模块之外包含文件。无论如何,这似乎有效:

require_once Mage::getModuleDir('', 'Foo_Bar'). DS . 'lib' . DS . 'tcpdf_6_2_11' . DS . 'tcpdf.php';

只需在我的模块中添加一个自定义文件夹,然后调用Magento的 Mage :: getModuleDir 方法就可以了!

如果有人能够更好地解释为什么会发生这种情况,那么它可以帮助其他人(包括我自己)更好地理解。

谢谢

答案 1 :(得分:2)

Mage::getBaseUrl()函数用于URL,而不是文件路径。因此,它将返回以“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中有文件时,它们会包含在自动加载器中的类搜索中。因此,有时您可以简单地实例化类,并且自动加载器可以找到需要的正确文件。