如何在插件中添加设置

问题描述:

我有一个非常基本的应用程序,它使用大部分功能的插件。我希望允许每个插件定义一些自定义菜单和菜单项,将所有这些菜单收集到一个地方(可能是AppController :: initialize),并创建一个数组,该数组将传递给main-menu.php元素,该元素将呈现完整的菜单。如何在插件中添加设置

我所做的到目前为止是在插件

# plugins/TestPlugin/config/menus.php 

return [ 
    'menus' => [ 
     [ 
      'header' => 'TestPlugin', 
      [ 
       'title' => 'Click me!', 
       'href' => './', 
      ], 
      [ 
       'title' => 'Click me too!', 
       'href' => './', 
      ] 
     ] 
    ] 
]; 

负载的配置定义菜单:

# plugins/TestPlugin/config/bootstrap.php 

use Cake\Core\Configure; 
Configure::load('TestPlugin.menus', 'default' , true); 

而读取变量:

# src/Controller/AppController.php 

public function initialize() 
{ 
    parent::initialize(); 
    $plugin_menus = Configure::read('menus); 

但如果我有更多的一个插件,menus正在被覆盖。

我不确定这是否是最好的方法。我试图实现的是多个模块更改(附加到)相同的配置变量

如果是我,我会使用生成导航的View Cell

在每个插件bootstrap.php文件中,我将该插件附加到Configure变量以添加其导航。

Configure::write('navigation', array_merge(Configure::read('navigation'), $myNavArray); 

然后在导航视图电池,我可以处理该Configure变量。

foreach (Configure::read('navigation') as $navItem) { 
    // Build nav, or output, etc 
} 

这样做的好处是,由于View Cell的缘故,您的导航将无处不在。您还将拥有一个View Cell控制器,这意味着您可以在导航中执行更多操作,例如在输出导航项之前检查权限。

通过挂钩引导程序,您还可以灵活地包含或不包含插件导航,只需要不加载引导程序,或者先检查插件设置。

+0

我的问题是我用'Configure :: read('menus')加载插件的导航;'它会覆盖任何其他插件的'$ menu'变量。所以我正在寻找一种方法来加载'plugins/TestPlugin/menus.php'文件,该文件返回一个'$ menus'数组,而不覆盖任何已经存在的'$ menus'变量。 – karivolas

+0

你已经错过了我在答案中使用'array_merge'。以便您可以以多维方式键入数组以适应您的额外导航数据。 –