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
00095 class t3lib_queryGenerator {
00096 var $lang = array(
00097 "OR" => "or",
00098 "AND" => "and",
00099 "comparison" => array(
00100
00101 "0_" => "contains",
00102 "1_" => "does not contain",
00103 "2_" => "starts with",
00104 "3_" => "does not start with",
00105 "4_" => "ends with",
00106 "5_" => "does not end with",
00107 "6_" => "equals",
00108 "7_" => "does not equal",
00109
00110 "32_" => "equals",
00111 "33_" => "does not equal",
00112 "34_" => "is greater than",
00113 "35_" => "is less than",
00114 "36_" => "is between",
00115 "37_" => "is not between",
00116 "38_" => "is in list",
00117 "39_" => "is not in list",
00118 "40_" => "binary AND equals",
00119 "41_" => "binary AND does not equal",
00120 "42_" => "binary OR equals",
00121 "43_" => "binary OR does not equal"
00122 )
00123 );
00124
00125 var $compSQL = array(
00126
00127 "0" => "#FIELD# LIKE '%#VALUE#%'",
00128 "1" => "#FIELD# NOT LIKE '%#VALUE#%'",
00129 "2" => "#FIELD# LIKE '#VALUE#%'",
00130 "3" => "#FIELD# NOT LIKE '#VALUE#%'",
00131 "4" => "#FIELD# LIKE '%#VALUE#'",
00132 "5" => "#FIELD# NOT LIKE '%#VALUE#'",
00133 "6" => "#FIELD# = '#VALUE#'",
00134 "7" => "#FIELD# != '#VALUE#'",
00135
00136 "32" => "#FIELD# = '#VALUE#'",
00137 "33" => "#FIELD# != '#VALUE#'",
00138 "34" => "#FIELD# > #VALUE#",
00139 "35" => "#FIELD# < #VALUE#",
00140 "36" => "#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#",
00141 "37" => "NOT (#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#)",
00142 "38" => "#FIELD# IN (#VALUE#)",
00143 "39" => "#FIELD# NOT IN (#VALUE#)",
00144 "40" => "(#FIELD# & #VALUE#)=#VALUE#",
00145 "41" => "(#FIELD# & #VALUE#)!=#VALUE#",
00146 "42" => "(#FIELD# | #VALUE#)=#VALUE#",
00147 "43" => "(#FIELD# | #VALUE#)!=#VALUE#"
00148 );
00149
00150 var $comp_offsets = array(
00151 "text" => 0,
00152 "number" => 1,
00153 "date" => 1
00154 );
00155 var $noWrap=" nowrap";
00156
00157 var $name;
00158 var $table;
00159 var $fieldList;
00160 var $fields = array();
00161 var $extFieldLists = array();
00162 var $queryConfig=array();
00163 var $enablePrefix=0;
00164 var $enableQueryParts = 0;
00165 var $extJSCODE="";
00166
00167
00168
00169
00170
00171
00172
00176 function makeFieldList() {
00177 global $TCA;
00178 $fieldListArr = array();
00179 if (is_array($TCA[$this->table])) {
00180 t3lib_div::loadTCA($this->table);
00181 reset($TCA[$this->table]["columns"]);
00182 while(list($fN)=each($TCA[$this->table]["columns"])) {
00183 $fieldListArr[]=$fN;
00184 }
00185 $fieldListArr[]="uid";
00186 $fieldListArr[]="pid";
00187 if ($TCA[$this->table]["ctrl"]["tstamp"]) $fieldListArr[]=$TCA[$this->table]["ctrl"]["tstamp"];
00188 if ($TCA[$this->table]["ctrl"]["crdate"]) $fieldListArr[]=$TCA[$this->table]["ctrl"]["crdate"];
00189 if ($TCA[$this->table]["ctrl"]["cruser_id"]) $fieldListArr[]=$TCA[$this->table]["ctrl"]["cruser_id"];
00190 if ($TCA[$this->table]["ctrl"]["sortby"]) $fieldListArr[]=$TCA[$this->table]["ctrl"]["sortby"];
00191 }
00192 return implode(",",$fieldListArr);
00193 }
00194
00203 function init($name,$table,$fieldList="") {
00204 global $TCA;
00205
00206
00207 if (is_array($TCA[$table])) {
00208 t3lib_div::loadTCA($table);
00209 $this->name = $name;
00210 $this->table = $table;
00211 $this->fieldList = $fieldList ? $fieldList : $this->makeFieldList();
00212
00213 $fieldArr = t3lib_div::trimExplode(",",$this->fieldList,1);
00214 reset($fieldArr);
00215 while(list(,$fN)=each($fieldArr)) {
00216 $fC = $TCA[$this->table]["columns"][$fN];
00217 if (is_array($fC) && $fC["label"]) {
00218 $this->fields[$fN]["label"] = ereg_replace(":$","",trim($GLOBALS["LANG"]->sL($fC["label"])));
00219 switch($fC["config"]["type"]) {
00220 case "input":
00221 if (eregi("int|year",$fC["config"]["eval"])) {
00222 $this->fields[$fN]["type"]="number";
00223 } elseif (eregi("date|time",$fC["config"]["eval"])) {
00224 $this->fields[$fN]["type"]="date";
00225 } else {
00226 $this->fields[$fN]["type"]="text";
00227 }
00228 break;
00229 case "check":
00230 case "select":
00231 $this->fields[$fN]["type"]="number";
00232 break;
00233 case "text":
00234 default:
00235 $this->fields[$fN]["type"]="text";
00236 break;
00237 }
00238
00239 } else {
00240 $this->fields[$fN]["label"]="[FIELD: ".$fN."]";
00241 $this->fields[$fN]["type"]="number";
00242 }
00243 }
00244 }
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 $this->initUserDef();
00282 }
00283
00292 function setAndCleanUpExternalLists($name,$list,$force="") {
00293 $fields = array_unique(t3lib_div::trimExplode(",",$list.",".$force,1));
00294 reset($fields);
00295 $reList=array();
00296 while(list(,$fN)=each($fields)) {
00297 if ($this->fields[$fN]) $reList[]=$fN;
00298 }
00299 $this->extFieldLists[$name]=implode(",",$reList);
00300 }
00301
00308 function procesData($qC="") {
00309 $this->queryConfig = $qC;
00310
00311 $POST = t3lib_div::_POST();
00312
00313
00314 if($POST["qG_del"]) {
00315
00316 $ssArr = $this->getSubscript($POST["qG_del"]);
00317 $workArr =& $this->queryConfig;
00318 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00319 $workArr =& $workArr[$ssArr[$i]];
00320 }
00321
00322 unset($workArr[$ssArr[$i]]);
00323 for($j=$ssArr[$i];$j<sizeof($workArr);$j++) {
00324 $workArr[$j] = $workArr[$j+1];
00325 unset($workArr[$j+1]);
00326 }
00327 }
00328
00329
00330 if($POST["qG_ins"]) {
00331
00332 $ssArr = $this->getSubscript($POST["qG_ins"]);
00333 $workArr =& $this->queryConfig;
00334 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00335 $workArr =& $workArr[$ssArr[$i]];
00336 }
00337
00338 for($j=sizeof($workArr);$j>$ssArr[$i];$j--) {
00339 $workArr[$j] = $workArr[$j-1];
00340 }
00341
00342 unset($workArr[$ssArr[$i]+1]);
00343 $workArr[$ssArr[$i]+1]['type'] = "FIELD_";
00344 }
00345
00346
00347 if($POST["qG_up"]) {
00348
00349 $ssArr = $this->getSubscript($POST["qG_up"]);
00350 $workArr =& $this->queryConfig;
00351 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00352 $workArr =& $workArr[$ssArr[$i]];
00353 }
00354
00355 $qG_tmp = $workArr[$ssArr[$i]];
00356 $workArr[$ssArr[$i]] = $workArr[$ssArr[$i]-1];
00357 $workArr[$ssArr[$i]-1] = $qG_tmp;
00358 }
00359
00360
00361 if($POST["qG_nl"]) {
00362
00363 $ssArr = $this->getSubscript($POST["qG_nl"]);
00364 $workArr =& $this->queryConfig;
00365 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00366 $workArr =& $workArr[$ssArr[$i]];
00367 }
00368
00369 $tempEl = $workArr[$ssArr[$i]];
00370 if (is_array($tempEl)) {
00371 if ($tempEl["type"]!="newlevel") {
00372 $workArr[$ssArr[$i]]=array(
00373 "type" => "newlevel",
00374 "operator" => $tempEl["operator"],
00375 "nl" => array($tempEl)
00376 );
00377 }
00378 }
00379 }
00380
00381
00382 if($POST["qG_remnl"]) {
00383
00384 $ssArr = $this->getSubscript($POST["qG_remnl"]);
00385 $workArr =& $this->queryConfig;
00386 for($i=0;$i<sizeof($ssArr)-1;$i++) {
00387 $workArr =& $workArr[$ssArr[$i]];
00388 }
00389
00390
00391 $tempEl = $workArr[$ssArr[$i]];
00392 if (is_array($tempEl)) {
00393 if ($tempEl["type"]=="newlevel") {
00394 $a1 = array_slice($workArr,0,$ssArr[$i]);
00395 $a2 = array_slice($workArr,$ssArr[$i]);
00396 array_shift($a2);
00397 $a3 = $tempEl["nl"];
00398 $a3[0]["operator"] = $tempEl["operator"];
00399 $workArr=array_merge($a1,$a3,$a2);
00400 }
00401 }
00402 }
00403 }
00404
00411 function cleanUpQueryConfig($queryConfig) {
00412
00413 if (is_array($queryConfig)) {
00414 ksort($queryConfig);
00415 } else {
00416
00417 if(!$queryConfig[0] || !$queryConfig[0]["type"]) $queryConfig[0] = array("type"=>"FIELD_");
00418 }
00419
00420 reset($queryConfig);
00421 $c=0;
00422 $arrCount=0;
00423 while(list($key,$conf)=each($queryConfig)) {
00424 if(substr($conf["type"],0,6)=="FIELD_") {
00425 $fName = substr($conf["type"],6);
00426 $fType = $this->fields[$fName]["type"];
00427 } elseif($conf["type"]=="newlevel") {
00428 $fType = $conf["type"];
00429 } else {
00430 $fType = "ignore";
00431 }
00432
00433 switch($fType) {
00434 case "newlevel":
00435 if(!$queryConfig[$key]["nl"]) $queryConfig[$key]["nl"][0]["type"] = "FIELD_";
00436 $queryConfig[$key]["nl"]=$this->cleanUpQueryConfig($queryConfig[$key]["nl"]);
00437 break;
00438 case "userdef":
00439 $queryConfig[$key]=$this->userDefCleanUp($queryConfig[$key]);
00440 break;
00441 case "ignore":
00442 default:
00443
00444 $verifiedName=$this->verifyType($fName);
00445 $queryConfig[$key]["type"]="FIELD_".$this->verifyType($verifiedName);
00446
00447 if($conf["comparison"] >> 5 != $this->comp_offsets[$fType]) $conf["comparison"] = $this->comp_offsets[$fType] << 5;
00448 $queryConfig[$key]["comparison"]=$this->verifyComparison($conf["comparison"],$conf["negate"]?1:0);
00449
00450 $queryConfig[$key]["inputValue"]=$this->cleanInputVal($queryConfig[$key]);
00451 $queryConfig[$key]["inputValue1"]=$this->cleanInputVal($queryConfig[$key],1);
00452
00453
00454 break;
00455 }
00456 }
00457 return $queryConfig;
00458 }
00459
00468 function getFormElements($subLevel=0,$queryConfig="",$parent="") {
00469 $codeArr=array();
00470 if (!is_array($queryConfig)) $queryConfig=$this->queryConfig;
00471
00472 reset($queryConfig);
00473 $c=0;
00474 $arrCount=0;
00475 while(list($key,$conf)=each($queryConfig)) {
00476 $subscript = $parent."[$key]";
00477 $lineHTML = "";
00478 $lineHTML.=$this->mkOperatorSelect($this->name.$subscript,$conf["operator"],$c,($conf["type"]!="FIELD_"));
00479 if(substr($conf["type"],0,6)=="FIELD_") {
00480 $fName = substr($conf["type"],6);
00481 $fType = $this->fields[$fName]["type"];
00482 if($conf["comparison"] >> 5 != $this->comp_offsets[$fType]) $conf["comparison"] = $this->comp_offsets[$fType] << 5;
00483
00484
00485
00486
00487 $queryConfig[$key]["comparison"] += (isset($conf["negate"])-($conf["comparison"]%2));
00488
00489 } elseif($conf["type"]=="newlevel") {
00490 $fType = $conf["type"];
00491 } else {
00492 $fType = "ignore";
00493 }
00494
00495 switch($fType) {
00496 case "ignore":
00497 break;
00498 case "newlevel":
00499 if(!$queryConfig[$key]["nl"]) $queryConfig[$key]["nl"][0]["type"] = "FIELD_";
00500 $lineHTML.='<input type="hidden" name="'.$this->name.$subscript.'[type]" value="newlevel">';
00501 $codeArr[$arrCount]["sub"] = $this->getFormElements($subLevel+1,$queryConfig[$key]["nl"],$subscript."[nl]");
00502 break;
00503 case "userdef":
00504 $lineHTML.=$this->userDef($this->name.$subscript,$conf,$fName,$fType);
00505 break;
00506 default:
00507 $lineHTML.=$this->mkTypeSelect($this->name.$subscript.'[type]',$fName);
00508 $lineHTML.=$this->mkCompSelect($this->name.$subscript.'[comparison]',$conf["comparison"],$conf["negate"]?1:0);
00509 $lineHTML.='<input type="checkbox" '.($conf["negate"]?"checked":"").' name="'.$this->name.$subscript.'[negate]'.'" onClick="submit();">';
00510
00511 if ($conf["comparison"]==37 || $conf["comparison"]==36) {
00512 $lineHTML.='<input type="text" value="'.htmlspecialchars($conf["inputValue"]).'" name="'.$this->name.$subscript.'[inputValue]'.'"'.$GLOBALS["TBE_TEMPLATE"]->formWidth(5).'>
00513 <input type="text" value="'.htmlspecialchars($conf["inputValue1"]).'" name="'.$this->name.$subscript.'[inputValue1]'.'"'.$GLOBALS["TBE_TEMPLATE"]->formWidth(5).'>
00514 ';
00515 } elseif ($fType=="date") {
00516 $lineHTML.='<input type="text" name="'.$this->name.$subscript.'[inputValue]_hr'.'"'.$GLOBALS["TBE_TEMPLATE"]->formWidth(10).' onChange="typo3FormFieldGet(\''.$this->name.$subscript.'[inputValue]\', \'datetime\', \'\', 0,0);"><input type="hidden" value="'.htmlspecialchars($conf["inputValue"]).'" name="'.$this->name.$subscript.'[inputValue]'.'">';
00517 $this->extJSCODE.='typo3FormFieldSet("'.$this->name.$subscript.'[inputValue]", "datetime", "", 0,0);';
00518 } else {
00519 $lineHTML.='<input type="text" value="'.htmlspecialchars($conf["inputValue"]).'" name="'.$this->name.$subscript.'[inputValue]'.'"'.$GLOBALS["TBE_TEMPLATE"]->formWidth(10).'>';
00520 }
00521 break;
00522 }
00523 if($fType != "ignore") {
00524 $lineHTML .= $this->updateIcon();
00525 $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.'">';
00526 $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.'">';
00527 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.'">';
00528
00529 if($c!=0 && $fType!="newlevel") {
00530 $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.'">';
00531 }
00532 if($fType=="newlevel") {
00533 $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.'">';
00534 }
00535
00536 $codeArr[$arrCount]["html"] = $lineHTML;
00537 $codeArr[$arrCount]["query"] = $this->getQuerySingle($conf,$c>0?0:1);
00538 $arrCount++;
00539 $c++;
00540 }
00541 }
00542
00543 $this->queryConfig = $queryConfig;
00544
00545 return $codeArr;
00546 }
00547
00555 function printCodeArray($codeArr,$l=0) {
00556 reset($codeArr);
00557 $line="";
00558 if ($l) $indent='<td><img height="1" width="50"></td>';
00559 $lf=$l*30;
00560 $bgColor = t3lib_div::modifyHTMLColor($GLOBALS["TBE_TEMPLATE"]->bgColor2,$lf,$lf,$lf);
00561 while(list($k,$v)=each($codeArr)) {
00562 $line.= '<tr>'.$indent.'<td bgcolor="'.$bgColor.'"'.$this->noWrap.'>'.$v["html"].'</td></tr>';
00563 if ($this->enableQueryParts) {$line.= '<tr>'.$indent.'<td>'.$this->formatQ($v["query"]).'</td></tr>';}
00564 if (is_array($v["sub"])) {
00565 $line.= '<tr>'.$indent.'<td'.$this->noWrap.'>'.$this->printCodeArray($v["sub"],$l+1).'</td></tr>';
00566 }
00567 }
00568 $out='<table border=0 cellpadding=0 cellspacing=1>'.$line.'</table>';
00569 return $out;
00570 }
00571
00578 function formatQ($str) {
00579 return '<font size=1 face=verdana color=maroon><i>'.$str.'</i></font>';
00580 }
00581
00591 function mkOperatorSelect($name,$op,$draw,$submit) {
00592 if ($draw) {
00593 $out='<select name="'.$name.'[operator]"'.($submit?' onChange="submit();"':'').'>';
00594 $out.='<option value="AND"'.(!$op||$op=="AND" ? ' selected':'').'>'.$this->lang["AND"].'</option>';
00595 $out.='<option value="OR"'.($op=="OR" ? ' selected':'').'>'.$this->lang["OR"].'</option>';
00596 $out.='</select>';
00597 } else {
00598 $out.='<input type="hidden" value="'.$op.'" name="'.$name.'[operator]">';
00599 $out.='<img src="clear.gif" height="1" width="47">';
00600
00601 }
00602 return $out;
00603 }
00604
00613 function mkTypeSelect($name,$fieldName,$prepend="FIELD_") {
00614 $out='<select name="'.$name.'" onChange="submit();">';
00615 $out.='<option value=""></option>';
00616 reset($this->fields);
00617 while(list($key,)=each($this->fields)) {
00618 if ($GLOBALS["BE_USER"]->check("non_exclude_fields",$this->table.":".$key)) {
00619 $out.='<option value="'.$prepend.$key.'"'.($key==$fieldName ? ' selected':'').'>'.$this->fields[$key]["label"].'</option>';
00620 }
00621 }
00622 $out.='</select>';
00623 return $out;
00624 }
00625
00632 function verifyType($fieldName) {
00633 reset($this->fields);
00634 $first = "";
00635 while(list($key,)=each($this->fields)) {
00636 if (!$first) $first = $key;
00637 if ($key==$fieldName) return $key;
00638 }
00639 return $first;
00640 }
00641
00649 function verifyComparison($comparison,$neg) {
00650 $compOffSet = $comparison >> 5;
00651 $first=-1;
00652 for($i=32*$compOffSet+$neg;$i<32*($compOffSet+1);$i+=2) {
00653 if ($first==-1) $first = $i;
00654 if (($i >> 1)==($comparison >> 1)) {
00655 return $i;
00656 }
00657 }
00658 return $first;
00659 }
00660
00668 function mkFieldToInputSelect($name,$fieldName) {
00669 $out='<input type="Text" value="'.htmlspecialchars($fieldName).'" name="'.$name.'"'.$GLOBALS["TBE_TEMPLATE"]->formWidth().'>'.$this->updateIcon();
00670 $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>';
00671 $out.='<BR><select name="_fieldListDummy" size=5 onChange="document.forms[0][\''.$name.'\'].value+=\',\'+this.value">';
00672 reset($this->fields);
00673 while(list($key,)=each($this->fields)) {
00674 if ($GLOBALS["BE_USER"]->check("non_exclude_fields",$this->table.":".$key)) {
00675 $out.='<option value="'.$prepend.$key.'"'.($key==$fieldName ? ' selected':'').'>'.$this->fields[$key]["label"].'</option>';
00676 }
00677 }
00678 $out.='</select>';
00679 return $out;
00680 }
00681
00689 function mkTableSelect($name,$cur) {
00690 global $TCA;
00691 $out='<select name="'.$name.'" onChange="submit();">';
00692 $out.='<option value=""></option>';
00693 reset($TCA);
00694 while(list($tN)=each($TCA)) {
00695 if ($GLOBALS["BE_USER"]->check("tables_select",$tN)) {
00696 $out.='<option value="'.$tN.'"'.($tN==$cur ? ' selected':'').'>'.$GLOBALS["LANG"]->sl($TCA[$tN]["ctrl"]["title"]).'</option>';
00697 }
00698 }
00699 $out.='</select>';
00700 return $out;
00701 }
00702
00711 function mkCompSelect($name,$comparison,$neg) {
00712 $compOffSet = $comparison >> 5;
00713 $out='<select name="'.$name.'" onChange="submit();">';
00714 for($i=32*$compOffSet+$neg;$i<32*($compOffSet+1);$i+=2) {
00715 if($this->lang["comparison"][$i."_"]) {
00716 $out.='<option value="'.$i.'"'.(($i >> 1)==($comparison >> 1) ? ' selected':'').'>'.$this->lang["comparison"][$i."_"].'</option>';
00717 }
00718 }
00719 $out.='</select>';
00720 return $out;
00721 }
00722
00729 function getSubscript($arr) {
00730 while(is_array($arr)) {
00731 reset($arr);
00732 list($key,)=each($arr);
00733 $retArr[] = $key;
00734 $arr = $arr[$key];
00735 }
00736 return $retArr;
00737 }
00738
00744 function initUserDef() {
00745
00746 }
00747
00753 function userDef() {
00754 }
00755
00762 function userDefCleanUp($queryConfig) {
00763 return $queryConfig;
00764 }
00765
00773 function getQuery ($queryConfig,$pad="") {
00774 $qs = "";
00775
00776 ksort($queryConfig);
00777 reset($queryConfig);
00778 $first=1;
00779 while(list($key,$conf) = each($queryConfig)) {
00780 switch($conf["type"]) {
00781 case "newlevel":
00782 $qs.=chr(10).$pad.trim($conf["operator"])." (".$this->getQuery($queryConfig[$key]["nl"],$pad." ").chr(10).$pad.")";
00783 break;
00784 case "userdef":
00785 $qs.=chr(10).$pad.getUserDefQuery($conf,$first);
00786 break;
00787 default:
00788 $qs.=chr(10).$pad.$this->getQuerySingle($conf,$first);
00789 break;
00790 }
00791 $first=0;
00792 }
00793 return $qs;
00794 }
00795
00803 function getQuerySingle($conf,$first) {
00804 $prefix = $this->enablePrefix ? $this->table."." : "";
00805 if (!$first) {$qs.= trim(($conf["operator"]?$conf["operator"]:"AND"))." ";}
00806 $qsTmp = str_replace("#FIELD#",$prefix.trim(substr($conf["type"],6)),$this->compSQL[$conf["comparison"]]);
00807 $inputVal = $this->cleanInputVal($conf);
00808 $qsTmp = str_replace("#VALUE#", $GLOBALS['TYPO3_DB']->quoteStr($inputVal, $this->table),$qsTmp);
00809 if ($conf["comparison"]==37 || $conf["comparison"]==36) {
00810 $inputVal = $this->cleanInputVal($conf,"1");
00811 $qsTmp = str_replace("#VALUE1#", $GLOBALS['TYPO3_DB']->quoteStr($inputVal, $this->table),$qsTmp);
00812 }
00813 $qs .= trim($qsTmp);
00814 return $qs;
00815 }
00816
00824 function cleanInputVal($conf,$suffix="") {
00825 if(($conf["comparison"] >> 5==0) || ($conf["comparison"]==32 || $conf["comparison"]==33)) {
00826 $inputVal = $conf["inputValue".$suffix];
00827 } else {
00828 if ($conf["comparison"]==39 || $conf["comparison"]==38) {
00829 $inputVal = implode(",",t3lib_div::intExplode(",",$conf["inputValue".$suffix]));
00830 } else {
00831 $inputVal = doubleval($conf["inputValue".$suffix]);
00832 }
00833 }
00834 return $inputVal;
00835 }
00836
00843 function getUserDefQuery ($qcArr) {
00844 }
00845
00851 function updateIcon() {
00852 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">';
00853 }
00854
00860 function getLabelCol() {
00861 global $TCA;
00862 return $TCA[$this->table]["ctrl"]["label"];
00863 }
00864
00872 function makeSelectorTable($modSettings,$enableList="table,fields,query,group,order,limit") {
00873 $enableArr=explode(",",$enableList);
00874
00875 $TDparams = ' class="bgColor5" nowrap';
00876
00877 if (in_array("table",$enableArr)) {
00878 $out='
00879 <tr>
00880 <td'.$TDparams.'><strong>Select a table:</strong></td>
00881 <td'.$TDparams.'>'.$this->mkTableSelect("SET[queryTable]",$this->table).'</td>
00882 </tr>';
00883 }
00884 if ($this->table) {
00885
00886
00887 $this->setAndCleanUpExternalLists("queryFields",$modSettings["queryFields"],"uid,".$this->getLabelCol());
00888 $this->setAndCleanUpExternalLists("queryGroup",$modSettings["queryGroup"]);
00889 $this->setAndCleanUpExternalLists("queryOrder",$modSettings["queryOrder"].",".$modSettings["queryOrder2"]);
00890
00891
00892 $this->extFieldLists["queryLimit"]=$modSettings["queryLimit"];
00893 if (!$this->extFieldLists["queryLimit"]) $this->extFieldLists["queryLimit"]=100;
00894 $parts = t3lib_div::intExplode(",",$this->extFieldLists["queryLimit"]);
00895 $this->extFieldLists["queryLimit"] = implode(",",array_slice($parts,0,2));
00896
00897
00898 if ($this->extFieldLists["queryOrder"]) {
00899 $descParts = explode(",",$modSettings["queryOrderDesc"].",".$modSettings["queryOrder2Desc"]);
00900 $orderParts = explode(",",$this->extFieldLists["queryOrder"]);
00901 reset($orderParts);
00902 $reList=array();
00903 while(list($kk,$vv)=each($orderParts)) {
00904 $reList[]=$vv.($descParts[$kk]?" DESC":"");
00905 }
00906 $this->extFieldLists["queryOrder_SQL"] = implode(",",$reList);
00907 }
00908
00909
00910 $this->procesData($modSettings["queryConfig"] ? unserialize($modSettings["queryConfig"]) : "");
00911
00912 $this->queryConfig = $this->cleanUpQueryConfig($this->queryConfig);
00913
00914 $this->enableQueryParts = $modSettings["search_query_smallparts"];
00915
00916 $codeArr=$this->getFormElements();
00917 $queryCode=$this->printCodeArray($codeArr);
00918
00919 if (in_array("fields",$enableArr)) {
00920 $out.='
00921 <tr>
00922 <td'.$TDparams.'><strong>Select fields:</strong></td>
00923 <td'.$TDparams.'>'.$this->mkFieldToInputSelect("SET[queryFields]",$this->extFieldLists["queryFields"]).'</td>
00924 </tr>';
00925 }
00926 if (in_array("query",$enableArr)) {
00927 $out.='<tr>
00928 <td colspan=2'.$TDparams.'><strong>Make Query:</strong></td>
00929 </tr>
00930 <tr>
00931 <td colspan=2>'.$queryCode.'</td>
00932 </tr>
00933 ';
00934 }
00935 if (in_array("group",$enableArr)) {
00936 $out.='<tr>
00937 <td'.$TDparams.'><strong>Group By:</strong></td>
00938 <td'.$TDparams.'>'.$this->mkTypeSelect("SET[queryGroup]",$this->extFieldLists["queryGroup"],"").'</td>
00939 </tr>';
00940 }
00941 if (in_array("order",$enableArr)) {
00942 $orderByArr = explode(",",$this->extFieldLists["queryOrder"]);
00943
00944 $orderBy="";
00945 $orderBy.=$this->mkTypeSelect("SET[queryOrder]",$orderByArr[0],"").
00946 " ".t3lib_BEfunc::getFuncCheck($GLOBALS["SOBE"]->id,"SET[queryOrderDesc]",$modSettings["queryOrderDesc"])." Descending";
00947 if ($orderByArr[0]) {
00948 $orderBy.= "<BR>".$this->mkTypeSelect("SET[queryOrder2]",$orderByArr[1],"").
00949 " ".t3lib_BEfunc::getFuncCheck($GLOBALS["SOBE"]->id,"SET[queryOrder2Desc]",$modSettings["queryOrder2Desc"])." Descending";
00950 }
00951 $out.='<tr>
00952 <td'.$TDparams.'><strong>Order By:</strong></td>
00953 <td'.$TDparams.'>'.$orderBy.'</td>
00954 </tr>';
00955 }
00956 if (in_array("limit",$enableArr)) {
00957 $limit = '<input type="Text" value="'.htmlspecialchars($this->extFieldLists["queryLimit"]).'" name="SET[queryLimit]"'.$GLOBALS["TBE_TEMPLATE"]->formWidth(10).'>'.$this->updateIcon();
00958 $out.='<tr>
00959 <td'.$TDparams.'><strong>Limit:</strong></td>
00960 <td'.$TDparams.'>'.$limit.'</td>
00961 </tr>
00962 ';
00963 }
00964 }
00965 $out='<table border=0 cellpadding=3 cellspacing=1>'.$out.'</table>';
00966 $out.=$this->JSbottom();
00967 return $out;
00968 }
00969
00976 function getSelectQuery($qString="") {
00977 if (!$qString) $qString=$this->getQuery($this->queryConfig);
00978
00979 $query = $GLOBALS['TYPO3_DB']->SELECTquery(
00980 $this->extFieldLists["queryFields"],
00981 $this->table,
00982 $qString.t3lib_BEfunc::deleteClause($this->table),
00983 trim($this->extFieldLists["queryGroup"]),
00984 $this->extFieldLists["queryOrder"] ? trim($this->extFieldLists["queryOrder_SQL"]) : '',
00985 $this->extFieldLists["queryLimit"]
00986 );
00987 return $query;
00988 }
00989
00996 function JSbottom($formname="forms[0]") {
00997 if ($this->extJSCODE) {
00998 $out.='
00999 <script language="javascript" type="text/javascript" src="'.$GLOBALS["BACK_PATH"].'t3lib/jsfunc.evalfield.js"></script>
01000 <script language="javascript" type="text/javascript">
01001 var evalFunc = new evalFunc;
01002 function typo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue) {
01003 var theFObj = new evalFunc_dummy (evallist,is_in, checkbox, checkboxValue);
01004 var theValue = document.'.$formname.'[theField].value;
01005 if (checkbox && theValue==checkboxValue) {
01006 document.'.$formname.'[theField+"_hr"].value="";
01007 if (document.'.$formname.'[theField+"_cb"]) document.'.$formname.'[theField+"_cb"].checked = "";
01008 } else {
01009 document.'.$formname.'[theField+"_hr"].value = evalFunc.outputObjValue(theFObj, theValue);
01010 if (document.'.$formname.'[theField+"_cb"]) document.'.$formname.'[theField+"_cb"].checked = "on";
01011 }
01012 }
01013
01020 function typo3FormFieldGet(theField, evallist, is_in, checkbox, checkboxValue, checkbox_off) {
01021 var theFObj = new evalFunc_dummy (evallist,is_in, checkbox, checkboxValue);
01022 if (checkbox_off) {
01023 document.'.$formname.'[theField].value=checkboxValue;
01024 }else{
01025 document.'.$formname.'[theField].value = evalFunc.evalObjValue(theFObj, document.'.$formname.'[theField+"_hr"].value);
01026 }
01027 typo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue);
01028 }
01029 </script>
01030 <script language="javascript" type="text/javascript">'.$this->extJSCODE.'</script>';
01031 return $out;
01032 }
01033 }
01034 }
01035
01036
01037 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_querygenerator.php']) {
01038 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_querygenerator.php']);
01039 }
01040 ?>