0

我正在开发一个基于 CakePHP 2.2 的 webapp。我创建了一些适合主应用程序的插件。在主应用程序中,我有一个动态菜单。现在我希望插件在这个菜单中显示 op。

我认为,最好的方法是让插件在主应用程序中注册其菜单项。然后主应用程序构建菜单(使用帮助程序)。但我不知道该怎么做。是否可以让插件与主应用程序交互,即使它的 AppController 没有被触及?我想显示所有插件,而不仅仅是当前的插件操作。

4

1 回答 1

1

这取决于您的实施细节。一般来说,您应该将插件视为真正的插件。因此,如果可用,您的应用程序可以使用它。所以概念代码例如:

if(pluginAvailable('PagesPlugin')) {
  $this->set('menu', $this->PagesPluginComponent->getMenuItems());
}

您的应用程序可以依赖它,但它也不能在这里。这是插件的通用概念。在现实世界中,这要困难得多,因为没有菜单就无法显示您的网页,从而产生了真正的依赖关系。

插件应该是可重用的。

一些选项:

完全基于插件的页面结构

您创建一个插件,它本身具有表格页面。该插件有一个加载菜单项的组件和一个支持显示它们的助手。

所以在你的 appcontroller 加载组件,在这里你设置依赖。在 before_filer 中加载菜单数据并将其发送到视图。

在您的 default.ctp(或其他布局文件)中,您使用数据调用插件助手。

做一个 requestAction

在您的插件控制器中创建一个方法并调用 requestAction:http ://book.cakephp.org/2.0/en/controllers.html#Controller::requestAction

所以你可以调用:yourplugin/menus/index,它会返回一个完整的 MVC 进程。所以插件中的控制器从模型中获取菜单项,将数据发送到它的视图,然后在 index.ctp 中呈现菜单。您在应用程序中返回 HTML 结果,完全完整。

仅使用助手创建插件

如果您想要模型中的数据,插件将无济于事,但仍然:如果您有一个复杂的功能可以生成样式良好的菜单,则可以将其放入插件助手中。

在您的应用程序中,您自己在您的应用程序中进行加载,因此您在那里拥有所有的灵活性。您将其发送到视图,但您使用插件来呈现您的菜单。这样,您也可以毫无问题地重复使用菜单助手。

让 appController 扩展你的插件 appController

不喜欢它,但有可能:您可以在插件中创建一个新的 AppController 来处理设置菜单和所有其他事情。然后,您的应用程序 appController 可以扩展该版本,而不是普通的 AppController 扩展 Controller。所以你得到:AppController 扩展了你的PluginAppController。虽然我一般不喜欢这种模式,因为调用和依赖关系不再可见,但实际上是自动添加和执行的。

可选:对于更灵活的工作方式,CakePHP 添加了新的:事件http://book.cakephp.org/2.0/en/core-libraries/events.html,非常有趣。您可以在例如您的应用程序控制器中放置有趣的事件,并在插件中为其附加侦听器。这将使您免于硬编码调用这些方法。所以这可能会奏效,但它是相当新的,并且存在一些小故障,因为它是全新的。文档尚未完成,并且经过验证的使用尚未发布太多。

于 2012-10-20T10:15:22.207 回答