00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00098 class t3lib_queryGenerator {
00099 var $lang = array(
00100 'OR' => 'or',
00101 'AND' => 'and',
00102 'comparison' => array(
00103
00104 '0_' => 'contains',
00105 '1_' => 'does not contain',
00106 '2_' => 'starts with',
00107 '3_' => 'does not start with',
00108 '4_' => 'ends with',
00109 '5_' => 'does not end with',
00110 '6_' => 'equals',
00111 '7_' => 'does not equal',
00112
00113 '32_' => 'equals',
00114 '33_' => 'does not equal',
00115 '34_' => 'is greater than',
00116 '35_' => 'is less than',
00117 '36_' => 'is between',
00118 '37_' => 'is not between',
00119 '38_' => 'is in list',
00120 '39_' => 'is not in list',
00121 '40_' => 'binary AND equals',
00122 '41_' => 'binary AND does not equal',
00123 '42_' => 'binary OR equals',
00124 '43_' => 'binary OR does not equal',
00125
00126 '64_' => 'equals',
00127 '65_' => 'does not equal',
00128 '66_' => 'contains',
00129 '67_' => 'does not contain',
00130 '68_' => 'is in list',
00131 '69_' => 'is not in list',
00132 '70_' => 'binary AND equals',
00133 '71_' => 'binary AND does not equal',
00134 '72_' => 'binary OR equals',
00135 '73_' => 'binary OR does not equal',
00136
00137 '96_' => 'equals',
00138 '97_' => 'does not equal',
00139 '98_' => 'is greater than',
00140 '99_' => 'is less than',
00141 '100_' => 'is between',
00142 '101_' => 'is not between',
00143 '102_' => 'binary AND equals',
00144 '103_' => 'binary AND does not equal',
00145 '104_' => 'binary OR equals',
00146 '105_' => 'binary OR does not equal',
00147
00148 '128_' => 'is True',
00149 '129_' => 'is False',
00150
00151 '160_' => 'equals',
00152 '161_' => 'does not equal',
00153 '162_' => 'contains',
00154 '163_' => 'does not contain'
00155 )
00156 );
00157
00158 var $compSQL = array(
00159
00160 '0' => "#FIELD# LIKE '%#VALUE#%'",
00161 '1' => "#FIELD# NOT LIKE '%#VALUE#%'",
00162 '2' => "#FIELD# LIKE '#VALUE#%'",
00163 '3' => "#FIELD# NOT LIKE '#VALUE#%'",
00164 '4' => "#FIELD# LIKE '%#VALUE#'",
00165 '5' => "#FIELD# NOT LIKE '%#VALUE#'",
00166 '6' => "#FIELD# = '#VALUE#'",
00167 '7' => "#FIELD# != '#VALUE#'",
00168
00169 '32' => "#FIELD# = '#VALUE#'",
00170 '33' => "#FIELD# != '#VALUE#'",
00171 '34' => '#FIELD# > #VALUE#',
00172 '35' => '#FIELD# < #VALUE#',
00173 '36' => '#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#',
00174 '37' => 'NOT (#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#)',
00175 '38' => '#FIELD# IN (#VALUE#)',
00176 '39' => '#FIELD# NOT IN (#VALUE#)',
00177 '40' => '(#FIELD# & #VALUE#)=#VALUE#',
00178 '41' => '(#FIELD# & #VALUE#)!=#VALUE#',
00179 '42' => '(#FIELD# | #VALUE#)=#VALUE#',
00180 '43' => '(#FIELD# | #VALUE#)!=#VALUE#',
00181
00182 '64' => "#FIELD# = '#VALUE#'",
00183 '65' => "#FIELD# != '#VALUE#'",
00184 '66' => "#FIELD# LIKE '%#VALUE#%' AND #FIELD# LIKE '%#VALUE1#%'",
00185 '67' => "(#FIELD# NOT LIKE '%#VALUE#%' OR #FIELD# NOT LIKE '%#VALUE1#%')",
00186 '68' => '#FIELD# IN (#VALUE#)',
00187 '69' => '#FIELD# NOT IN (#VALUE#)',
00188 '70' => '(#FIELD# & #VALUE#)=#VALUE#',
00189 '71' => '(#FIELD# & #VALUE#)!=#VALUE#',
00190 '72' => '(#FIELD# | #VALUE#)=#VALUE#',
00191 '73' => '(#FIELD# | #VALUE#)!=#VALUE#',
00192
00193 '96' => "#FIELD# = '#VALUE#'",
00194 '97' => "#FIELD# != '#VALUE#'",
00195 '98' => '#FIELD# > #VALUE#',
00196 '99' => '#FIELD# < #VALUE#',
00197 '100' => '#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#',
00198 '101' => 'NOT (#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#)',
00199 '102' => '(#FIELD# & #VALUE#)=#VALUE#',
00200 '103' => '(#FIELD# & #VALUE#)!=#VALUE#',
00201 '104' => '(#FIELD# | #VALUE#)=#VALUE#',
00202 '105' => '(#FIELD# | #VALUE#)!=#VALUE#',
00203
00204 '128' => "#FIELD# = '1'",
00205 '129' => "#FIELD# != '1'",
00206
00207 '160' => "#FIELD# = '#VALUE#'",
00208 '161' => "#FIELD# != '#VALUE#'",
00209 '162' => '(#FIELD# & #VALUE#)=#VALUE#',
00210 '163' => '(#FIELD# & #VALUE#)=0'
00211 );
00212
00213 var $comp_offsets = array(
00214 'text' => 0,
00215 'number' => 1,
00216 'multiple' => 2,
00217 'relation' => 2,
00218 'files' => 2,
00219 'date' => 3,
00220 'time' => 3,
00221 'boolean' => 4,
00222 'binary' => 5
00223 );
00224 var $noWrap=' nowrap';
00225
00226 var $name;
00227 var $table;
00228 var $fieldList;
00229 var $fields = array();
00230 var $extFieldLists = array();
00231 var $queryConfig=array();
00232 var $enablePrefix=0;
00233 var $enableQueryParts = 0;
00234 var $extJSCODE='';
00235
00236
00237
00238
00239
00240
00241
00245 function makeFieldList() {
00246 global $TCA;
00247 $fieldListArr = array();
00248 if (is_array($TCA[$this->table])) {
00249 t3lib_div::loadTCA($this->table);
00250 reset($TCA[$this->table]['columns']);
00251 while(list($fN)=each($TCA[$this->table]['columns'])) {
00252 $fieldListArr[]=$fN;
00253 }
00254 $fieldListArr[]='uid';
00255 $fieldListArr[]='pid';
00256 $fieldListArr[]='deleted';
00257 if ($TCA[$this->table]['ctrl']['tstamp']) $fieldListArr[]=$TCA[$this->table]['ctrl']['tstamp'];
00258 if ($TCA[$this->table]['ctrl']['crdate']) $fieldListArr[]=$TCA[$this->table]['ctrl']['crdate'];
00259 if ($TCA[$this->table]['ctrl']['cruser_id']) $fieldListArr[]=$TCA[$this->table]['ctrl']['cruser_id'];
00260 if ($TCA[$this->table]['ctrl']['sortby']) $fieldListArr[]=$TCA[$this->table]['ctrl']['sortby'];
00261 }
00262 return implode(',',$fieldListArr);
00263 }
00264
00273 function init($name,$table,$fieldList='') {
00274 global $TCA;
00275
00276
00277 if (is_array($TCA[$table])) {
00278 t3lib_div::loadTCA($table);
00279 $this->name = $name;
00280 $this->table = $table;
00281 $this->fieldList = $fieldList ? $fieldList : $this->makeFieldList();
00282
00283 $fieldArr = t3lib_div::trimExplode(',',$this->fieldList,1);
00284 reset($fieldArr);
00285 while(list(,$fN)=each($fieldArr)) {
00286 $fC = $TCA[$this->table]['columns'][$fN];
00287 $this->fields[$fN] = $fC['config'];
00288 $this->fields[$fN]['exclude'] = $fC['exclude'];
00289 if (is_array($fC) && $fC['label']) {
00290 $this->fields[$fN]['label'] = ereg_replace(':$','',trim($GLOBALS['LANG']->sL($fC['label'])));
00291 switch ($this->fields[$fN]['type']) {
00292 case 'input':
00293 if (eregi('int|year', $this->fields[$fN]['eval'])) {
00294 $this->fields[$fN]['type']='number';
00295 } elseif (eregi('time', $this->fields[$fN]['eval'])) {
00296 $this->fields[$fN]['type'] = 'time';
00297 } elseif (eregi('date', $this->fields[$fN]['eval'])) {
00298 $this->fields[$fN]['type']='date';
00299 } else {
00300 $this->fields[$fN]['type']='text';
00301 }
00302 break;
00303 case 'check':
00304 if (!$this->fields[$fN]['items']) {
00305 $this->fields[$fN]['type'] = 'boolean';
00306 } else {
00307 $this->fields[$fN]['type'] = 'binary';
00308 }
00309 break;
00310 case 'radio':
00311 $this->fields[$fN]['type'] = 'multiple';
00312 break;
00313 case 'select':
00314 $this->fields[$fN]['type'] = 'multiple';
00315 if ($this->fields[$fN]['foreign_table']) {
00316 $this->fields[$fN]['type'] = 'relation';
00317 }
00318 if ($this->fields[$fN]['special']) {
00319 $this->fields[$fN]['type'] = 'text';
00320 }
00321 break;
00322 case 'group':
00323 $this->fields[$fN]['type'] = 'files';
00324 if ($this->fields[$fN]['internal_type'] == 'db') {
00325 $this->fields[$fN]['type'] = 'relation';
00326 }
00327 break;
00328 case 'user':
00329 case 'flex':
00330 case 'passthrough':
00331 case 'none':
00332 case 'text':
00333 default:
00334 $this->fields[$fN]['type']='text';
00335 break;
00336 }
00337
00338 } else {
00339 $this->fields[$fN]['label']='[FIELD: '.$fN.']';
00340 switch ($fN) {
00341 case 'pid':
00342 $this->fields[$fN]['type'] = 'relation';
00343 $this->fields[$fN]['allowed'] = 'pages';
00344 break;
00345 case 'cruser_id':
00346 $this->fields[$fN]['type'] = 'relation';
00347 $this->fields[$fN]['allowed'] = 'be_users';
00348 break;
00349 case 'tstamp':
00350 case 'crdate':
00351 $this->fields[$fN]['type'] = 'time';
00352 break;
00353 case 'deleted':
00354 $this->fields[$fN]['type'] = 'boolean';
00355 break;
00356 default:
00357 $this->fields[$fN]['type'] = 'number';
00358 break;
00359 }
00360 }
00361 }
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399 $this->initUserDef();
00400 }
00401
00410 function setAndCleanUpExternalLists($name,$list,$force='') {
00411 $fields = array_unique(t3lib_div::trimExplode(',',$list.','.$force,1));
00412 reset($fields);
00413 $reList=array();
00414 while(list(,$fN)=each($fields)) {
00415 if ($this->fields[$fN]) $reList[]=$fN;
00416 }
00417 $this->extFieldLists[$name]=implode(',',$reList);
00418 }
00419
00426 function procesData($qC='') {
00427 $this->queryConfig = $qC;
00428
00429 $POST = t3lib_div::_POST();
00430
00431
00432 if($POST['qG_del']) {
00433
00434 $ssArr = $this->getSubscript($POST['qG_del']);
00435 $workArr =& $this->queryConfig;
00436 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00437 $workArr =& $workArr[$ssArr[$i]];
00438 }
00439
00440 unset($workArr[$ssArr[$i]]);
00441 for($j=$ssArr[$i];$j<sizeof($workArr);$j++) {
00442 $workArr[$j] = $workArr[$j+1];
00443 unset($workArr[$j+1]);
00444 }
00445 }
00446
00447
00448 if($POST['qG_ins']) {
00449
00450 $ssArr = $this->getSubscript($POST['qG_ins']);
00451 $workArr =& $this->queryConfig;
00452 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00453 $workArr =& $workArr[$ssArr[$i]];
00454 }
00455
00456 for($j=sizeof($workArr);$j>$ssArr[$i];$j--) {
00457 $workArr[$j] = $workArr[$j-1];
00458 }
00459
00460 unset($workArr[$ssArr[$i]+1]);
00461 $workArr[$ssArr[$i]+1]['type'] = 'FIELD_';
00462 }
00463
00464
00465 if($POST['qG_up']) {
00466
00467 $ssArr = $this->getSubscript($POST['qG_up']);
00468 $workArr =& $this->queryConfig;
00469 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00470 $workArr =& $workArr[$ssArr[$i]];
00471 }
00472
00473 $qG_tmp = $workArr[$ssArr[$i]];
00474 $workArr[$ssArr[$i]] = $workArr[$ssArr[$i]-1];
00475 $workArr[$ssArr[$i]-1] = $qG_tmp;
00476 }
00477
00478
00479 if($POST['qG_nl']) {
00480
00481 $ssArr = $this->getSubscript($POST['qG_nl']);
00482 $workArr =& $this->queryConfig;
00483 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00484 $workArr =& $workArr[$ssArr[$i]];
00485 }
00486
00487 $tempEl = $workArr[$ssArr[$i]];
00488 if (is_array($tempEl)) {
00489 if ($tempEl['type']!='newlevel') {
00490 $workArr[$ssArr[$i]]=array(
00491 'type' => 'newlevel',
00492 'operator' => $tempEl['operator'],
00493 'nl' => array($tempEl)
00494 );
00495 }
00496 }
00497 }
00498
00499
00500 if($POST['qG_remnl']) {
00501
00502 $ssArr = $this->getSubscript($POST['qG_remnl']);
00503 $workArr =& $this->queryConfig;
00504 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00505 $workArr =& $workArr[$ssArr[$i]];
00506 }
00507
00508
00509 $tempEl = $workArr[$ssArr[$i]];
00510 if (is_array($tempEl)) {
00511 if ($tempEl['type']=='newlevel') {
00512 $a1 = array_slice($workArr,0,$ssArr[$i]);
00513 $a2 = array_slice($workArr,$ssArr[$i]);
00514 array_shift($a2);
00515 $a3 = $tempEl['nl'];
00516 $a3[0]['operator'] = $tempEl['operator'];
00517 $workArr=array_merge($a1,$a3,$a2);
00518 }
00519 }
00520 }
00521 }
00522
00529 function cleanUpQueryConfig($queryConfig) {
00530
00531 if (is_array($queryConfig)) {
00532 ksort($queryConfig);
00533 } else {
00534
00535 if(!$queryConfig[0] || !$queryConfig[0]['type']) $queryConfig[0] = array('type'=>'FIELD_');
00536 }
00537
00538 reset($queryConfig);
00539 $c=0;
00540 $arrCount=0;
00541 while(list($key,$conf)=each($queryConfig)) {
00542 if(substr($conf['type'],0,6)=='FIELD_') {
00543 $fName = substr($conf['type'],6);
00544 $fType = $this->fields[$fName]['type'];
00545 } elseif($conf['type']=='newlevel') {
00546 $fType = $conf['type'];
00547 } else {
00548 $fType = 'ignore';
00549 }
00550
00551 switch($fType) {
00552 case 'newlevel':
00553 if(!$queryConfig[$key]['nl']) $queryConfig[$key]['nl'][0]['type'] = 'FIELD_';
00554 $queryConfig[$key]['nl']=$this->cleanUpQueryConfig($queryConfig[$key]['nl']);
00555 break;
00556 case 'userdef':
00557 $queryConfig[$key]=$this->userDefCleanUp($queryConfig[$key]);
00558 break;
00559 case 'ignore':
00560 default:
00561
00562 $verifiedName=$this->verifyType($fName);
00563 $queryConfig[$key]['type']='FIELD_'.$this->verifyType($verifiedName);
00564
00565 if($conf['comparison'] >> 5 != $this->comp_offsets[$fType]) $conf['comparison'] = $this->comp_offsets[$fType] << 5;
00566 $queryConfig[$key]['comparison']=$this->verifyComparison($conf['comparison'],$conf['negate']?1:0);
00567
00568 $queryConfig[$key]['inputValue']=$this->cleanInputVal($queryConfig[$key]);
00569 $queryConfig[$key]['inputValue1']=$this->cleanInputVal($queryConfig[$key],1);
00570
00571
00572 break;
00573 }
00574 }
00575 return $queryConfig;
00576 }
00577
00586 function getFormElements($subLevel=0,$queryConfig='',$parent='') {
00587 $codeArr=array();
00588 if (!is_array($queryConfig)) $queryConfig=$this->queryConfig;
00589
00590 reset($queryConfig);
00591 $c=0;
00592 $arrCount=0;
00593 while(list($key,$conf)=each($queryConfig)) {
00594 $subscript = $parent.'['.$key.']';
00595 $lineHTML = '';
00596 $lineHTML.=$this->mkOperatorSelect($this->name.$subscript,$conf['operator'],$c,($conf['type']!='FIELD_'));
00597 if(substr($conf['type'],0,6)=='FIELD_') {
00598 $fName = substr($conf['type'],6);
00599 $this->fieldName = $fName;
00600 $fType = $this->fields[$fName]['type'];
00601 if($conf['comparison'] >> 5 != $this->comp_offsets[$fType]) $conf['comparison'] = $this->comp_offsets[$fType] << 5;
00602
00603
00604
00605
00606 $queryConfig[$key]['comparison'] += (isset($conf['negate'])-($conf['comparison']%2));
00607
00608 } elseif($conf['type']=='newlevel') {
00609 $fType = $conf['type'];
00610 } else {
00611 $fType = 'ignore';
00612 }
00613 switch($fType) {
00614 case 'ignore':
00615 break;
00616 case 'newlevel':
00617 if(!$queryConfig[$key]['nl']) $queryConfig[$key]['nl'][0]['type'] = 'FIELD_';
00618 $lineHTML.='<input type="hidden" name="'.$this->name.$subscript.'[type]" value="newlevel">';
00619 $codeArr[$arrCount]['sub'] = $this->getFormElements($subLevel+1,$queryConfig[$key]['nl'],$subscript.'[nl]');
00620 break;
00621 case 'userdef':
00622 $lineHTML.=$this->userDef($this->name.$subscript,$conf,$fName,$fType);
00623 break;
00624 case 'date':
00625 $lineHTML.=$this->mkTypeSelect($this->name.$subscript.'[type]',$fName);
00626 $lineHTML.=$this->mkCompSelect($this->name.$subscript.'[comparison]',$conf['comparison'],$conf['negate']?1:0);
00627 $lineHTML.='<input type="checkbox"'.($conf['negate']?' checked':'').' name="'.$this->name.$subscript.'[negate]'.'" onClick="submit();">';
00628
00629 if ($conf['comparison']==100 || $conf['comparison']==101) {
00630 $lineHTML.='<input type="text" name="'.$this->name.$subscript.'[inputValue]_hr'.'" value="'.strftime('%e-%m-%Y', $conf['inputValue']).'" '.$GLOBALS['TBE_TEMPLATE']->formWidth(10).' onChange="typo3form.fieldGet(\''.$this->name.$subscript.'[inputValue]\', \'date\', \'\', 0,0);"><input type="hidden" value="'.htmlspecialchars($conf['inputValue']).'" name="'.$this->name.$subscript.'[inputValue]'.'">';
00631 $lineHTML.='<input type="text" name="'.$this->name.$subscript.'[inputValue1]_hr'.'" value="'.strftime('%e-%m-%Y', $conf['inputValue1']).'" '.$GLOBALS['TBE_TEMPLATE']->formWidth(10).' onChange="typo3form.fieldGet(\''.$this->name.$subscript.'[inputValue1]\', \'date\', \'\', 0,0);"><input type="hidden" value="'.htmlspecialchars($conf['inputValue1']).'" name="'.$this->name.$subscript.'[inputValue1]'.'">';
00632 $this->extJSCODE.='typo3form.fieldSet("'.$this->name.$subscript.'[inputValue]", '.date.', "", 0,0);';
00633 $this->extJSCODE.='typo3form.fieldSet("'.$this->name.$subscript.'[inputValue1]", '.date.', "", 0,0);';
00634 } else {
00635 $lineHTML.='<input type="text" name="'.$this->name.$subscript.'[inputValue]_hr'.'" value="'.strftime('%e-%m-%Y', $conf['inputValue']).'" '.$GLOBALS['TBE_TEMPLATE']->formWidth(10).' onChange="typo3form.fieldGet(\''.$this->name.$subscript.'[inputValue]\', \'date\', \'\', 0,0);"><input type="hidden" value="'.htmlspecialchars($conf['inputValue']).'" name="'.$this->name.$subscript.'[inputValue]'.'">';
00636 $this->extJSCODE.='typo3form.fieldSet("'.$this->name.$subscript.'[inputValue]", '.date.', "", 0,0);';
00637 }
00638 break;
00639 case 'time':
00640 $lineHTML.=$this->mkTypeSelect($this->name.$subscript.'[type]', $fName);
00641 $lineHTML.=$this->mkCompSelect($this->name.$subscript.'[comparison]', $conf['comparison'], $conf['negate']?1:0);
00642
00643 $lineHTML.='<input type="checkbox"'.($conf['negate']?' checked':'').' name="'.$this->name.$subscript.'[negate]'.'" onClick="submit();">';
00644 if ($conf['comparison']==100 || $conf['comparison']==101) {
00645 $lineHTML.='<input type="text" name="'.$this->name.$subscript.'[inputValue]_hr'.'" value="'.strftime('%H:%M %e-%m-%Y', $conf['inputValue']).'" '.$GLOBALS['TBE_TEMPLATE']->formWidth(10).' onChange="typo3form.fieldGet(\''.$this->name.$subscript.'[inputValue]\', \'datetime\', \'\', 0,0);"><input type="hidden" value="'.htmlspecialchars($conf['inputValue']).'" name="'.$this->name.$subscript.'[inputValue]'.'">';
00646 $lineHTML.='<input type="text" name="'.$this->name.$subscript.'[inputValue1]_hr'.'" value="'.strftime('%H:%M %e-%m-%Y', $conf['inputValue1']).'" '.$GLOBALS['TBE_TEMPLATE']->formWidth(10).' onChange="typo3form.fieldGet(\''.$this->name.$subscript.'[inputValue1]\', \'datetime\', \'\', 0,0);"><input type="hidden" value="'.htmlspecialchars($conf['inputValue1']).'" name="'.$this->name.$subscript.'[inputValue1]'.'">';
00647 $this->extJSCODE.='typo3form.fieldSet("'.$this->name.$subscript.'[inputValue]", '.datetime.', "", 0,0);';
00648 $this->extJSCODE.='typo3form.fieldSet("'.$this->name.$subscript.'[inputValue1]", '.datetime.', "", 0,0);';
00649 } else {
00650 $lineHTML.='<input type="text" name="'.$this->name.$subscript.'[inputValue]_hr'.'" value="'.strftime('%H:%M %e-%m-%Y', $conf['inputValue']).'" '.$GLOBALS['TBE_TEMPLATE']->formWidth(10).' onChange="typo3form.fieldGet(\''.$this->name.$subscript.'[inputValue]\', \'datetime\', \'\', 0,0);"><input type="hidden" value="'.htmlspecialchars($conf['inputValue']).'" name="'.$this->name.$subscript.'[inputValue]'.'">';
00651 $this->extJSCODE.='typo3form.fieldSet("'.$this->name.$subscript.'[inputValue]", '.datetime.', "", 0,0);';
00652 }
00653 break;
00654 case 'multiple':
00655 case 'binary':
00656 case 'relation':
00657 $lineHTML.=$this->mkTypeSelect($this->name.$subscript.'[type]', $fName);
00658 $lineHTML.=$this->mkCompSelect($this->name.$subscript.'[comparison]', $conf['comparison'], $conf['negate']?1:0);
00659 $lineHTML.='<input type="checkbox"'.($conf['negate']?' checked':'').' name="'.$this->name.$subscript.'[negate]'.'" onClick="submit();">';
00660 if ($conf['comparison']==68 || $conf['comparison']==69 || $conf['comparison']==162 || $conf['comparison']==163) {
00661 $lineHTML.='<select name="'.$this->name.$subscript.'[inputValue]'.'[]" style="vertical-align:top;" size="5" multiple>';
00662 } elseif ($conf['comparison']==66 || $conf['comparison']==67) {
00663 if (is_array($conf['inputValue'])) {
00664 $conf['inputValue'] = implode(',', $conf['inputValue']);
00665 }
00666 $lineHTML.= '<input type="text" value="'.htmlspecialchars($conf['inputValue']).'" name="'.$this->name.$subscript.'[inputValue]'.'"'.$GLOBALS['TBE_TEMPLATE']->formWidth(10).'>';
00667 } else {
00668 $lineHTML.= '<select name="'.$this->name.$subscript.'[inputValue]'.'" style="vertical-align:top;" onChange="submit();">';
00669 }
00670 if ($conf['comparison']!=66 && $conf['comparison']!=67) {
00671 $lineHTML.= $this->makeOptionList($fName, $conf, $this->table);
00672 $lineHTML.= '</select>';
00673 }
00674 break;
00675 case 'files':
00676 $lineHTML.= $this->mkTypeSelect($this->name.$subscript.'[type]', $fName);
00677 $lineHTML.= $this->mkCompSelect($this->name.$subscript.'[comparison]', $conf['comparison'], $conf['negate']?1:0);
00678 $lineHTML.= '<input type="checkbox"'.($conf['negate']?' checked':'').' name="'.$this->name.$subscript.'[negate]'.'" onClick="submit();">';
00679 if ($conf['comparison']==68 || $conf['comparison']==69) {
00680 $lineHTML .= '<select name="'.$this->name.$subscript.'[inputValue]'.'[]" style="vertical-align:top;" size="5" multiple>';
00681 } else {
00682 $lineHTML .= '<select name="'.$this->name.$subscript.'[inputValue]'.'" style="vertical-align:top;" onChange="submit();">';
00683 }
00684 $lineHTML .= '<option value=""></option>'.$this->makeOptionList($fName, $conf, $this->table);
00685 $lineHTML .= '</select>';
00686 if ($conf['comparison']==66 || $conf['comparison']==67) {
00687 $lineHTML .= ' + <input type="text" value="'.htmlspecialchars($conf['inputValue1']).'" name="'.$this->name.$subscript.'[inputValue1]'.'"'.$GLOBALS['TBE_TEMPLATE']->formWidth(10).'>';
00688 }
00689 break;
00690 case 'boolean':
00691 $lineHTML .= $this->mkTypeSelect($this->name.$subscript.'[type]', $fName);
00692 $lineHTML .= $this->mkCompSelect($this->name.$subscript.'[comparison]', $conf['comparison'], $conf['negate']?1:0);
00693 $lineHTML .= '<input type="checkbox"'.($conf['negate']?' checked':'').' name="'.$this->name.$subscript.'[negate]'.'" onClick="submit();">';
00694 $lineHTML .= '<input type="hidden" value="1" name="'.$this->name.$subscript.'[inputValue]'.'"'.$GLOBALS['TBE_TEMPLATE']->formWidth(10).'>';
00695 break;
00696 default:
00697 $lineHTML .= $this->mkTypeSelect($this->name.$subscript.'[type]', $fName);
00698 $lineHTML .= $this->mkCompSelect($this->name.$subscript.'[comparison]', $conf['comparison'], $conf['negate']?1:0);
00699 $lineHTML .= '<input type="checkbox"'.($conf['negate']?' checked':'').' name="'.$this->name.$subscript.'[negate]'.'" onClick="submit();">';
00700 if ($conf['comparison']==37 || $conf['comparison']==36) {
00701 $lineHTML.='<input type="text" value="'.htmlspecialchars($conf['inputValue']).'" name="'.$this->name.$subscript.'[inputValue]'.'"'.$GLOBALS['TBE_TEMPLATE']->formWidth(5).'>
00702 <input type="text" value="'.htmlspecialchars($conf['inputValue1']).'" name="'.$this->name.$subscript.'[inputValue1]'.'"'.$GLOBALS['TBE_TEMPLATE']->formWidth(5).'>';
00703 } else {
00704 $lineHTML.='<input type="text" value="'.htmlspecialchars($conf['inputValue']).'" name="'.$this->name.$subscript.'[inputValue]'.'"'.$GLOBALS['TBE_TEMPLATE']->formWidth(10).'>';
00705 }
00706 break;
00707 }
00708 if($fType != 'ignore') {
00709 $lineHTML .= $this->updateIcon();
00710 if ($loopcount) {
00711 $lineHTML .= '<input type="image" border="0" src="'.$GLOBALS['BACK_PATH'].'gfx/garbage.gif" class="absmiddle" width="11" height="12" hspace="3" vspace="3" title="Remove condition" name="qG_del'.$subscript.'">';
00712 }
00713 $lineHTML .= '<input type="image" border="0" src="'.$GLOBALS['BACK_PATH'].'gfx/add.gif" class="absmiddle" width="12" height="12" hspace="3" vspace="3" title="Add condition" name="qG_ins'.$subscript.'">';
00714 if($c!=0) $lineHTML.= '<input type="image" border="0" src="'.$GLOBALS['BACK_PATH'].'gfx/pil2up.gif" class="absmiddle" width="12" height="7" hspace="3" vspace="3" title="Move up" name="qG_up'.$subscript.'">';
00715
00716 if($c!=0 && $fType!='newlevel') {
00717 $lineHTML.= '<input type="image" border="0" src="'.$GLOBALS['BACK_PATH'].'gfx/pil2right.gif" class="absmiddle" height="12" width="7" hspace="3" vspace="3" title="New level" name="qG_nl'.$subscript.'">';
00718 }
00719 if($fType=='newlevel') {
00720 $lineHTML.= '<input type="image" border="0" src="'.$GLOBALS['BACK_PATH'].'gfx/pil2left.gif" class="absmiddle" height="12" width="7" hspace="3" vspace="3" title="Collapse new level" name="qG_remnl'.$subscript.'">';
00721 }
00722
00723 $codeArr[$arrCount]['html'] = $lineHTML;
00724 $codeArr[$arrCount]['query'] = $this->getQuerySingle($conf,$c>0?0:1);
00725 $arrCount++;
00726 $c++;
00727 }
00728 $loopcount = 1;
00729 }
00730
00731 $this->queryConfig = $queryConfig;
00732
00733 return $codeArr;
00734 }
00735
00744 function makeOptionList($fN, $conf, $table) {
00745 $fieldSetup = $this->fields[$fN];
00746 if ($fieldSetup['type']=='files') {
00747 if ($conf['comparison']==66 || $conf['comparison']==67) {
00748 $fileExtArray = explode(',', $fieldSetup['allowed']);
00749 natcasesort($fileExtArray);
00750 foreach ($fileExtArray as $fileExt) {
00751 if (t3lib_div::inList($conf['inputValue'], $fileExt)) {
00752 $out .= '<option value="'.$fileExt.'" selected>.'.$fileExt.'</option>';
00753 } else {
00754 $out .= '<option value="'.$fileExt.'">.'.$fileExt.'</option>';
00755 }
00756 }
00757 }
00758 $d = dir(t3lib_div::getIndpEnv(TYPO3_DOCUMENT_ROOT).'/'.$fieldSetup['uploadfolder']);
00759 while (false !== ($entry=$d->read())) {
00760 if ($entry=='.' || $entry=='..') {
00761 continue;
00762 }
00763 $fileArray[] = $entry;
00764 }
00765 $d->close();
00766 natcasesort($fileArray);
00767 foreach ($fileArray as $fileName) {
00768 if (t3lib_div::inList($conf['inputValue'], $fileName)) {
00769 $out .= '<option value="'.$fileName.'" selected>'.$fileName.'</option>';
00770 } else {
00771 $out .= '<option value="'.$fileName.'">'.$fileName.'</option>';
00772 }
00773 }
00774 }
00775 if ($fieldSetup['type']=='multiple') {
00776 foreach ($fieldSetup['items'] as $key=>$val) {
00777 if (substr($val[0], 0, 4) == 'LLL:') {
00778 $value = $GLOBALS['LANG']->sL($val[0]);
00779 } else {
00780 $value = $val[0];
00781 }
00782 if (t3lib_div::inList($conf['inputValue'], $val[1])) {
00783 $out .= '<option value="'.$val[1].'" selected>'.$value.'</option>';
00784 } else {
00785 $out .= '<option value="'.$val[1].'">'.$value.'</option>';
00786 }
00787 }
00788 }
00789 if ($fieldSetup['type']=='binary') {
00790 foreach ($fieldSetup['items'] as $key=>$val) {
00791 if (substr($val[0], 0, 4)=='LLL:') {
00792 $value = $GLOBALS['LANG']->sL($val[0]);
00793 } else {
00794 $value = $val[0];
00795 }
00796 if (t3lib_div::inList($conf['inputValue'], pow(2, $key))) {
00797 $out .= '<option value="'.pow(2, $key).'" selected>'.$value.'</option>';
00798 } else {
00799 $out .= '<option value="'.pow(2, $key).'">'.$value.'</option>';
00800 }
00801 }
00802 }
00803 if ($fieldSetup['type']=='relation') {
00804 if ($fieldSetup['items']) {
00805 foreach ($fieldSetup['items'] as $key=>$val) {
00806 if (substr($val[0], 0, 4) == 'LLL:') {
00807 $value = $GLOBALS['LANG']->sL($val[0]);
00808 } else {
00809 $value = $val[0];
00810 }
00811 if (t3lib_div::inList($conf['inputValue'], $val[1])) {
00812 $out .= '<option value="'.$val[1].'" selected>'.$value.'</option>';
00813 } else {
00814 $out .= '<option value="'.$val[1].'">'.$value.'</option>';
00815 }
00816 }
00817 }
00818 global $TCA;
00819 if (stristr($fieldSetup['allowed'], ',')) {
00820 $from_table_Arr = explode(',', $fieldSetup['allowed']);
00821 $useTablePrefix = 1;
00822 if (!$fieldSetup['prepend_tname']) {
00823 $checkres = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fN, $table, t3lib_BEfunc::deleteClause($table), $groupBy = '', $orderBy = '', $limit = '');
00824 if ($checkres) {
00825 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($checkres)) {
00826 if (stristr($row[$fN], ',')) {
00827 $checkContent = explode(',', $row[$fN]);
00828 foreach ($checkContent as $singleValue) {
00829 if (!stristr($singleValue, '_')) {
00830 $dontPrefixFirstTable = 1;
00831 }
00832 }
00833 } else {
00834 $singleValue = $row[$fN];
00835 if (strlen($singleValue) && !stristr($singleValue, '_')) {
00836 $dontPrefixFirstTable = 1;
00837 }
00838 }
00839 }
00840 }
00841 }
00842 } else {
00843 $from_table_Arr[0] = $fieldSetup['allowed'];
00844 }
00845 if ($fieldSetup['prepend_tname']) {
00846 $useTablePrefix = 1;
00847 }
00848 if ($fieldSetup['foreign_table']) {
00849 $from_table_Arr[0] = $fieldSetup['foreign_table'];
00850 }
00851 $counter = 0;
00852 while (list(, $from_table) = each($from_table_Arr)) {
00853 if (($useTablePrefix && !$dontPrefixFirstTable && $counter!=1) || $counter==1) {
00854 $tablePrefix = $from_table.'_';
00855 }
00856 $counter = 1;
00857 if (is_array($TCA[$from_table])) {
00858 t3lib_div::loadTCA($from_table);
00859 $labelField = $TCA[$from_table]['ctrl']['label'];
00860 $altLabelField = $TCA[$from_table]['ctrl']['label_alt'];
00861 if ($TCA[$from_table]['columns'][$labelField]['config']['items']) {
00862 foreach ($TCA[$from_table]['columns'][$labelField]['config']['items'] as $labelArray) {
00863 if (substr($labelArray[0], 0, 4) == 'LLL:') {
00864 $labelFieldSelect[$labelArray[1]] = $GLOBALS['LANG']->sL($labelArray[0]);
00865 } else {
00866 $labelFieldSelect[$labelArray[1]] = $labelArray[0];
00867 }
00868 }
00869 $useSelectLabels = 1;
00870 }
00871 if ($TCA[$from_table]['columns'][$altLabelField]['config']['items']) {
00872 foreach ($TCA[$from_table]['columns'][$altLabelField]['config']['items'] as $altLabelArray) {
00873 if (substr($altLabelArray[0], 0, 4) == 'LLL:') {
00874 $altLabelFieldSelect[$altLabelArray[1]] = $GLOBALS['LANG']->sL($altLabelArray[0]);
00875 } else {
00876 $altLabelFieldSelect[$altLabelArray[1]] = $altLabelArray[0];
00877 }
00878 }
00879 $useAltSelectLabels = 1;
00880 }
00881 $altLabelFieldSelect = $altLabelField ? ','.$altLabelField : '';
00882 $select_fields = 'uid,'.$labelField.$altLabelFieldSelect;
00883 if (!$GLOBALS['BE_USER']->isAdmin() && $GLOBALS['TYPO3_CONF_VARS']['BE']['lockBeUserToDBmounts']) {
00884 $webMounts = $GLOBALS['BE_USER']->returnWebmounts();
00885 $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
00886 foreach ($webMounts as $key => $val) {
00887 if ($webMountPageTree) {
00888 $webMountPageTreePrefix = ',';
00889 }
00890 $webMountPageTree .= $webMountPageTreePrefix.$this->getTreeList($val, 999, $begin = 0, $perms_clause);
00891 }
00892 if ($from_table=='pages') {
00893 $where_clause = 'uid IN ('.$webMountPageTree.') ';
00894 if (!$GLOBALS['SOBE']->MOD_SETTINGS['show_deleted']) {
00895 $where_clause .= t3lib_BEfunc::deleteClause($from_table).' AND'.$perms_clause;
00896 }
00897 } else {
00898 $where_clause = 'pid IN ('.$webMountPageTree.') ';
00899 if (!$GLOBALS['SOBE']->MOD_SETTINGS['show_deleted']) {
00900 $where_clause .= t3lib_BEfunc::deleteClause($from_table);
00901 }
00902 }
00903 } else {
00904 $where_clause = 'uid';
00905 if (!$GLOBALS['SOBE']->MOD_SETTINGS['show_deleted']) {
00906 $where_clause .= t3lib_BEfunc::deleteClause($from_table);
00907 }
00908 }
00909 $orderBy = 'uid';
00910 if (!$this->tableArray[$from_table]) {
00911 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select_fields, $from_table, $where_clause, $groupBy = '', $orderBy, $limit = '');
00912 }
00913 if ($res) {
00914 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00915 $this->tableArray[$from_table][] = $row;
00916 }
00917 }
00918 foreach ($this->tableArray[$from_table] as $key=>$val) {
00919 if ($useSelectLabels) {
00920 $outArray[$tablePrefix.$val['uid']] = htmlspecialchars($labelFieldSelect[$val[$labelField]]);
00921 } elseif ($val[$labelField]) {
00922 $outArray[$tablePrefix.$val['uid']] = htmlspecialchars($val[$labelField]);
00923 } elseif ($useAltSelectLabels) {
00924 $outArray[$tablePrefix.$val['uid']] = htmlspecialchars($altLabelFieldSelect[$val[$altLabelField]]);
00925 } else {
00926 $outArray[$tablePrefix.$val['uid']] = htmlspecialchars($val[$altLabelField]);
00927 }
00928 }
00929 if ($GLOBALS['SOBE']->MOD_SETTINGS['options_sortlabel'] && is_array($outArray)) {
00930 natcasesort($outArray);
00931 }
00932 }
00933 }
00934 foreach ($outArray as $key2 => $val2) {
00935 if (t3lib_div::inList($conf['inputValue'], $key2)) {
00936 $out .= '<option value="'.$key2.'" selected>['.$key2.'] '.$val2.'</option>';
00937 } else {
00938 $out .= '<option value="'.$key2.'">['.$key2.'] '.$val2.'</option>';
00939 }
00940 }
00941 }
00942 return $out;
00943 }
00944
00945
00953 function printCodeArray($codeArr,$l=0) {
00954 reset($codeArr);
00955 $line='';
00956 if ($l) $indent='<td style="vertical-align:top;"><img height="1" width="50"></td>';
00957 $lf=$l*30;
00958 $bgColor = t3lib_div::modifyHTMLColor($GLOBALS['TBE_TEMPLATE']->bgColor2,$lf,$lf,$lf);
00959 while(list($k,$v)=each($codeArr)) {
00960 $line.= '<tr>'.$indent.'<td bgcolor="'.$bgColor.'"'.$this->noWrap.'>'.$v['html'].'</td></tr>';
00961 if ($this->enableQueryParts) {$line.= '<tr>'.$indent.'<td>'.$this->formatQ($v['query']).'</td></tr>';}
00962 if (is_array($v['sub'])) {
00963 $line.= '<tr>'.$indent.'<td'.$this->noWrap.'>'.$this->printCodeArray($v['sub'],$l+1).'</td></tr>';
00964 }
00965 }
00966 $out='<table border="0" cellpadding="0" cellspacing="1">'.$line.'</table>';
00967 return $out;
00968 }
00969
00976 function formatQ($str) {
00977 return '<font size="1" face="verdana" color="maroon"><i>'.$str.'</i></font>';
00978 }
00979
00989 function mkOperatorSelect($name,$op,$draw,$submit) {
00990 if ($draw) {
00991 $out='<select name="'.$name.'[operator]"'.($submit?' onChange="submit();"':'').'>';
00992 $out.='<option value="AND"'.(!$op||$op=="AND" ? ' selected':'').'>'.$this->lang["AND"].'</option>';
00993 $out.='<option value="OR"'.($op=='OR' ? ' selected':'').'>'.$this->lang['OR'].'</option>';
00994 $out.='</select>';
00995 } else {
00996 $out.='<input type="hidden" value="'.$op.'" name="'.$name.'[operator]">';
00997 $out.='<img src="clear.gif" height="1" width="47">';
00998
00999 }
01000 return $out;
01001 }
01002
01011 function mkTypeSelect($name,$fieldName,$prepend='FIELD_') {
01012 $out='<select name="'.$name.'" onChange="submit();">';
01013 $out.='<option value=""></option>';
01014 reset($this->fields);
01015 while(list($key,)=each($this->fields)) {
01016 if (!$fieldValue['exclude'] || $GLOBALS['BE_USER']->check('non_exclude_fields', $this->table.':'.$key)) {
01017 $label = $this->fields[$key]['label'];
01018 $label_alt = $this->fields[$key]['label_alt'];
01019 $out .= '<option value="'.$prepend.$key.'"'.($key==$fieldName ? ' selected' : '').'>'.$label.'</option>';
01020 }
01021 }
01022 $out.='</select>';
01023 return $out;
01024 }
01025
01032 function verifyType($fieldName) {
01033 reset($this->fields);
01034 $first = '';
01035 while(list($key,)=each($this->fields)) {
01036 if (!$first) $first = $key;
01037 if ($key==$fieldName) return $key;
01038 }
01039 return $first;
01040 }
01041
01049 function verifyComparison($comparison,$neg) {
01050 $compOffSet = $comparison >> 5;
01051 $first=-1;
01052 for($i=32*$compOffSet+$neg;$i<32*($compOffSet+1);$i+=2) {
01053 if ($first==-1) $first = $i;
01054 if (($i >> 1)==($comparison >> 1)) {
01055 return $i;
01056 }
01057 }
01058 return $first;
01059 }
01060
01068 function mkFieldToInputSelect($name,$fieldName) {
01069 $out='<input type="Text" value="'.htmlspecialchars($fieldName).'" name="'.$name.'"'.$GLOBALS['TBE_TEMPLATE']->formWidth().'>'.$this->updateIcon();
01070 $out.='<a href="#" onClick="document.forms[0][\''.$name.'\'].value=\'\';return false;"><img src="'.$GLOBALS['BACK_PATH'].'gfx/garbage.gif" class="absmiddle" width="11" height="12" hspace="3" vspace="3" title="Clear list" border="0"></a>';
01071 $out.='<BR><select name="_fieldListDummy" size="5" onChange="document.forms[0][\''.$name.'\'].value+=\',\'+this.value">';
01072 reset($this->fields);
01073 while(list($key,)=each($this->fields)) {
01074 if (!$fieldValue['exclude'] || $GLOBALS['BE_USER']->check('non_exclude_fields', $this->table.':'.$key)) {
01075 $label = $this->fields[$key]['label'];
01076 $label_alt = $this->fields[$key]['label_alt'];
01077 $out .= '<option value="'.$key.'"'.($key==$fieldName ? ' selected':'').'>'.$label.'</option>';
01078 }
01079 }
01080 $out.='</select>';
01081 return $out;
01082 }
01083
01091 function mkTableSelect($name,$cur) {
01092 global $TCA;
01093 $out='<select name="'.$name.'" onChange="submit();">';
01094 $out.='<option value=""></option>';
01095 reset($TCA);
01096 while(list($tN)=each($TCA)) {
01097 if ($GLOBALS['BE_USER']->check('tables_select',$tN)) {
01098 $out.='<option value="'.$tN.'"'.($tN==$cur ? ' selected':'').'>'.$GLOBALS['LANG']->sl($TCA[$tN]['ctrl']['title']).'</option>';
01099 }
01100 }
01101 $out.='</select>';
01102 return $out;
01103 }
01104
01113 function mkCompSelect($name,$comparison,$neg) {
01114 $compOffSet = $comparison >> 5;
01115 $out='<select name="'.$name.'" onChange="submit();">';
01116 for($i=32*$compOffSet+$neg;$i<32*($compOffSet+1);$i+=2) {
01117 if($this->lang['comparison'][$i.'_']) {
01118 $out.='<option value="'.$i.'"'.(($i >> 1)==($comparison >> 1) ? ' selected':'').'>'.$this->lang['comparison'][$i.'_'].'</option>';
01119 }
01120 }
01121 $out.='</select>';
01122 return $out;
01123 }
01124
01131 function getSubscript($arr) {
01132 while(is_array($arr)) {
01133 reset($arr);
01134 list($key,)=each($arr);
01135 $retArr[] = $key;
01136 $arr = $arr[$key];
01137 }
01138 return $retArr;
01139 }
01140
01146 function initUserDef() {
01147
01148 }
01149
01155 function userDef() {
01156 }
01157
01164 function userDefCleanUp($queryConfig) {
01165 return $queryConfig;
01166 }
01167
01175 function getQuery ($queryConfig,$pad='') {
01176 $qs = '';
01177
01178 ksort($queryConfig);
01179 reset($queryConfig);
01180 $first=1;
01181 while(list($key,$conf) = each($queryConfig)) {
01182 switch($conf['type']) {
01183 case 'newlevel':
01184 $qs.=chr(10).$pad.trim($conf['operator']).' ('.$this->getQuery($queryConfig[$key]['nl'],$pad.' ').chr(10).$pad.')';
01185 break;
01186 case 'userdef':
01187 $qs.=chr(10).$pad.getUserDefQuery($conf,$first);
01188 break;
01189 default:
01190 $qs.=chr(10).$pad.$this->getQuerySingle($conf,$first);
01191 break;
01192 }
01193 $first=0;
01194 }
01195 return $qs;
01196 }
01197
01205 function getQuerySingle($conf,$first) {
01206 $prefix = $this->enablePrefix ? $this->table.'.' : '';
01207 if (!$first) {
01208
01209 $qs .= trim(($conf['operator'] ? $conf['operator'] : 'AND')).' ';
01210 }
01211 $qsTmp = str_replace('#FIELD#', $prefix.trim(substr($conf['type'],6)), $this->compSQL[$conf['comparison']]);
01212 $inputVal = $this->cleanInputVal($conf);
01213 if ($conf['comparison']==68 || $conf['comparison']==69) {
01214 $inputVal = explode(',', $inputVal);
01215 foreach ($inputVal as $key => $fileName) {
01216 $inputVal[$key] = "'".$fileName."'";
01217 }
01218 $inputVal = implode(',', $inputVal);
01219 $qsTmp = str_replace('#VALUE#', $inputVal, $qsTmp);
01220 } elseif ($conf['comparison']==162 || $conf['comparison']==163) {
01221 $inputValArray = explode(',', $inputVal);
01222 $inputVal = 0;
01223 foreach ($inputValArray as $key=>$fileName) {
01224 $inputVal += intval($fileName);
01225 }
01226 $qsTmp = str_replace('#VALUE#', $inputVal, $qsTmp);
01227 } else {
01228 $qsTmp = str_replace('#VALUE#', $GLOBALS['TYPO3_DB']->quoteStr($inputVal,$this->table), $qsTmp);
01229 }
01230 if ($conf['comparison']==37 || $conf['comparison']==36 || $conf['comparison']==66 || $conf['comparison']==67 || $conf['comparison']==100 || $conf['comparison']==101) {
01231 $inputVal = $this->cleanInputVal($conf,'1');
01232 $qsTmp = str_replace('#VALUE1#', $GLOBALS['TYPO3_DB']->quoteStr($inputVal,$this->table), $qsTmp);
01233 }
01234 $qs .= trim($qsTmp);
01235 return $qs;
01236 }
01237
01245 function cleanInputVal($conf,$suffix='') {
01246 if(($conf['comparison'] >> 5==0) || ($conf['comparison']==32 || $conf['comparison']==33 || $conf['comparison']==64 || $conf['comparison']==65 || $conf['comparison']==66 || $conf['comparison']==67 || $conf['comparison']==96 || $conf['comparison']==97)) {
01247 $inputVal = $conf['inputValue'.$suffix];
01248 } elseif ($conf['comparison']==39 || $conf['comparison']==38) {
01249 $inputVal = implode(',',t3lib_div::intExplode(',',$conf['inputValue'.$suffix]));
01250 } elseif ($conf['comparison']==68 || $conf['comparison']==69 || $conf['comparison']==162 || $conf['comparison']==163) {
01251 if (is_array($conf['inputValue'.$suffix])) {
01252 $inputVal = implode(',', $conf['inputValue'.$suffix]);
01253 } elseif ($conf['inputValue'.$suffix]) {
01254 $inputVal = $conf['inputValue'.$suffix];
01255 } else {
01256 $inputVal = 0;
01257 }
01258 } else {
01259 $inputVal = doubleval($conf['inputValue'.$suffix]);
01260 }
01261 return $inputVal;
01262 }
01263
01270 function getUserDefQuery ($qcArr) {
01271 }
01272
01278 function updateIcon() {
01279 return '<input type="image" border="0" src="'.$GLOBALS['BACK_PATH'].'gfx/refresh_n.gif" class="absmiddle" width="14" height="14" hspace="3" vspace="3" title="Update" name="just_update">';
01280 }
01281
01287 function getLabelCol() {
01288 global $TCA;
01289 return $TCA[$this->table]['ctrl']['label'];
01290 }
01291
01299 function makeSelectorTable($modSettings,$enableList='table,fields,query,group,order,limit') {
01300 $enableArr=explode(',',$enableList);
01301
01302 $TDparams = ' class="bgColor5" nowrap';
01303
01304 if (in_array('table',$enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableSelectATable']) {
01305 $out='
01306 <tr>
01307 <td'.$TDparams.'><strong>Select a table:</strong></td>
01308 <td'.$TDparams.'>'.$this->mkTableSelect('SET[queryTable]',$this->table).'</td>
01309 </tr>';
01310 }
01311 if ($this->table) {
01312
01313
01314 $this->setAndCleanUpExternalLists('queryFields',$modSettings['queryFields'],'uid,'.$this->getLabelCol());
01315 $this->setAndCleanUpExternalLists('queryGroup',$modSettings['queryGroup']);
01316 $this->setAndCleanUpExternalLists('queryOrder',$modSettings['queryOrder'].','.$modSettings['queryOrder2']);
01317
01318
01319 $this->extFieldLists['queryLimit']=$modSettings['queryLimit'];
01320 if (!$this->extFieldLists['queryLimit']) $this->extFieldLists['queryLimit']=100;
01321 $parts = t3lib_div::intExplode(',',$this->extFieldLists['queryLimit']);
01322 if ($parts[1]) {
01323 $this->limitBegin = $parts[0];
01324 $this->limitLength = $parts[1];
01325 } else {
01326 $this->limitLength = $this->extFieldLists['queryLimit'];
01327 }
01328 $this->extFieldLists['queryLimit'] = implode(',',array_slice($parts,0,2));
01329
01330
01331 if ($this->extFieldLists['queryOrder']) {
01332 $descParts = explode(',',$modSettings['queryOrderDesc'].','.$modSettings['queryOrder2Desc']);
01333 $orderParts = explode(',',$this->extFieldLists['queryOrder']);
01334 reset($orderParts);
01335 $reList=array();
01336 while(list($kk,$vv)=each($orderParts)) {
01337 $reList[]=$vv.($descParts[$kk]?' DESC':'');
01338 }
01339 $this->extFieldLists['queryOrder_SQL'] = implode(',',$reList);
01340 }
01341
01342
01343 $this->procesData($modSettings['queryConfig'] ? unserialize($modSettings['queryConfig']) : '');
01344
01345 $this->queryConfig = $this->cleanUpQueryConfig($this->queryConfig);
01346
01347 $this->enableQueryParts = $modSettings['search_query_smallparts'];
01348
01349 $codeArr=$this->getFormElements();
01350 $queryCode=$this->printCodeArray($codeArr);
01351
01352 if (in_array('fields',$enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableSelectFields']) {
01353 $out.='
01354 <tr>
01355 <td'.$TDparams.'><strong>Select fields:</strong></td>
01356 <td'.$TDparams.'>'.$this->mkFieldToInputSelect('SET[queryFields]',$this->extFieldLists['queryFields']).'</td>
01357 </tr>';
01358 }
01359 if (in_array('query',$enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableMakeQuery']) {
01360 $out.='<tr>
01361 <td colspan="2"'.$TDparams.'><strong>Make Query:</strong></td>
01362 </tr>
01363 <tr>
01364 <td colspan="2">'.$queryCode.'</td>
01365 </tr>
01366 ';
01367 }
01368 if (in_array('group',$enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableGroupBy']) {
01369 $out.='<tr>
01370 <td'.$TDparams.'><strong>Group By:</strong></td>
01371 <td'.$TDparams.'>'.$this->mkTypeSelect('SET[queryGroup]',$this->extFieldLists['queryGroup'],'').'</td>
01372 </tr>';
01373 }
01374 if (in_array('order',$enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableOrderBy']) {
01375 $orderByArr = explode(',',$this->extFieldLists['queryOrder']);
01376
01377 $orderBy='';
01378 $orderBy.=$this->mkTypeSelect('SET[queryOrder]',$orderByArr[0],'').
01379 ' '.t3lib_BEfunc::getFuncCheck($GLOBALS['SOBE']->id,'SET[queryOrderDesc]',$modSettings['queryOrderDesc'],'','','id="checkQueryOrderDesc"').' <label for="checkQueryOrderDesc">Descending</label>';
01380 if ($orderByArr[0]) {
01381 $orderBy.= '<BR>'.$this->mkTypeSelect('SET[queryOrder2]',$orderByArr[1],'').
01382 ' '.t3lib_BEfunc::getFuncCheck($GLOBALS['SOBE']->id,'SET[queryOrder2Desc]',$modSettings['queryOrder2Desc'],'','','id="checkQueryOrder2Desc"').' <label for="checkQueryOrder2Desc">Descending</label>';
01383 }
01384 $out.='<tr>
01385 <td'.$TDparams.'><strong>Order By:</strong></td>
01386 <td'.$TDparams.'>'.$orderBy.'</td>
01387 </tr>';
01388 }
01389 if (in_array('limit',$enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableLimit']) {
01390 $limit = '<input type="Text" value="'.htmlspecialchars($this->extFieldLists['queryLimit']).'" name="SET[queryLimit]" id="queryLimit"'.$GLOBALS['TBE_TEMPLATE']->formWidth(10).'>'.$this->updateIcon();
01391
01392 $prevLimit = ($this->limitBegin-$this->limitLength) < 0 ? 0 :
01393 $this->limitBegin-$this->limitLength;
01394 if ($this->limitBegin) {
01395 $prevButton = '<input type="button" value="previous '.$this->limitLength.'" onclick=\'document.getElementById("queryLimit").value="'.$prevLimit.','.$this->limitLength.'";document.forms[0].submit();\'>';
01396 }
01397 if (!$this->limitLength) {
01398 $this->limitLength = 100;
01399 }
01400 $nextLimit = $this->limitBegin + $this->limitLength;
01401 if ($nextLimit < 0) $nextLimit = 0;
01402 if ($nextLimit) {
01403 $nextButton = '<input type="button" value="next '.$this->limitLength.'" onclick=\'document.getElementById("queryLimit").value="'.$nextLimit.','.$this->limitLength.'";document.forms[0].submit();\'>';
01404 }
01405
01406 $numberButtons = '<input type="button" value="10" onclick=\'document.getElementById("queryLimit").value="10";document.forms[0].submit();\'>';
01407 $numberButtons .= '<input type="button" value="20" onclick=\'document.getElementById("queryLimit").value="20";document.forms[0].submit();\'>';
01408 $numberButtons .= '<input type="button" value="50" onclick=\'document.getElementById("queryLimit").value="50";document.forms[0].submit();\'>';
01409 $numberButtons .= '<input type="button" value="100" onclick=\'document.getElementById("queryLimit").value="100";document.forms[0].submit();\'>';
01410 $out.='<tr>
01411 <td'.$TDparams.'><strong>Limit:</strong></td>
01412 <td'.$TDparams.'>'.$limit.$prevButton.$nextButton.' '.$numberButtons.'</td>
01413 </tr>
01414 ';
01415 }
01416 }
01417 $out='<table border="0" cellpadding="3" cellspacing="1">'.$out.'</table>';
01418 $out.=$this->JSbottom();
01419 return $out;
01420 }
01421
01431 function getTreeList($id, $depth, $begin=0, $perms_clause) {
01432 $depth = intval($depth);
01433 $begin = intval($begin);
01434 $id = intval($id);
01435 if ($begin==0) {
01436 $theList = $id;
01437 } else {
01438 $theList = '';
01439 }
01440 if ($id && $depth > 0) {
01441 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
01442 'uid',
01443 'pages',
01444 'pid='.$id.' '.t3lib_BEfunc::deleteClause('pages').' AND '.$perms_clause
01445 );
01446 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
01447 if ($begin <= 0) {
01448 $theList .= ','.$row['uid'];
01449 }
01450 if ($depth > 1) {
01451 $theList .= $this->getTreeList($row['uid'], $depth-1, $begin-1, $perms_clause);
01452 }
01453 }
01454 }
01455 return $theList;
01456 }
01457
01465 function getSelectQuery($qString = '', $fN = '') {
01466 if (!$qString) $qString = $this->getQuery($this->queryConfig);
01467 $qString = '('.$qString.')';
01468 if (!$GLOBALS['BE_USER']->isAdmin() && $GLOBALS['TYPO3_CONF_VARS']['BE']['lockBeUserToDBmounts']) {
01469 $webMounts = $GLOBALS['BE_USER']->returnWebmounts();
01470 $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
01471 foreach($webMounts as $key => $val) {
01472 if ($webMountPageTree) {
01473 $webMountPageTreePrefix = ',';
01474 }
01475 $webMountPageTree .= $webMountPageTreePrefix.$this->getTreeList($val, 999, $begin = 0, $perms_clause);
01476 }
01477 if ($this->table == 'pages') {
01478 $qString .= ' AND uid IN ('.$webMountPageTree.')';
01479 } else {
01480 $qString .= ' AND pid IN ('.$webMountPageTree.')';
01481 }
01482 }
01483 $fieldlist = $this->extFieldLists['queryFields'].',pid,deleted';
01484 if (!$GLOBALS['SOBE']->MOD_SETTINGS['show_deleted']) {
01485 $qString .= t3lib_BEfunc::deleteClause($this->table);
01486 }
01487 $query = $GLOBALS['TYPO3_DB']->SELECTquery(
01488 $fieldlist,
01489 $this->table,
01490 $qString,
01491 trim($this->extFieldLists['queryGroup']),
01492 $this->extFieldLists['queryOrder'] ? trim($this->extFieldLists['queryOrder_SQL']) : '',
01493 $this->extFieldLists['queryLimit']
01494 );
01495 return $query;
01496 }
01497
01504 function JSbottom($formname='forms[0]') {
01505 if ($this->extJSCODE) {
01506 $out.='
01507 <script language="javascript" type="text/javascript" src="'.$GLOBALS['BACK_PATH'].'../t3lib/jsfunc.evalfield.js"></script>
01508 <script language="javascript" type="text/javascript" src="'.$GLOBALS['BACK_PATH'].'jsfunc.tbe_editor.js"></script>
01509 <script language="javascript" type="text/javascript">'.$this->extJSCODE.'</script>';
01510 return $out;
01511 }
01512 }
01513 }
01514
01515
01516 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_querygenerator.php']) {
01517 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_querygenerator.php']);
01518 }
01519 ?>