3

好的,这只是我觉得我应该问的问题,因为我在任何类型的文档中都找不到对此的任何引用,并且通读实际代码以找出实现此目标的最佳方法将花费比希望花费更长的时间。

当您进入文章管理器时,您有一个指向类别管理器的导航链接,反之亦然。我想对我的组件和默认用户管理器做类似的事情。

我已经有一个配置文件插件来扩展用户以满足我的需求,但我希望它的配置无缝,因此调整 com_user 组件以更好地与我的组件集成是我正在寻找的。

所以我的问题是他们使用“扩展”参数的 com_content 和 com_categories。是否可以在不完全覆盖 com_users 的情况下添加类似的功能?如果我完全覆盖,则由于依赖用户,某些扩展可能无法正常工作。

如果有什么没有意义,我愿意澄清一下,这个问题更多的是看看你可以在多大程度上“扩展”Joomla 而没有覆盖。

更新:

我找到了一个很酷的技术,虽然不是一个很好的答案。您可以仅覆盖组件中的列表控制器/模型/视图,如果您基于当前的 com_users 组件,您可以使其看起来像直接集成。您需要做的唯一编辑是确保到用户视图的任何路由都传递给您的组件。

但是,这有一个问题,当您添加新用户或编辑用户时,一旦完成,它将引导您进入主用户管理器。系统插件可能会对此有所帮助,但前提是有可靠的方法来检测用户何时通过您的组件而不是用户管理器进行编辑。

注意:向用户视图添加覆盖的问题在于它依赖于 5-6 个其他 MVC 组件,因此为了便于使用核心 com_users 更新进行更新,最好尽可能避免这种情况.

需要做的另一件事是确保找到 com_users 的语言文件并将所有条目添加到您的组件中。

我觉得那里可能仍然有更好的答案,但是这样做不会对核心产生太大影响,并且很容易通过对 com_users 的更新进行更新。

我正在为此提供赏金,我觉得我曾经问过的每一个问题都是对社区最有利的问题。所以这里是这个问题的精简版。

将核心组件集成到自定义组件中并让它通过该组件无缝路由是一种简单的方法,而对核心组件的编辑最少。

4

1 回答 1

1

我不太清楚你想要什么,但如果你在谈论工具栏子菜单,就像这样com_content

com_content 子菜单

您给出的 Categories (ie com_categories) 示例是添加的特定支持,您可以在其中传递com_catgories带有扩展标识符 (the extension=com_mycomponent) 的链接,它将为您的扩展加载侧边栏菜单。这样就可以在各种组件之间共享核心类别[参见添加类别]

您可能已经知道以下内容,但是,如果您想知道如何将侧边栏菜单添加到组件管理器视图中,您可以调用JHtmlSidebar::addEntry($title, $link, $active);

通常,这会放在您的扩展主帮助文件中的一个名为的函数中addSubmenu($vName)(这是com_categories显示工具栏子菜单的内容和位置)。它之所以被称为addSubmenu()是因为它是sidebar从以前版本的 Joomla 中的工具栏子菜单变形而来的。

例如,这是定义在类中的addSubmenu()方法ContentHelperadministrator/com_content/helpers/content.php

/**
 * Configure the Linkbar.
 *
 * @param   string  $vName  The name of the active view.
 *
 * @return  void
 * @since   1.6
 */
public static function addSubmenu($vName)
{
    JHtmlSidebar::addEntry(
        JText::_('JGLOBAL_ARTICLES'),
        'index.php?option=com_content&view=articles',
        $vName == 'articles'
    );
    JHtmlSidebar::addEntry(
        JText::_('COM_CONTENT_SUBMENU_CATEGORIES'),
        'index.php?option=com_categories&extension=com_content',
        $vName == 'categories');
    JHtmlSidebar::addEntry(
        JText::_('COM_CONTENT_SUBMENU_FEATURED'),
        'index.php?option=com_content&view=featured',
        $vName == 'featured'
    );
}

相比之下,com_categories帮助程序类CategoriesHelper有一个非常不同的addSubmenu()方法,它查找调用扩展核心帮助程序类(如果找不到,则默认为com_content)。

没有任何类似的支持,com_users因此您可能必须创建一个系统插件来触发onAfterRoute并添加您的子菜单项,具体取决于您的组件是否提供了合适的参数,例如extension=com_myextension. 这会有点麻烦,但它应该可以工作——唯一的事情是你会在组件被调度之前添加一个子菜单项,你的新子菜单项总是会是com_users子菜单中的第一项。它不会像com_categories支架那样完全替代。

不幸的是,没有任何触发器com_users可以帮助我调整整个侧边栏菜单。

下一个选择是使用类似Donald Gilbert 的 gist 的东西来创建一个系统插件,它允许您通过创建自己的替代版本来覆盖任何核心类 - 显然这将有任何重大更新的问题,但如果你小心你可以将覆盖限制在您的特定情况下。

如果这还不够/矫枉过正,您可能想尝试一个系统插件来响应onAfterDispatch,此时您将在页面返回浏览器之前拥有该页面,并且您可以破解 HTML,但这非常难看并且如果用户更改他们的管理模板。

当然,我可能完全错了,在 3.x 中有更好的方法来做到这一点。也许其他人会插话。

于 2013-08-11T04:27:59.703 回答