【问题标题】:How to use an external Library as a view Helper in CakePHP?如何在 CakePHP 中使用外部库作为视图助手?
【发布时间】:2014-10-19 13:54:45
【问题描述】:

我正在使用第三方库以特定方式格式化数据。 我设法从该库创建了一个组件,执行以下操作:

App::uses('Component', 'Controller');
App::import('Vendor','csformat' ,array('file'=>'csformat'.DS.'csformat.php'));

class CSFormatComponent extends Component {

    public function startup(Controller $controller){
        $controller->CSF = new csfStartup(null);
        return $controller->CSF;
    }
}

这样做可以让我通过控制器访问库提供的不同类。但我意识到我会做很多不必要的$this->set($one, $two) 来将格式化数据从控制器传递到视图,从本质上讲,库作为帮助器可能更有益,因为我可以在视图上格式化我的数据。

任何想法如何创建这样的助手?

更新:

根据下面评论中Kai 的建议,我创建了一个基本的助手,App::imports 供应商库,并在我的控制器中需要的地方包含了助手,因此我可以在我的视图中访问库.

我现在的问题是我不想在每个视图中都不断地实例化库的 csfStartup 类。

有没有办法让我的助手在调用助手时轻松提供该类的实例?类似于我的组件的工作方式。

【问题讨论】:

  • 在加载供应商库时,App::import 实际上只是include 的包装器。所以你应该能够在控制器中使用App::import,并且能够在相应的视图中访问该类。或者,编写一个简单的帮助程序,它只是用于访问您的库的包装器,然后将您的 App::import 移动到那里。
  • 感谢您的评论,@Kai。我按照您的建议创建了一个简单的助手。它工作正常,但我正在寻找让我的助手在我调用它时准备好csfStartup(null) 的实例,而不是我必须在每个视图中创建一个新实例$this->CSF = new csfStartup(null)。关于如何构建帮助器的任何建议?

标签: cakephp cakephp-2.5


【解决方案1】:

我最终创建了帮助程序以按我的意愿工作,并且我发布了答案,以防其他人希望使用第三方类/库作为 CakePHP 中的帮助程序。

#cakephp IRC 频道上的savant 让我走上了创建助手的正确道路,并且通过对Helper.php API 的一些研究,我最终得到了:

App::uses('AppHelper', 'View/Helper');
App::import('Vendor','csformat' ,array('file'=>'csformat'.DS.'csformat.php')); 

class CSFHelper extends AppHelper{

    protected $_CSF = null;

    // Attach an instance of the class as an attribute
    public function __construct(View $View, $settings = array()){
        parent::__construct($View, $settings);
        $this->_CSF= new csfStartup(null);
    }

    // PHP magic methods to access the protected property
    public function __get($name) {
        return $this->_CSF->{$name};
    }

    public function __set($name, $value) {
        $this->_CSF->{$name} = $value;
    }

    // Route calls made from the Views to the underlying vendor library
    public function __call($name, $arguments) {
        $theCall = call_user_func_array(array($this->_CSF, $name), $arguments);
        return $theCall;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2011-07-03
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多