这可能是一个天真的问题,因为我是cakephp的新手。
我正在开发一个有很多布局,辅助工具和元素的项目。因为这是一个多语言网站,我拦截最终渲染输出以进行一些语言转换(因此每个访问者只能在网站上看到他的母语,包括用户输入)。
我通过在两个地方添加代码来设法转换大部分布局和帮助:AppController&afterFilter()和AppHeler的afterRender()函数。但是我无法找到一种集中处理元素的方法,而且有很多元素。
所以这是我的问题:cakephp中的所有元素都有共同的祖先类吗?如果是这样,这个祖先类是否有回调函数,如afterRender()?
非常感谢!
答案 0 :(得分:1)
我不确定这些回调是否存在特定于'元素',但是查看source code,View::element()
使用相同的 _render()
呈现元素}方法作为视图本身,应该触发beforeRender()
和afterRender()
您可以使用自定义“查看”类并覆盖element()
方法,例如让自己的“自定义”回调在助手中触发
像这样;
应用程序/视图/ app_view.php
class AppViewView extends View {
/**
* custom 'element()' method, triggers custom
* before/aferRenderElement callbacks on all loaded helpers
*/
public function element($name, $params = array(), $loadHelpers = false)
{
$this->_triggerHelpers('beforeRenderElement');
$output = parent::element($name, $params, $loadHelpers);
$this->_triggerHelpers('afterRenderElement');
}
/**
* Names of custom callbacks
*/
protected $_customCallBacks = array(
'beforeRenderElement',
'afterRenderElement',
);
function _triggerHelpers($callback)
{
if (!in_array($callback, $this->_customCallbacks)) {
// it's a standard callback, let the parent class handle it
return parent::_triggerHelpers($callback);
}
if (empty($this->loaded)) {
return false;
}
$helpers = array_keys($this->loaded);
foreach ($helpers as $helperName) {
$helper =& $this->loaded[$helperName];
if (is_object($helper)) {
if (
is_subclass_of($helper, 'Helper')
&& method_exists($helper, $callback)
) {
$helper->{$callback}();
}
}
}
}
}
然后,在AppController中指定要使用的“view”类;
class AppController extends Controller {
public $view = 'AppView';
}