Project

General

Profile

Bug #20529 » bug_11220_6.diff

Administrator Admin, 2009-05-31 21:33

View differences:

class.tslib_content.php Sun May 31 21:26:06 2009
* @see CONTENT(), numRows()
* @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&tx_extrepmgm_pi1[tocEl]=318&cHash=a98cb4e7e6
*/
function getQuery($table, $conf, $returnQueryArray=FALSE) {
// Construct WHERE clause:
$conf['pidInList'] = trim($this->stdWrap($conf['pidInList'],$conf['pidInList.']));
function getQuery($table, $conf, $returnQueryArray=FALSE) {
// All Values of $conf can be parsed through stdWrap
// The Values ('pidInList','uidInList','recursive','languageField') are stdWrap_ped by
// default while real datatype is unimportant (string, integer)
// Most SQL-Devices may optionally stdWrap_ped too ('where','groupBy','orderBy','join','leftjoin','rightjoin')
// To avoid potentially misbehaviors all SQL-Parameters and "min" and "begin" explicitly have to be noted with keyword stdWrap
// min., and begin. are parsed through calc, which is incompatible to prioCalc of stdWrap
// but stdWrap can be choosen by max.stdWrap and accordingly begin.stdWrap
// Values which must not be stdWrap_ped:
// - andWhere is stdWrap_ped anyway in function getWhere()
// changing this extra-handling is only possible by flag because of backward-compatibility
// Due to new Configuration-Options it's in responsibility of the TypoScript-Author that results are correct
// and Automatism can be switched off or overriden a bit more
$stdWrapAllowedValues = Array('pidInList','uidInList','recursive','languageField');
$stdWrapOptionalValues = Array('begin','max','selectFields','where','groupBy','orderBy','join','leftjoin','rightjoin');
$doNotstdWrap = Array('andWhere');
$config = Array();
foreach ($conf as $k => $v) {
$r = '';
preg_match('/(.*?)(\.)?$/',$k,$r);
if (!in_array($r[1],$doNotstdWrap)) {
// Avoiding that stdWrap options are written as values to $config
// strcmp returns 0 if true
if (strcmp($r[2],'') === 0 && !$conf[ $r[1].'.' ] ||
strcmp($r[2],'.') === 0 && $conf[ $r[1].'.' ]) {
// default stdWrap
if (in_array($r[1],$stdWrapAllowedValues)) {
$config[ $r[1] ] = trim($this->stdWrap($conf[ $r[1] ],$conf[ $k ]));
}
// optional stdWrap
elseif (in_array($r[1],$stdWrapOptionalValues)) {
// optional stdWrap WITH usage
if (is_array($conf[$k]) && array_key_exists('stdWrap',$conf[$k]) && strcmp($conf[$k]['stdWrap'],'') !== 0) {
$config[ $r[1] ] = trim($this->stdWrap($conf[ $r[1] ]['stdWrap.'],$conf[ $k ]['stdWrap']));
}
// optional stdWrap WITHOUT usage
else {
$config[ $r[1] ] = trim($this->stdWrap($conf[ $r[1] ],$conf[ $k ]));
}
}
// unknown parameter
else {
$config[ $r[1] ] = $conf[ $k ];
}
}
// Catching of unknown behavior
// doesn't seem to make any problems in loop
if (!isset($config[ $k ])) $config[ $k ] = $conf[ $k ];
}
}
// Handle recursive function for the pidInList
if (isset($conf['recursive'])) {
$conf['recursive'] = intval($conf['recursive']);
if ($conf['recursive'] > 0) {
foreach (explode(',', $conf['pidInList']) as $value) {
$pidList .= $value . ',' . $this->getTreeList($value, $conf['recursive']);
if (isset($config['recursive'])) {
$config['recursive'] = intval($config['recursive']);
if ($config['recursive'] > 0) {
foreach (explode(',', $config['pidInList']) as $value) {
$pidList .= $value . ',' . $this->getTreeList($value, $config['recursive']);
}
$conf['pidInList'] = trim($pidList, ',');
$config['pidInList'] = trim($pidList, ',');
}
}
if (!strcmp($conf['pidInList'],'')) {
$conf['pidInList'] = 'this';
// $conf['pidInList']['dontSetPid'] is set as new Option that avoids that
// an empty $conf['pidInList'] is filled with 'this' (= current pid)
if (!strcmp($config['pidInList'],'') && !$config['pidInList']['dontSetPid']) {
$config['pidInList'] = 'this';
}
$queryParts = $this->getWhere($table,$conf,TRUE);
$queryParts = $this->getWhere($table,$config,TRUE);
// Fields:
$queryParts['SELECT'] = $conf['selectFields'] ? $conf['selectFields'] : '*';
$queryParts['SELECT'] = $config['selectFields'] ? $config['selectFields'] : '*';
// Setting LIMIT:
if ($conf['max'] || $conf['begin']) {
if ($config['max'] || $config['begin']) {
$error=0;
// Finding the total number of records, if used:
if (strstr(strtolower($conf['begin'].$conf['max']),'total')) {
if (strstr(strtolower($config['begin'].$config['max']),'total')) {
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, $queryParts['WHERE'], $queryParts['GROUPBY']);
if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
$GLOBALS['TT']->setTSlogMessage($error);
} else {
$row = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
$conf['max'] = str_ireplace('total', $row[0], $conf['max']);
$conf['begin'] = str_ireplace('total', $row[0], $conf['begin']);
$config['max'] = str_ireplace('total', $row[0], $config['max']);
$config['begin'] = str_ireplace('total', $row[0], $config['begin']);
}
$GLOBALS['TYPO3_DB']->sql_free_result($res);
}
if (!$error) {
$conf['begin'] = t3lib_div::intInRange(ceil($this->calc($conf['begin'])),0);
$conf['max'] = t3lib_div::intInRange(ceil($this->calc($conf['max'])),0);
if ($conf['begin'] && !$conf['max']) {
$conf['max'] = 100000;
// If ..[stdWrap] calculation by calc has to be avoided because it's incompatible with stdWrap-option prioCalc
$config['begin'] = (array_key_exists($conf['begin.']) && array_key_exists('stdWrap',$conf['begin.']) && strcmp($conf['begin.']['stdWrap'],'') !== 0) ? t3lib_div::intInRange(ceil($this->calc($config['begin'])),0) : $config['begin'];
$config['max'] = (array_key_exists('max.',$conf) && array_key_exists('stdWrap',$conf['max.']) && strcmp($conf['max.']['stdWrap'],'') !== 0) ? t3lib_div::intInRange(ceil($this->calc($config['max'])),0) : $config['max'];
if ($config['begin'] && !$config['max']) {
$config['max'] = 100000;
}
if ($conf['begin'] && $conf['max']) {
$queryParts['LIMIT'] = $conf['begin'].','.$conf['max'];
} elseif (!$conf['begin'] && $conf['max']) {
$queryParts['LIMIT'] = $conf['max'];
if ($config['begin'] && $config['max']) {
$queryParts['LIMIT'] = $config['begin'].','.$config['max'];
} elseif (!$config['begin'] && $config['max']) {
$queryParts['LIMIT'] = $config['max'];
}
}
}
if (!$error) {
// Setting up tablejoins:
$joinPart='';
if ($conf['join']) {
$joinPart = 'JOIN ' .trim($conf['join']);
} elseif ($conf['leftjoin']) {
$joinPart = 'LEFT OUTER JOIN ' .trim($conf['leftjoin']);
} elseif ($conf['rightjoin']) {
$joinPart = 'RIGHT OUTER JOIN ' .trim($conf['rightjoin']);
if ($config['join']) {
$joinPart = 'JOIN ' .trim($config['join']);
} elseif ($config['leftjoin']) {
$joinPart = 'LEFT OUTER JOIN ' .trim($config['leftjoin']);
} elseif ($config['rightjoin']) {
$joinPart = 'RIGHT OUTER JOIN ' .trim($config['rightjoin']);
}
// Compile and return query:
$queryParts['FROM'] = trim($table.' '.$joinPart);
$query = $GLOBALS['TYPO3_DB']->SELECTquery(
......
$queryParts['ORDERBY'],
$queryParts['LIMIT']
);
return $returnQueryArray ? $queryParts : $query;
}
}
......
}
$query.=' AND '.$conf['languageField'].' IN ('.$sys_language_content.')';
}
$andWhere = trim($this->stdWrap($conf['andWhere'],$conf['andWhere.']));
if ($conf['andWhere'] && strtolower($conf['andWhere']['dontUseStdWrap']) != '1') {
$andWhere = trim($this->stdWrap($conf['andWhere'],$conf['andWhere.']));
}
else $andWhere = $conf['andWhere'];
if ($andWhere) {
$query.=' AND '.$andWhere;
}
(6-6/7)