예제 #1
0
 /**
  * Method to get the extensions.
  *
  * @access  public
  * @return  array  array of component object
  * @since  1.6
  */
 public function &getExtensions()
 {
     $core = array();
     $allfolders = array();
     $clients = array('administrator', 'site');
     $extensions = array();
     $extensions['components'] = array();
     $extensions['modules'] = array();
     $extensions['plugins'] = array();
     $extensions['templates'] = array();
     foreach ($clients as $client) {
         $allfolders[$client] = array();
         $core[$client] = array();
         // 1. scan global folders
         $tags =& JFolder::folders(LocaliseHelper::getLanguagesPath($client), '.', false, false, array('.svn', 'CVS', '.DS_Store', '__MACOSX', 'pdf_fonts', 'overrides'));
         foreach ($tags as $tag) {
             $path = 'language' . DS . $tag;
             if ($client == 'administrator') {
                 $path = 'administrator' . DS . $path;
             }
             $allfolders[$client][] = $path;
         }
         // 2. scan extensions folders
         $extensions_folders = array('components', 'modules', 'templates');
         $absolute = constant('JPATH_' . strtoupper($client));
         foreach ($extensions_folders as $type) {
             $exts =& JFolder::folders($absolute . DS . $type, '.', false, false);
             foreach ($exts as $extension) {
                 $folder = $absolute . DS . $type . DS . $extension . DS . 'language';
                 if (JFolder::exists($folder)) {
                     $tags =& JFolder::folders($folder, '.', false, false);
                     foreach ($tags as $tag) {
                         $path = $type . DS . $extension . DS . 'language' . DS . $tag;
                         if (JFolder::exists($path . DS . $tag . "." . $extension . ".ini") || JFolder::exists($path . DS . $tag . ".tpl_" . $extension . ".ini")) {
                             if ($client == 'administrator') {
                                 $path = 'administrator' . DS . $path;
                             }
                             $allfolders[$client][] = $path;
                         }
                     }
                 }
             }
         }
     }
     // 3. Scan plugin folders
     $groups =& JFolder::folders(JPATH_SITE . DS . 'plugins', '.', false, false);
     foreach ($groups as $group) {
         $plugins =& JFolder::folders(JPATH_SITE . DS . 'plugins' . DS . $group, '.', false, false);
         foreach ($plugins as $plugin) {
             $folder = JPATH_SITE . DS . 'plugins' . DS . $group . DS . $plugin . DS . 'language';
             if (JFolder::exists($folder)) {
                 $tags =& JFolder::folders($folder, '.', false, false);
                 foreach ($tags as $tag) {
                     $path = 'plugins' . DS . $group . DS . $plugin . DS . 'language' . DS . $tag;
                     $allfolders['administrator'][] = $path;
                     $allfolders['site'][] = $path;
                 }
             }
         }
     }
     foreach ($allfolders as $client => $paths) {
         foreach ($paths as $path) {
             $files = JFolder::files(JPATH_SITE . DS . $path, '[^.]+\\.[^.]+\\.ini');
             foreach ($files as $file) {
                 preg_match('/([^.]+)\\.([^.]+)\\.ini/', $file, $matches);
                 $name =& $matches[2];
                 if (!array_key_exists($name, $core[$client])) {
                     $start = substr($name, 0, 3);
                     switch ($start) {
                         case 'com':
                             $type = 'components';
                             break;
                         case 'mod':
                             $type = 'modules';
                             break;
                         case 'plg':
                             $type = 'plugins';
                             break;
                         case 'tpl':
                             $type = 'templates';
                             break;
                         default:
                             $type = 'error';
                     }
                     if ($type != 'error') {
                         $model = JModel::getInstance('Translation', 'LocaliseModel', array('ignore_request' => true));
                         $model->setState('path', $path . DS . $file);
                         if ($model->getCore()) {
                             $core[$client][$name] = $name;
                         }
                         if (array_key_exists($name, $core[$client])) {
                             if (array_key_exists($name, $extensions[$type])) {
                                 $extensions[$type][$name]->{$client} = -2;
                                 $package_field = $client . "_package";
                                 if ($extensions[$type][$name]->site < 0 && $extensions[$type][$name]->administrator < 0) {
                                     unset($extensions[$type][$name]);
                                 }
                             }
                         } else {
                             if (!array_key_exists($name, $extensions[$type])) {
                                 $extensions[$type][$name] = new JObject();
                                 $extensions[$type][$name]->administrator = -1;
                                 $extensions[$type][$name]->site = -1;
                             }
                             $extensions[$type][$name]->{$client} = 0;
                         }
                     }
                 }
             }
         }
     }
     $filename = $this->getFilename();
     if ($filename) {
         $this->_scanManifest(JPATH_ROOT . DS . 'media' . DS . 'com_localise' . DS . 'manifests' . DS . $filename . '.xml', $extensions);
     }
     $types = array('components', 'modules', 'plugins', 'templates');
     foreach ($types as $type) {
         foreach ($extensions[$type] as $name => $object) {
             $object->site_packages = array('home' => array(), 'thirdparty' => array());
             $object->administrator_packages = array('home' => array(), 'thirdparty' => array());
         }
     }
     if (JFolder::exists(JPATH_ROOT . DS . 'media' . DS . 'com_localise' . DS . 'manifests')) {
         $packages = JFolder::files(JPATH_ROOT . DS . 'media' . DS . 'com_localise' . DS . 'manifests', '\\.*\\.xml', false, true, array('.svn', 'CVS', '.DS_Store', '__MACOSX', 'index.html'));
         foreach ($packages as $package) {
             if (basename($package, '.xml') != $filename) {
                 $this->_scanOtherManifest($package, $extensions, 'home');
             }
         }
     }
     if (JFolder::exists(JPATH_SITE . DS . 'files' . DS . 'com_localise')) {
         $packages = JFolder::files(JPATH_SITE . DS . 'files' . DS . 'com_localise', '\\.*\\.xml', false, true, array('.svn', 'CVS', '.DS_Store', '__MACOSX', 'index.html'));
         foreach ($packages as $package) {
             $this->_scanOtherManifest($package, $extensions, 'thirdparty');
         }
     }
     foreach ($types as $type) {
         ksort($extensions[$type]);
     }
     return $extensions;
 }