/** * Function to translate a section object * @param array $rows * @param array $ids * @param string $reference_table * @param JFLanguage $language * @param string $refTablePrimaryKey * @param array $tableArray * @param string $querySQL * @param boolean $allowfallback */ public function translateListWithIDs(&$rows, $ids, $reference_table, $language, $refTablePrimaryKey = "id", &$tableArray, $querySQL, $allowfallback = true) { //print " translateListWithIDs for ids=$ids refTablePrimaryKey=$refTablePrimaryKey<br>" ; $config = JFactory::getConfig(); $debug = $config->get("dbprefix"); $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'); if ($reference_table == "jf_content") { return; // I can't translate myself ;-) } $results = $dispatcher->trigger('onBeforeTranslation', array(&$rows, &$ids, $reference_table, $language, $refTablePrimaryKey, &$tableArray, $querySQL, $allowfallback)); // if onBeforeTranslation has cleaned out the list then just return at this point if (strlen($ids) == 0) { return; } // find reference table alias $reftableAlias = $reference_table; for ($i = 0; $i < $tableArray["fieldCount"]; $i++) { if (!array_key_exists($i, $tableArray["fieldTableAliasData"])) { continue; } if ($tableArray["fieldTableAliasData"][$i]["tableName"] == $reference_table && $tableArray["fieldTableAliasData"][$i]["fieldNameAlias"] == $refTablePrimaryKey) { $reftableAlias = $tableArray["fieldTableAliasData"][$i]["tableNameAlias"]; break; } } // NASTY KLUDGE TO DEAL WITH SQL CONSTRUCTION IN contact.php, weblinks.php where multiple tables to be translated all use "id" which gets dropped! etc. $currentRow = current($rows); // must not check on catid>0 since this would be uncategorised items if ($reference_table == 'categories' && count($rows) > 0 && isset($currentRow->catid)) { $reftableAlias = $tableArray["tableAliases"]["categories"]; } if ($reference_table == 'sections' && count($rows) > 0 && isset($currentRow->sectionid)) { $reftableAlias = $tableArray["tableAliases"]["sections"]; } //print " translateListWithIDs( ".count($rows). ", ids=$ids, reftab=$reference_table, $language, primkey = $refTablePrimaryKey )<br>"; if ($debug) { echo "<p><strong>JoomFish debug (new):</strong><br>" . "reference_table={$reference_table}<br>" . "{$refTablePrimaryKey} IN({$ids})<br>" . "language={$language}<br>" . (count($rows) > 0 ? "class=" . get_class(current($rows)) : "") . "</p>"; } static $languages; if (!isset($languages)) { $jfm = JoomFishManager::getInstance(); $languages = $jfm->getLanguagesIndexedByCode(); } // process fallback language $fallbacklanguage = false; $fallbackrows = array(); $idarray = explode(",", $ids); $fallbackids = array(); $allowfallback = false; 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(); $published = $user->gid < 21 ? "\n\tAND jf_content.published=1" : ""; //$published = "\n AND jf_content.published=1"; $sql = "SELECT jf_content.reference_field, jf_content.value, jf_content.reference_id, jf_content.original_value " . "\nFROM #__jf_content AS jf_content" . "\nWHERE jf_content.language_id=" . $languages[$language]->lang_id . $published . "\n AND jf_content.reference_id IN({$ids})" . "\n AND jf_content.reference_table='{$reference_table}'"; $db->setQuery($sql); $translations = $db->loadObjectList('', false); if (count($translations) > 0) { $fieldmap = null; foreach (array_keys($rows) as $key) { $row_to_translate = $rows[$key]; $rowTranslationExists = false; //print_r ($row_to_translate); print"<br>"; if (isset($row_to_translate->{$refTablePrimaryKey})) { foreach ($translations as $row) { if ($row->reference_id != $row_to_translate->{$refTablePrimaryKey}) { continue; } // TODO - consider building array for refFields. Some queries may have multiple aliases e.g. SELECT a.*, a.field as fieldalias $refField = $row->reference_field; // adjust refField for aliases (make sure the field is from the same table!). // I could reduce the calculation by building an array of translation reference fields against their mapping number // but this refinement can wait! $fieldmatch = false; // This is used to confirm the field is from the correct table for ($i = 0; $i < $tableArray["fieldCount"]; $i++) { if (!array_key_exists($i, $tableArray["fieldTableAliasData"])) { continue; } // look for fields from the correct table with the correct name if ($tableArray["fieldTableAliasData"][$i]["tableName"] == $reference_table && $tableArray["fieldTableAliasData"][$i]["fieldName"] == $refField && $tableArray["fieldTableAliasData"][$i]["tableNameAlias"] == $reftableAlias) { $refField = $tableArray["fieldTableAliasData"][$i]["fieldNameAlias"]; $fieldmatch = true; break; } } $fieldIndex = $i; if ($fieldmatch && isset($row->reference_id) && $row->reference_id == $row_to_translate->{$refTablePrimaryKey} && $fieldIndex <= $tableArray["fieldCount"]) { if (is_subclass_of($row_to_translate, 'mosDBTable')) { $row_to_translate->set($row->reference_field, $row->value); } else { $row_to_translate->{$refField} = $row->value; } $rowTranslationExists = true; //print_r( $row_to_translate); } } if (!$rowTranslationExists) { if ($allowfallback && isset($rows[$key]->{$refTablePrimaryKey})) { $fallbackrows[$key] = $rows[$key]; $fallbackids[$key] = $rows[$key]->{$refTablePrimaryKey}; } else { $results = $dispatcher->trigger('onMissingTranslation', array(&$row_to_translate, $language, $reference_table, $tableArray, $querySQL)); //JoomFish::processMissingTranslation($row_to_translate, $language,$reference_table); } } } } } else { foreach (array_keys($rows) as $key) { if ($allowfallback && isset($rows[$key]->{$refTablePrimaryKey})) { $fallbackrows[$key] = $rows[$key]; $fallbackids[$key] = $rows[$key]->{$refTablePrimaryKey}; } else { $results = $dispatcher->trigger('onMissingTranslation', array(&$rows[$key], $language, $reference_table, $tableArray, $querySQL)); //JoomFish::processMissingTranslation($rows[$key], $language,$reference_table); } } } if ($allowfallback && count($fallbackrows) > 0) { $fallbackids = implode($fallbackids, ","); JoomFish::translateListWithIDs($fallbackrows, $fallbackids, $reference_table, $fallbacklanguage, $refTablePrimaryKey, $tableArray, $querySQL, false); } $dispatcher->trigger('onAfterTranslation', array(&$rows, $ids, $reference_table, $language, $refTablePrimaryKey, $tableArray, $querySQL, $allowfallback)); } }