没有管理菜单的组件

时间:2012-05-17 20:20:49

标签: joomla joomla1.5 joomla-extensions joomla2.5

有谁知道如何创建一个不在管理菜单中创建部分的Joomla组件?

我删除了清单中的所有菜单条目,但它仍然会创建一个管理菜单项:

<administration>
            <files folder="admin">
                    <filename>index.html</filename>
                    <filename>gallery.php</filename>
                    <filename>controller.php</filename>
                    <folder>views</folder>
                    <folder>models</folder>
            </files>
</administration>

有什么想法吗?

注意:这是关于J2.5的,但1.5也很有趣。

2 个答案:

答案 0 :(得分:3)

Joomla将在安装时自动插入这些菜单项,但如果您真的想要,可以通过各种方式删除它们。

最简单的方法是更改​​组件行的client_id字段菜单表。管理员菜单项有client_id = 1,但如果您将其更改为某些废话,例如client_id = 10,它们将不会显示在管理网站中。

或者,您可以直接删除它们。因为菜单表使用嵌套集模型,所以不应该只删除行。可能你最好的方法是使用MenusModelMenu类的删除功能。

如果安装程序包含带有postflight功能的脚本,则可以在组件安装期间完成这些任务。

答案 1 :(得分:1)

这是我最终用于删除管理菜单中的条目的代码。

首先,我创建了一个安装脚本,该脚本在名为script.php的文件中实现了post flight方法:

<?php
//No direct access
defined('_JEXEC) or die;');

class com_mycomponentInstallerScript{
    function postflight($type, $parent){
        // $parent is the class calling this method
    // $type is the type of change (install, update or discover_install)
        $componentName = 'myComponent'; //The name you're using in the manifest
        $extIds = $this->getExtensionIds($componentName);
        if(count($extIds)) {
            foreach($extIds as $id) {
                if(!$this->removeAdminMenus($id)) {
                    echo JText::_(COM_MYCOMPONENT_POSTFLIGHT_FAILED);
                }
            }
        }
    }

    /**
    * Retrieves the #__extensions IDs of a component given the component name (eg "com_somecomponent")
    *
    * @param   string   $component The component's name
    * @return   array   An array of component IDs
    */
    protected function getExtensionIds($component) {
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select('extension_id');
        $query->from('#__extensions');
        $cleanComponent = filter_var($component, FILTER_SANITIZE_MAGIC_QUOTES);
        $query->where($query->qn('name') . ' = ' . $query->quote($cleanComponent));
        $db->setQuery($query);
        $ids = $db->loadResultArray();
        return $ids;
    }

     /**
   * Removes the admin menu item for a given component
   *
   * This method was pilfered from JInstallerComponent::_removeAdminMenus()
   *
   * @param   int      $id The component's #__extensions id
   * @return   bool   true on success, false on failure
   */
   protected function removeAdminMenus(&$id)
   {
      // Initialise Variables
      $db = JFactory::getDbo();
      $table = JTable::getInstance('menu');
      // Get the ids of the menu items
      $query = $db->getQuery(true);
      $query->select('id');
      $query->from('#__menu');
      $query->where($query->qn('client_id') . ' = 1');
      $query->where($query->qn('component_id') . ' = ' . (int) $id);

      $db->setQuery($query);

      $ids = $db->loadColumn();

      // Check for error
      if ($error = $db->getErrorMsg())
      {
         return false;
      }
      elseif (!empty($ids))
      {
         // Iterate the items to delete each one.
         foreach ($ids as $menuid)
         {
            if (!$table->delete((int) $menuid))
            {
               return false;
            }
         }
         // Rebuild the whole tree
         $table->rebuild();
      }
      return true;
   }

}

接下来,我在组件清单中添加了一个条目,以便在安装组件后运行脚本:

<scriptfile>script.php</scriptfile>