1

管理メニューにセクションを作成しない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も興味深いものです。

4

2 に答える 2

3

Joomlaはインストール時にこれらのメニュー項目を自動的に挿入しますが、本当に必要な場合はさまざまな方法でそれらを取り除くことができます。

最も簡単な方法はclient_id、コンポーネントの行のフィールドをメニューテーブルに変更することです。管理メニュー項目にはありますclient_id = 1が、これをのようなナンセンスに変更するclient_id = 10と、管理サイトに表示されなくなります。

または、それらを完全に削除することもできます。メニューテーブルは入れ子集合モデルを使用しているため、行を削除するだけではいけません。おそらく最善の方法は、MenusModelMenuクラスの削除機能を使用することです。

インストーラーに関数を含むスクリプトが含まれている場合は、コンポーネントのインストール中にこれらのいずれかを実行できますpostflight

于 2012-05-18T01:32:43.967 に答える
1

これは、管理メニューのエントリを削除するために使用することになったコードです。

最初に、script.phpというファイルにフライト後のメソッドを実装するインストールスクリプトを作成しました。

<?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>
于 2012-05-20T07:55:28.033 に答える