交互式插件CakePHP 2

时间:2012-10-20 09:58:47

标签: php cakephp-2.0

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

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

1 个答案:

答案 0 :(得分: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扩展yourPluginAppController。我一般不喜欢这种模式,因为调用和依赖性不再可见,但实际上是自动添加和执行的。

可选:为了更灵活的工作方式,CakePHP添加了新的:事件http://book.cakephp.org/2.0/en/core-libraries/events.html这非常有趣。您可以将有趣的事件放在例如appcontroller中,并在插件中附加侦听器。这样可以避免硬编码调用这些方法。所以这可能会有用,但它很新,而且有一些小问题,因为它是全新的。文档尚未完成,已证明其使用尚未发布。