CakePHP 3 - 从其他助手调用对象

CakePHP 3 - call object from other helper

我实际上正在为 CakePHP3 开发一个 Helper,其中包括 BsHelper,然后是 BsFormHelper。

实际上一切看起来都不错,Bootstrap 格式没问题。

我现在尝试创建一个 ckEditor 实例,但我遇到了几个问题。

如果我尝试这样调用我的 ckEditor :

$this->BsForm->ckEditor('test')

我只是遇到了一些问题,因为函数ckEditor 在我的BsFormHelper 中,加载函数在BsHelper 中。因此,当我尝试访问私有变量以了解是否必须加载 ckEditor 时,我遇到了这个问题:

Error: Call to a member function load() on a non-object File C:\wamp3\www\wac_lucien\BsHelpersCakePHP3.2\plugins\BsHelpers\src\View\Helper\BsFormHelper.php

所以其实我知道问题出在哪里了:

在 BsFormHelper 中我的函数看起来像:

public function ckEditor($fieldName, $options = array(), $ckEditorOptions = array()) {
    $options['type'] = 'textarea';

    $out = $this->input($fieldName, $options);

    // If there is a point in the fieldName
    if (strpos($fieldName, '.') !== false) {
        $nameForReplace = Inflector::camelize(Inflector::slug($fieldName));
    } else {
        $nameForReplace = $this->_modelForm . Inflector::camelize($fieldName);
    }

    $this->Bs->load('ckeditor');

    $this->Bs->loadJS('CKEDITOR.replace("' . $nameForReplace . '", ' . json_encode($ckEditorOptions) . ');', true);
    return $out;
}

在我的 BsHelper 中我得到了:

public function load($key) {
    if (!$this->__extensions[$key]['loaded']) {
        foreach ($this->__extensions[$key]['css'] as $css) {
            $this->loadCSS($css);
        }
        foreach ($this->__extensions[$key]['js'] as $js) {
            $this->loadJS($js);
        }
        $this->__extensions[$key]['loaded'] = true;
    }

    return $this->__extensions[$key]['loaded'];
}

值在这样的声明中

public $__extensions = array(
    'jasny' => array(
        'css' => array(
            '//cdnjs.cloudflare.com/ajax/libs/jasny-bootstrap/3.1.3/css/jasny-bootstrap.min.css'
        ),
        'js' => array(
            '//cdnjs.cloudflare.com/ajax/libs/jasny-bootstrap/3.1.3/js/jasny-bootstrap.min.js'
        ),
        'loaded' => true
    ),
    'ckeditor' => array(
        'css' => array(),
        'js' => array(
            '//cdn.ckeditor.com/4.5.8/standard/ckeditor.js'
        ),
        'loaded' => true
    )
);

有人可以帮我查一下吗?看起来在 BsFormHelper 中调用的加载函数无法从 BsHelper 访问私有变量 ...

您似乎只是想在另一个助手中使用一个助手

manual

You may wish to use some functionality already existing in another helper. To do so, you can specify helpers you wish to use with a $helpers array, formatted just as you would in a controller:

所以在你的 BsFormHelper 中做

public $helpers = ['Bs'];

大功告成