Esempio n. 1
0
    /**
     * Doing database lookup between "alias values" and "id numbers". Translation is bi-directional.
     *
     * @param array $cfg Configuration of look-up table, field names etc.
     * @param string $value Value to match field in database to.
     * @param boolean $aliasToUid If TRUE, the input $value is an alias-string that needs translation to an ID integer. FALSE (default) means the reverse direction
     * @return string Result value of lookup. If no value was found the $value is returned.
     */
    protected function lookUpTranslation($cfg, $value, $aliasToUid = FALSE)
    {
        // Assemble list of fields to look up. This includes localization related fields
        $langEnabled = FALSE;
        $fieldList = array();
        if ($cfg['languageGetVar'] && $cfg['transOrigPointerField'] && $cfg['languageField']) {
            $fieldList[] = 'uid';
            $fieldList[] = $cfg['transOrigPointerField'];
            $fieldList[] = $cfg['languageField'];
            $langEnabled = TRUE;
        }
        // Translate an alias string to an ID
        if ($aliasToUid) {
            // First, test if there is an entry in cache for the alias
            if ($cfg['useUniqueCache'] && ($returnId = $this->lookUp_uniqAliasToId($cfg, $value))) {
                return $returnId;
            } else {
                // If no cached entry, look it up directly in the table:
                $fieldList[] = $cfg['id_field'];
                /** @noinspection PhpUndefinedMethodInspection */
                $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(implode(',', $fieldList), $cfg['table'], $cfg['alias_field'] . '=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($value, $cfg['table']) . ' ' . $cfg['addWhereClause']);
                /** @noinspection PhpUndefinedMethodInspection */
                $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
                /** @noinspection PhpUndefinedMethodInspection */
                $GLOBALS['TYPO3_DB']->sql_free_result($res);
                if ($row) {
                    $returnId = $row[$cfg['id_field']];
                    // If localization is enabled, check if this record is a localized version and if so, find uid of the original version.
                    if ($langEnabled && $row[$cfg['languageField']] > 0) {
                        $returnId = $row[$cfg['transOrigPointerField']];
                    }
                    // Return the id
                    return $returnId;
                }
            }
        } else {
            // Translate an ID to alias string
            // Define the language for the alias
            $lang = intval($this->orig_paramKeyValues[$cfg['languageGetVar']]);
            if ($this->apiWrapper->inList($cfg['languageExceptionUids'], $lang)) {
                // Might be excepted (like you should for CJK cases which does not translate to ASCII equivalents)
                $lang = 0;
            }
            // First, test if there is an entry in cache for the id
            if ($cfg['useUniqueCache'] && !$cfg['autoUpdate'] && ($returnAlias = $this->lookUp_idToUniqAlias($cfg, $value, $lang))) {
                return $returnAlias;
            } else {
                // If no cached entry, look up alias directly in the table (and possibly store cache value)
                $fieldList[] = $cfg['alias_field'];
                /** @noinspection PhpUndefinedMethodInspection */
                $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(implode(',', $fieldList), $cfg['table'], $cfg['id_field'] . '=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($value, $cfg['table']) . ' ' . $cfg['addWhereClause']);
                /** @noinspection PhpUndefinedMethodInspection */
                $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
                /** @noinspection PhpUndefinedMethodInspection */
                $GLOBALS['TYPO3_DB']->sql_free_result($res);
                if ($row) {
                    // Looking for localized version of that
                    if ($langEnabled && $lang) {
                        // If the lang value is there, look for a localized version of record
                        /** @noinspection PhpUndefinedMethodInspection */
                        $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($cfg['alias_field'], $cfg['table'], $cfg['transOrigPointerField'] . '=' . intval($row['uid']) . '
								AND ' . $cfg['languageField'] . '=' . intval($lang) . '
								' . $cfg['addWhereClause']);
                        /** @noinspection PhpUndefinedMethodInspection */
                        $lrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
                        /** @noinspection PhpUndefinedMethodInspection */
                        $GLOBALS['TYPO3_DB']->sql_free_result($res);
                        if ($lrow) {
                            $row = $lrow;
                        }
                    }
                    $maximumAliasLength = min(255, (int) $cfg['maxLength'] ?: $this->maxLookUpLgd);
                    if ($cfg['useUniqueCache']) {
                        // If cache is to be used, store the alias in the cache:
                        $aliasValue = $row[$cfg['alias_field']];
                        if ($this->apiWrapper->strlen('utf-8', $aliasValue) > $maximumAliasLength) {
                            $aliasValue = $this->apiWrapper->crop('utf-8', $aliasValue, $maximumAliasLength);
                        }
                        return $this->lookUp_newAlias($cfg, $aliasValue, $value, $lang);
                    } else {
                        // If no cache for alias, then just return whatever value is appropriate:
                        if (strlen($row[$cfg['alias_field']]) <= $maximumAliasLength) {
                            return $row[$cfg['alias_field']];
                        } else {
                            return $value;
                        }
                    }
                }
            }
        }
        // In case no value was found in translation we return the incoming value. It may be argued that this is not a good idea but generally this can be avoided by using the "useUniqueCache" principle which will ensure unique translation both ways.
        return $value;
    }