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'];
大功告成
我实际上正在为 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'];
大功告成