【问题标题】:How to get component version from Joomla?如何从 Joomla 获取组件版本?
【发布时间】:2013-10-18 01:20:59
【问题描述】:

有什么方法可以通过名称获取组件版本吗?我尝试了很多示例,但没有找到任何可行的示例。 JComponentHelper::getParams('com_mycomponent')->get('version') 之类的东西不起作用,因为它从 jos_extensions.params 行中检索值。我的组件版本仅在jos_extensions.manifest_cache 行...

【问题讨论】:

    标签: joomla joomla2.5 joomla-extensions


    【解决方案1】:

    您可以使用以下内容:

    Joomla 2.5:

    $parser = JFactory::getXMLParser('Simple');
    $xml = JPATH_SITE .'/components/com_wrapper/wrapper.xml';
    $parser->loadFile($xml);
    $doc = $parser->document;
    $element = $doc->getElementByPath('version');
    $version = $element->data();
    
    echo $version;
    

    Joomla 3.x(平台 13.3 及以下)

    $xml = JFactory::getXML(JPATH_SITE .'/components/com_wrapper/wrapper.xml');
    $version = (string)$xml->version;
    
    echo $version;
    

    Joomla 3.2+:

    getXML 在此答案后的 2 周内已弃用。相反,请使用SimpleXML


    显然,这是 Wrapper 组件的示例,因此请将路径更改为适合您需要的任何内容。

    希望对你有帮助

    【讨论】:

    • JPATH_SITE 应替换为 JPATH_ADMINISTRATOR
    • @Shakur - JPATH_ADMINISTRATOR 时发生错误,这就是我没有使用它的原因。
    • 可能是因为我目前正在工作的子域上的 wampserver 上进行测试,但稍后我会根据您要求的更改进行正确测试。
    • 组件的Manifest文件存放在administrator/components/com_name/所以这里需要JPATH_ADMINISTRATOR
    • 实际上是 2013 年 10 月下旬
    【解决方案2】:

    如果您正在查找 Joomla 站点中所有组件的列表,您可以使用扩展管理器 -> 管理并选择类型过滤器“组件”来找到它们。这将为您提供一个包含版本列的列表,其中显示所有组件的版本。 这是您原始问题的答案,无需编码。

    【讨论】:

      【解决方案3】:

      基于 CoalaWeb 的答案,但代码更少(使用框架中的更多代码):

      /** @var JTableExtension $extension */
      $extension = JTable::getInstance('extension');
      $id = $extension->find(array('element' => $extension));
      $extension->load($id);
      $componentInfo = json_decode($extension->manifest_cache, true);
      
      return $componentInfo['version'];
      

      【讨论】:

        【解决方案4】:

        Joomla 1.5、2.5、3.X.

        我们为 Joomla 1.5 (com_ponent.xml) 和 2.5、3.X (_manifest.xml) 版本使用不同的 XML 文件。 使用SimpleXML

        public static function getVbssoVersion() {
           $xml_path = JPATH_ADMINISTRATOR . '/components/com_ponent/';
           $xml_path .= (defined('JVER') && JVER == '1.5') ? 'com_ponent.xml' : '_manifest.xml';
           $xml_obj = new SimpleXMLElement(file_get_contents($xml_path));
        
           return strval($xml_obj->version); 
        }
        

        【讨论】:

          【解决方案5】:

          要充分利用 Joomla API,请使用 JComponentHelper、\Joomla\Registry\Registry 和 JTable 类:

          $component = \JComponentHelper::getComponent('com_myextension');
          $extension = \JTable::getInstance('extension');
          $extension->load($component->id);
          $manifest = new \Joomla\Registry\Registry($extension->manifest_cache);
          
          echo $manifest->get('version');
          

          这主要适用于较新的 3.x 版本的 Joomla; 3.6+ 可能。

          【讨论】:

            【解决方案6】:

            您好,我使用此函数根据元素从扩展表中返回版本(我发现它比名称更可靠),但您可以轻松地将元素替换为名称。

            我在插件中有这个,该函数只需要元素($ext)来检查表中的当前扩展名。

            function extversion($ext) {
                $db = JFactory::getDbo();
                $query = $db->getQuery(true);
                $query->select('manifest_cache');
                $query->from($db->quoteName('#__extensions'));
                $query->where('element = "' . $ext . '"');
                $db->setQuery($query);
            
                $manifest = json_decode($db->loadResult(), true);
                return $manifest['version'];
            }
            

            【讨论】:

              【解决方案7】:

              Joomla 3.2+:

              由于不推荐使用 getXML,您可以通过以下方式使用 SimpleXML:

              $xml = simplexml_load_file(JPATH_COMPONENT_ADMINISTRATOR . '/wrapper.xml');
              $version = $xml->version;
              

              【讨论】:

                猜你喜欢
                • 2015-03-21
                • 2012-08-18
                • 1970-01-01
                • 2010-11-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多