Пример #1
0
 /**
  * Function to translate list of elements where the data is stord in Joomla native tables using language flag
  * @param array $rows
  * @param string $ids
  * @param string $reference_table
  * @param JFLanguage $language
  * @param string $refTablePrimaryKey
  * @param array $tableArray
  * @param string $querySQL
  * @param boolean $allowfallback
  */
 public static function nativeTranslateListArrayWithIDs(&$rows, $ids, $reference_table, $tablealias, $language, $keycol, $idkey, &$fielddata, $querySQL, $allowfallback = true, $onlytransFields = true)
 {
     $registry = JFactory::getConfig();
     $defaultLang = $registry->getValue("config.defaultlang");
     $language = isset($language) && $language != '' ? $language : $defaultLang;
     $db = JFactory::getDBO();
     // setup Joomfish pluginds
     $dispatcher = JDispatcher::getInstance();
     JPluginHelper::importPlugin('joomfish');
     $results = $dispatcher->trigger('onBeforeTranslation', array(&$rows, $ids, $reference_table, $tablealias, $language, $keycol, $idkey, &$fielddata, $querySQL, $allowfallback, $onlytransFields));
     // if onBeforeTranslation has cleaned out the list then just return at this point
     if (strlen($ids) == 0) {
         return;
     }
     static $languages;
     if (!isset($languages)) {
         $jfm = JoomFishManager::getInstance();
         $languages = $jfm->getLanguagesIndexedByCode();
     }
     // process fallback language
     $fallbacklanguage = false;
     $fallbackrows = array();
     $fallbackids = array();
     if (isset($languages[$language]) && $languages[$language]->fallback_code != "") {
         $fallbacklanguage = $languages[$language]->fallback_code;
         if (!array_key_exists($fallbacklanguage, $languages)) {
             $allowfallback = false;
         }
     }
     if (!$fallbacklanguage) {
         $allowfallback = false;
     }
     if (isset($ids) && $reference_table != '') {
         $user = JFactory::getUser();
         // NEW SYSTEM - check for published state of translation e.g. using mapping table!
         // Need to know the published column name!!!
         $jfm = JoomFishManager::getInstance();
         $published = $jfm->getContentElement($reference_table)->getPublishedField();
         $published = $user->authorise('core.publish', 'com_joomfish') ? "\n\tAND {$published}=1" : "";
         $sql = "SELECT tab.*, tmap.reference_id, tmap.translation_id FROM #__{$reference_table} as tab" . "\n LEFT JOIN #__jf_translationmap AS tmap ON tmap.reference_table = " . $db->quote($reference_table) . "   AND tmap.translation_id = tab.{$idkey} AND tmap.language= " . $db->quote($languages[$language]->code) . "\n  WHERE tmap.reference_id IN({$ids})" . $published . "\n AND tmap.reference_id IS NOT NULL ";
         $db->setQuery($sql);
         $translations = $db->loadObjectList("reference_id", 'stdClass', false);
         if (count($translations) > 0) {
             $fieldmap = null;
             $rowsToUnset = array();
             foreach (array_keys($rows) as $key) {
                 // assign by reference since not an object
                 $row_to_translate =& $rows[$key];
                 $rowTranslationExists = false;
                 $refid = $row_to_translate[$keycol];
                 if (array_key_exists($refid, $translations)) {
                     $rowTranslationExists = true;
                     $translation = $translations[$refid];
                     //  go on only it this is the matching row
                     if ($translation->reference_id == $refid) {
                         $row_to_translate['original_id'] = $refid;
                         foreach ($fielddata[$tablealias]["fields"] as $fieldcount => $field) {
                             $fieldname = $field->orgname;
                             $transTest = $onlytransFields && !$db->testTranslateableFields($reference_table, array($field->orgname)) ? false : true;
                             if (isset($translation->{$fieldname}) && $transTest) {
                                 $row_to_translate[$fieldcount] = $translation->{$fieldname};
                             }
                         }
                         $rowsToUnset[] = $translation->translation_id;
                         // we cannot unset here as this foreach will set index again if unset element comes after current one!
                     }
                 }
                 if (!$rowTranslationExists) {
                     if ($allowfallback && isset($row_to_translate[$keycol])) {
                         $fallbackrows[$key] =& $row_to_translate;
                         $fallbackids[$key] = $row_to_translate[$keycol];
                     } else {
                         //$results = $dispatcher->trigger('onMissingTranslation', array (&$row_to_translate, $language,$reference_table, $fielddata, $querySQL));
                     }
                 }
             }
             // loop again and remove duplicates
             // @todo try to merge above loops
             foreach (array_keys($rows) as $key) {
                 if (in_array($rows[$key][$keycol], $rowsToUnset)) {
                     unset($rows[$key]);
                 }
             }
         } else {
             foreach (array_keys($rows) as $key) {
                 // assign by reference since not an object
                 $row_to_translate =& $rows[$key];
                 if ($allowfallback && isset($row_to_translate[$keycol])) {
                     $fallbackrows[$key] =& $row_to_translate;
                     $fallbackids[$key] = $row_to_translate[$keycol];
                 } else {
                     //$results = $dispatcher->trigger('onMissingTranslation', array (&$row_to_translate, $language,$reference_table, $fielddata, $querySQL));
                 }
             }
         }
         if ($allowfallback && count($fallbackrows) > 0) {
             $fallbackids = implode($fallbackids, ",");
             JoomFish::nativeTranslateListArrayWithIDs($fallbackrows, $fallbackids, $reference_table, $tablealias, $fallbacklanguage, $keycol, $idkey, $fielddata, $querySQL, false, $onlytransFields);
         }
         $dispatcher->trigger('onAfterTranslation', array(&$rows, $ids, $reference_table, $language, $keycol, $idkey, &$fielddata, $querySQL, $allowfallback, $onlytransFields));
     }
 }