0byt3m1n1
Path:
/
data
/
applications
/
aps
/
typo3
/
4.5.5-0
/
standard
/
htdocs
/
t3lib
/
[
Home
]
File: class.t3lib_querygenerator.php
<?php /*************************************************************** * Copyright notice * * (c) 2001-2011 Christian Jul Jensen (christian@typo3.com) * All rights reserved * * This script is part of the TYPO3 project. The TYPO3 project is * free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * The GNU General Public License can be found at * http://www.gnu.org/copyleft/gpl.html. * A copy is found in the textfile GPL.txt and important notices to the license * from the author is found in LICENSE.txt distributed with these scripts. * * * This script is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * This copyright notice MUST APPEAR in all copies of the script! ***************************************************************/ /** * Class for generating front end for building queries * * $Id$ * * @author Christian Jul Jensen <christian@typo3.com> * @author Kasper Skårhøj <kasperYYYY@typo3.com> * @coauthor Jo Hasenau <info@cybercraft.de> */ /** * [CLASS/FUNCTION INDEX of SCRIPT] * * * * 98: class t3lib_queryGenerator * 245: function makeFieldList() * 273: function init($name,$table,$fieldList='') * 410: function setAndCleanUpExternalLists($name,$list,$force='') * 426: function procesData($qC='') * 529: function cleanUpQueryConfig($queryConfig) * 586: function getFormElements($subLevel=0,$queryConfig='',$parent='') * 744: function makeOptionList($fN, $conf, $table) * 953: function printCodeArray($codeArr,$l=0) * 976: function formatQ($str) * 989: function mkOperatorSelect($name,$op,$draw,$submit) * 1011: function mkTypeSelect($name,$fieldName,$prepend='FIELD_') * 1032: function verifyType($fieldName) * 1049: function verifyComparison($comparison,$neg) * 1068: function mkFieldToInputSelect($name,$fieldName) * 1091: function mkTableSelect($name,$cur) * 1113: function mkCompSelect($name,$comparison,$neg) * 1131: function getSubscript($arr) * 1146: function initUserDef() * 1155: function userDef() * 1164: function userDefCleanUp($queryConfig) * 1175: function getQuery ($queryConfig,$pad='') * 1205: function getQuerySingle($conf,$first) * 1245: function cleanInputVal($conf,$suffix='') * 1270: function getUserDefQuery ($qcArr) * 1278: function updateIcon() * 1287: function getLabelCol() * 1299: function makeSelectorTable($modSettings,$enableList='table,fields,query,group,order,limit') * 1431: function getTreeList($id, $depth, $begin=0, $perms_clause) * 1465: function getSelectQuery($qString = '', $fN = '') * 1504: function JSbottom($formname='forms[0]') * 1510: function typo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue) * 1528: function typo3FormFieldGet(theField, evallist, is_in, checkbox, checkboxValue, checkbox_off) * * TOTAL FUNCTIONS: 32 * (This index is automatically created/updated by the extension "extdeveval") * */ /** * Class for generating front end for building queries * * @author Christian Jul Jensen <christian@typo3.com> * @author Kasper Skårhøj <kasperYYYY@typo3.com> * @package TYPO3 * @subpackage t3lib */ class t3lib_queryGenerator { var $lang = array( 'OR' => 'or', 'AND' => 'and', 'comparison' => array( // Type = text offset = 0 '0_' => 'contains', '1_' => 'does not contain', '2_' => 'starts with', '3_' => 'does not start with', '4_' => 'ends with', '5_' => 'does not end with', '6_' => 'equals', '7_' => 'does not equal', // Type = number , offset = 32 '32_' => 'equals', '33_' => 'does not equal', '34_' => 'is greater than', '35_' => 'is less than', '36_' => 'is between', '37_' => 'is not between', '38_' => 'is in list', '39_' => 'is not in list', '40_' => 'binary AND equals', '41_' => 'binary AND does not equal', '42_' => 'binary OR equals', '43_' => 'binary OR does not equal', // Type = multiple, relation, files , offset = 64 '64_' => 'equals', '65_' => 'does not equal', '66_' => 'contains', '67_' => 'does not contain', '68_' => 'is in list', '69_' => 'is not in list', '70_' => 'binary AND equals', '71_' => 'binary AND does not equal', '72_' => 'binary OR equals', '73_' => 'binary OR does not equal', // Type = date,time offset = 96 '96_' => 'equals', '97_' => 'does not equal', '98_' => 'is greater than', '99_' => 'is less than', '100_' => 'is between', '101_' => 'is not between', '102_' => 'binary AND equals', '103_' => 'binary AND does not equal', '104_' => 'binary OR equals', '105_' => 'binary OR does not equal', // Type = boolean, offset = 128 '128_' => 'is True', '129_' => 'is False', // Type = binary , offset = 160 '160_' => 'equals', '161_' => 'does not equal', '162_' => 'contains', '163_' => 'does not contain' ) ); var $compSQL = array( // Type = text offset = 0 '0' => "#FIELD# LIKE '%#VALUE#%'", '1' => "#FIELD# NOT LIKE '%#VALUE#%'", '2' => "#FIELD# LIKE '#VALUE#%'", '3' => "#FIELD# NOT LIKE '#VALUE#%'", '4' => "#FIELD# LIKE '%#VALUE#'", '5' => "#FIELD# NOT LIKE '%#VALUE#'", '6' => "#FIELD# = '#VALUE#'", '7' => "#FIELD# != '#VALUE#'", // Type = number, offset = 32 '32' => "#FIELD# = '#VALUE#'", '33' => "#FIELD# != '#VALUE#'", '34' => '#FIELD# > #VALUE#', '35' => '#FIELD# < #VALUE#', '36' => '#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#', '37' => 'NOT (#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#)', '38' => '#FIELD# IN (#VALUE#)', '39' => '#FIELD# NOT IN (#VALUE#)', '40' => '(#FIELD# & #VALUE#)=#VALUE#', '41' => '(#FIELD# & #VALUE#)!=#VALUE#', '42' => '(#FIELD# | #VALUE#)=#VALUE#', '43' => '(#FIELD# | #VALUE#)!=#VALUE#', // Type = multiple, relation, files , offset = 64 '64' => "#FIELD# = '#VALUE#'", '65' => "#FIELD# != '#VALUE#'", '66' => "#FIELD# LIKE '%#VALUE#%' AND #FIELD# LIKE '%#VALUE1#%'", '67' => "(#FIELD# NOT LIKE '%#VALUE#%' OR #FIELD# NOT LIKE '%#VALUE1#%')", '68' => '#FIELD# IN (#VALUE#)', '69' => '#FIELD# NOT IN (#VALUE#)', '70' => '(#FIELD# & #VALUE#)=#VALUE#', '71' => '(#FIELD# & #VALUE#)!=#VALUE#', '72' => '(#FIELD# | #VALUE#)=#VALUE#', '73' => '(#FIELD# | #VALUE#)!=#VALUE#', // Type = date, offset = 32 '96' => "#FIELD# = '#VALUE#'", '97' => "#FIELD# != '#VALUE#'", '98' => '#FIELD# > #VALUE#', '99' => '#FIELD# < #VALUE#', '100' => '#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#', '101' => 'NOT (#FIELD# >= #VALUE# AND #FIELD# <= #VALUE1#)', '102' => '(#FIELD# & #VALUE#)=#VALUE#', '103' => '(#FIELD# & #VALUE#)!=#VALUE#', '104' => '(#FIELD# | #VALUE#)=#VALUE#', '105' => '(#FIELD# | #VALUE#)!=#VALUE#', // Type = boolean, offset = 128 '128' => "#FIELD# = '1'", '129' => "#FIELD# != '1'", // Type = binary = 160 '160' => "#FIELD# = '#VALUE#'", '161' => "#FIELD# != '#VALUE#'", '162' => '(#FIELD# & #VALUE#)=#VALUE#', '163' => '(#FIELD# & #VALUE#)=0' ); var $comp_offsets = array( 'text' => 0, 'number' => 1, 'multiple' => 2, 'relation' => 2, 'files' => 2, 'date' => 3, 'time' => 3, 'boolean' => 4, 'binary' => 5 ); var $noWrap = ' nowrap'; var $name; // Form data name prefix var $table; // table for the query var $fieldList; // field list var $fields = array(); // Array of the fields possible var $extFieldLists = array(); var $queryConfig = array(); // The query config var $enablePrefix = 0; var $enableQueryParts = 0; var $extJSCODE = ''; protected $formName = ''; /** * @return [type] ... */ function makeFieldList() { global $TCA; $fieldListArr = array(); if (is_array($TCA[$this->table])) { t3lib_div::loadTCA($this->table); foreach ($TCA[$this->table]['columns'] as $fN => $value) { $fieldListArr[] = $fN; } $fieldListArr[] = 'uid'; $fieldListArr[] = 'pid'; $fieldListArr[] = 'deleted'; if ($TCA[$this->table]['ctrl']['tstamp']) { $fieldListArr[] = $TCA[$this->table]['ctrl']['tstamp']; } if ($TCA[$this->table]['ctrl']['crdate']) { $fieldListArr[] = $TCA[$this->table]['ctrl']['crdate']; } if ($TCA[$this->table]['ctrl']['cruser_id']) { $fieldListArr[] = $TCA[$this->table]['ctrl']['cruser_id']; } if ($TCA[$this->table]['ctrl']['sortby']) { $fieldListArr[] = $TCA[$this->table]['ctrl']['sortby']; } } return implode(',', $fieldListArr); } /** * [Describe function...] * * @param [type] $name: ... * @param [type] $table: ... * @param [type] $fieldList: ... * @return [type] ... */ function init($name, $table, $fieldList = '') { global $TCA; // Analysing the fields in the table. if (is_array($TCA[$table])) { t3lib_div::loadTCA($table); $this->name = $name; $this->table = $table; $this->fieldList = $fieldList ? $fieldList : $this->makeFieldList(); $fieldArr = t3lib_div::trimExplode(',', $this->fieldList, 1); foreach ($fieldArr as $fN) { $fC = $TCA[$this->table]['columns'][$fN]; $this->fields[$fN] = $fC['config']; $this->fields[$fN]['exclude'] = $fC['exclude']; if (is_array($fC) && $fC['label']) { $this->fields[$fN]['label'] = rtrim(trim($GLOBALS['LANG']->sL($fC['label'])), ':'); switch ($this->fields[$fN]['type']) { case 'input': if (preg_match('/int|year/i', $this->fields[$fN]['eval'])) { $this->fields[$fN]['type'] = 'number'; } elseif (preg_match('/time/i', $this->fields[$fN]['eval'])) { $this->fields[$fN]['type'] = 'time'; } elseif (preg_match('/date/i', $this->fields[$fN]['eval'])) { $this->fields[$fN]['type'] = 'date'; } else { $this->fields[$fN]['type'] = 'text'; } break; case 'check': if (!$this->fields[$fN]['items']) { $this->fields[$fN]['type'] = 'boolean'; } else { $this->fields[$fN]['type'] = 'binary'; } break; case 'radio': $this->fields[$fN]['type'] = 'multiple'; break; case 'select': $this->fields[$fN]['type'] = 'multiple'; if ($this->fields[$fN]['foreign_table']) { $this->fields[$fN]['type'] = 'relation'; } if ($this->fields[$fN]['special']) { $this->fields[$fN]['type'] = 'text'; } break; case 'group': $this->fields[$fN]['type'] = 'files'; if ($this->fields[$fN]['internal_type'] == 'db') { $this->fields[$fN]['type'] = 'relation'; } break; case 'user': case 'flex': case 'passthrough': case 'none': case 'text': default: $this->fields[$fN]['type'] = 'text'; break; } } else { $this->fields[$fN]['label'] = '[FIELD: ' . $fN . ']'; switch ($fN) { case 'pid': $this->fields[$fN]['type'] = 'relation'; $this->fields[$fN]['allowed'] = 'pages'; break; case 'cruser_id': $this->fields[$fN]['type'] = 'relation'; $this->fields[$fN]['allowed'] = 'be_users'; break; case 'tstamp': case 'crdate': $this->fields[$fN]['type'] = 'time'; break; case 'deleted': $this->fields[$fN]['type'] = 'boolean'; break; default: $this->fields[$fN]['type'] = 'number'; break; } } } } /* // EXAMPLE: $this->queryConfig = array( array( 'operator' => 'AND', 'type' => 'FIELD_spaceBefore', ), array( 'operator' => 'AND', 'type' => 'FIELD_records', 'negate' => 1, 'inputValue' => 'foo foo' ), array( 'type' => 'newlevel', 'nl' => array( array( 'operator' => 'AND', 'type' => 'FIELD_spaceBefore', 'negate' => 1, 'inputValue' => 'foo foo' ), array( 'operator' => 'AND', 'type' => 'FIELD_records', 'negate' => 1, 'inputValue' => 'foo foo' ) ) ), array( 'operator' => 'OR', 'type' => 'FIELD_maillist', ) ); */ $this->initUserDef(); } /** * [Describe function...] * * @param [type] $name: ... * @param [type] $list: ... * @param [type] $force: ... * @return [type] ... */ function setAndCleanUpExternalLists($name, $list, $force = '') { $fields = array_unique(t3lib_div::trimExplode(',', $list . ',' . $force, 1)); $reList = array(); foreach ($fields as $fN) { if ($this->fields[$fN]) { $reList[] = $fN; } } $this->extFieldLists[$name] = implode(',', $reList); } /** * [Describe function...] * * @param [type] $qC: ... * @return [type] ... */ function procesData($qC = '') { $this->queryConfig = $qC; $POST = t3lib_div::_POST(); // if delete... if ($POST['qG_del']) { //initialize array to work on, save special parameters $ssArr = $this->getSubscript($POST['qG_del']); $workArr =& $this->queryConfig; for ($i = 0; $i < sizeof($ssArr) - 1; $i++) { $workArr =& $workArr[$ssArr[$i]]; } // delete the entry and move the other entries unset($workArr[$ssArr[$i]]); for ($j = $ssArr[$i]; $j < sizeof($workArr); $j++) { $workArr[$j] = $workArr[$j + 1]; unset($workArr[$j + 1]); } } // if insert... if ($POST['qG_ins']) { //initialize array to work on, save special parameters $ssArr = $this->getSubscript($POST['qG_ins']); $workArr =& $this->queryConfig; for ($i = 0; $i < sizeof($ssArr) - 1; $i++) { $workArr =& $workArr[$ssArr[$i]]; } // move all entries above position where new entry is to be inserted for ($j = sizeof($workArr); $j > $ssArr[$i]; $j--) { $workArr[$j] = $workArr[$j - 1]; } //clear new entry position unset($workArr[$ssArr[$i] + 1]); $workArr[$ssArr[$i] + 1]['type'] = 'FIELD_'; } // if move up... if ($POST['qG_up']) { //initialize array to work on $ssArr = $this->getSubscript($POST['qG_up']); $workArr =& $this->queryConfig; for ($i = 0; $i < sizeof($ssArr) - 1; $i++) { $workArr =& $workArr[$ssArr[$i]]; } //swap entries $qG_tmp = $workArr[$ssArr[$i]]; $workArr[$ssArr[$i]] = $workArr[$ssArr[$i] - 1]; $workArr[$ssArr[$i] - 1] = $qG_tmp; } // if new level... if ($POST['qG_nl']) { //initialize array to work on $ssArr = $this->getSubscript($POST['qG_nl']); $workArr =& $this->queryConfig; for ($i = 0; $i < sizeof($ssArr) - 1; $i++) { $workArr =& $workArr[$ssArr[$i]]; } // Do stuff: $tempEl = $workArr[$ssArr[$i]]; if (is_array($tempEl)) { if ($tempEl['type'] != 'newlevel') { $workArr[$ssArr[$i]] = array( 'type' => 'newlevel', 'operator' => $tempEl['operator'], 'nl' => array($tempEl) ); } } } // if collapse level... if ($POST['qG_remnl']) { //initialize array to work on $ssArr = $this->getSubscript($POST['qG_remnl']); $workArr =& $this->queryConfig; for ($i = 0; $i < sizeof($ssArr) - 1; $i++) { $workArr =& $workArr[$ssArr[$i]]; } // Do stuff: $tempEl = $workArr[$ssArr[$i]]; if (is_array($tempEl)) { if ($tempEl['type'] == 'newlevel') { $a1 = array_slice($workArr, 0, $ssArr[$i]); $a2 = array_slice($workArr, $ssArr[$i]); array_shift($a2); $a3 = $tempEl['nl']; $a3[0]['operator'] = $tempEl['operator']; $workArr = array_merge($a1, $a3, $a2); } } } } /** * [Describe function...] * * @param [type] $queryConfig: ... * @return [type] ... */ function cleanUpQueryConfig($queryConfig) { //since we dont traverse the array using numeric keys in the upcoming whileloop make sure it's fresh and clean before displaying if (is_array($queryConfig)) { ksort($queryConfig); } else { //queryConfig should never be empty! if (!$queryConfig[0] || !$queryConfig[0]['type']) { $queryConfig[0] = array('type' => 'FIELD_'); } } // Traverse: $c = 0; $arrCount = 0; foreach ($queryConfig as $key => $conf) { if (substr($conf['type'], 0, 6) == 'FIELD_') { $fName = substr($conf['type'], 6); $fType = $this->fields[$fName]['type']; } elseif ($conf['type'] == 'newlevel') { $fType = $conf['type']; } else { $fType = 'ignore'; } // debug($fType); switch ($fType) { case 'newlevel': if (!$queryConfig[$key]['nl']) { $queryConfig[$key]['nl'][0]['type'] = 'FIELD_'; } $queryConfig[$key]['nl'] = $this->cleanUpQueryConfig($queryConfig[$key]['nl']); break; case 'userdef': $queryConfig[$key] = $this->userDefCleanUp($queryConfig[$key]); break; case 'ignore': default: // debug($queryConfig[$key]); $verifiedName = $this->verifyType($fName); $queryConfig[$key]['type'] = 'FIELD_' . $this->verifyType($verifiedName); if ($conf['comparison'] >> 5 != $this->comp_offsets[$fType]) { $conf['comparison'] = $this->comp_offsets[$fType] << 5; } $queryConfig[$key]['comparison'] = $this->verifyComparison($conf['comparison'], $conf['negate'] ? 1 : 0); $queryConfig[$key]['inputValue'] = $this->cleanInputVal($queryConfig[$key]); $queryConfig[$key]['inputValue1'] = $this->cleanInputVal($queryConfig[$key], 1); // debug($queryConfig[$key]); break; } } return $queryConfig; } /** * [Describe function...] * * @param [type] $subLevel: ... * @param [type] $queryConfig: ... * @param [type] $parent: ... * @return [type] ... */ function getFormElements($subLevel = 0, $queryConfig = '', $parent = '') { $codeArr = array(); if (!is_array($queryConfig)) { $queryConfig = $this->queryConfig; } $c = 0; $arrCount = 0; $loopcount = 0; foreach ($queryConfig as $key => $conf) { $subscript = $parent . '[' . $key . ']'; $lineHTML = ''; $lineHTML .= $this->mkOperatorSelect($this->name . $subscript, $conf['operator'], $c, ($conf['type'] != 'FIELD_')); if (substr($conf['type'], 0, 6) == 'FIELD_') { $fName = substr($conf['type'], 6); $this->fieldName = $fName; $fType = $this->fields[$fName]['type']; if ($conf['comparison'] >> 5 != $this->comp_offsets[$fType]) { $conf['comparison'] = $this->comp_offsets[$fType] << 5; } //nasty nasty... //make sure queryConfig contains _actual_ comparevalue. //mkCompSelect don't care, but getQuery does. $queryConfig[$key]['comparison'] += (isset($conf['negate']) - ($conf['comparison'] % 2)); } elseif ($conf['type'] == 'newlevel') { $fType = $conf['type']; } else { $fType = 'ignore'; } switch ($fType) { case 'ignore': break; case 'newlevel': if (!$queryConfig[$key]['nl']) { $queryConfig[$key]['nl'][0]['type'] = 'FIELD_'; } $lineHTML .= '<input type="hidden" name="' . $this->name . $subscript . '[type]" value="newlevel">'; $codeArr[$arrCount]['sub'] = $this->getFormElements($subLevel + 1, $queryConfig[$key]['nl'], $subscript . '[nl]'); break; case 'userdef': $lineHTML .= $this->userDef($this->name . $subscript, $conf, $fName, $fType); break; case 'date': $lineHTML .= $this->mkTypeSelect($this->name . $subscript . '[type]', $fName); $lineHTML .= $this->mkCompSelect($this->name . $subscript . '[comparison]', $conf['comparison'], $conf['negate'] ? 1 : 0); $lineHTML .= '<input type="checkbox" class="checkbox"' . ($conf['negate'] ? ' checked' : '') . ' name="' . $this->name . $subscript . '[negate]' . '" onClick="submit();">'; if ($conf['comparison'] == 100 || $conf['comparison'] == 101) { // between $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]' . '">'; $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]' . '">'; $this->extJSCODE .= 'typo3form.fieldSet("' . $this->name . $subscript . '[inputValue]", "date", "", 0,0);'; $this->extJSCODE .= 'typo3form.fieldSet("' . $this->name . $subscript . '[inputValue1]", "date", "", 0,0);'; } else { $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]' . '">'; $this->extJSCODE .= 'typo3form.fieldSet("' . $this->name . $subscript . '[inputValue]", "date", "", 0,0);'; } break; case 'time': $lineHTML .= $this->mkTypeSelect($this->name . $subscript . '[type]', $fName); $lineHTML .= $this->mkCompSelect($this->name . $subscript . '[comparison]', $conf['comparison'], $conf['negate'] ? 1 : 0); $lineHTML .= '<input type="checkbox" class="checkbox"' . ($conf['negate'] ? ' checked' : '') . ' name="' . $this->name . $subscript . '[negate]' . '" onClick="submit();">'; if ($conf['comparison'] == 100 || $conf['comparison'] == 101) { // between: $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]' . '">'; $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]' . '">'; $this->extJSCODE .= 'typo3form.fieldSet("' . $this->name . $subscript . '[inputValue]", "datetime", "", 0,0);'; $this->extJSCODE .= 'typo3form.fieldSet("' . $this->name . $subscript . '[inputValue1]", "datetime", "", 0,0);'; } else { $lineHTML .= '<input type="text" name="' . $this->name . $subscript . '[inputValue]_hr' . '" value="' . strftime('%H:%M %e-%m-%Y', intval($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]' . '">'; $this->extJSCODE .= 'typo3form.fieldSet("' . $this->name . $subscript . '[inputValue]", "datetime", "", 0,0);'; } break; case 'multiple': case 'binary': case 'relation': $lineHTML .= $this->mkTypeSelect($this->name . $subscript . '[type]', $fName); $lineHTML .= $this->mkCompSelect($this->name . $subscript . '[comparison]', $conf['comparison'], $conf['negate'] ? 1 : 0); $lineHTML .= '<input type="checkbox" class="checkbox"' . ($conf['negate'] ? ' checked' : '') . ' name="' . $this->name . $subscript . '[negate]' . '" onClick="submit();">'; if ($conf['comparison'] == 68 || $conf['comparison'] == 69 || $conf['comparison'] == 162 || $conf['comparison'] == 163) { $lineHTML .= '<select name="' . $this->name . $subscript . '[inputValue]' . '[]" style="vertical-align:top;" size="5" multiple>'; } elseif ($conf['comparison'] == 66 || $conf['comparison'] == 67) { if (is_array($conf['inputValue'])) { $conf['inputValue'] = implode(',', $conf['inputValue']); } $lineHTML .= '<input type="text" value="' . htmlspecialchars($conf['inputValue']) . '" name="' . $this->name . $subscript . '[inputValue]' . '"' . $GLOBALS['TBE_TEMPLATE']->formWidth(10) . '>'; } else { $lineHTML .= '<select name="' . $this->name . $subscript . '[inputValue]' . '" style="vertical-align:top;" onChange="submit();">'; } if ($conf['comparison'] != 66 && $conf['comparison'] != 67) { $lineHTML .= $this->makeOptionList($fName, $conf, $this->table); $lineHTML .= '</select>'; } break; case 'files': $lineHTML .= $this->mkTypeSelect($this->name . $subscript . '[type]', $fName); $lineHTML .= $this->mkCompSelect($this->name . $subscript . '[comparison]', $conf['comparison'], $conf['negate'] ? 1 : 0); $lineHTML .= '<input type="checkbox" class="checkbox"' . ($conf['negate'] ? ' checked' : '') . ' name="' . $this->name . $subscript . '[negate]' . '" onClick="submit();">'; if ($conf['comparison'] == 68 || $conf['comparison'] == 69) { $lineHTML .= '<select name="' . $this->name . $subscript . '[inputValue]' . '[]" style="vertical-align:top;" size="5" multiple>'; } else { $lineHTML .= '<select name="' . $this->name . $subscript . '[inputValue]' . '" style="vertical-align:top;" onChange="submit();">'; } $lineHTML .= '<option value=""></option>' . $this->makeOptionList($fName, $conf, $this->table); $lineHTML .= '</select>'; if ($conf['comparison'] == 66 || $conf['comparison'] == 67) { $lineHTML .= ' + <input type="text" value="' . htmlspecialchars($conf['inputValue1']) . '" name="' . $this->name . $subscript . '[inputValue1]' . '"' . $GLOBALS['TBE_TEMPLATE']->formWidth(10) . '>'; } break; case 'boolean': $lineHTML .= $this->mkTypeSelect($this->name . $subscript . '[type]', $fName); $lineHTML .= $this->mkCompSelect($this->name . $subscript . '[comparison]', $conf['comparison'], $conf['negate'] ? 1 : 0); $lineHTML .= '<input type="checkbox" class="checkbox"' . ($conf['negate'] ? ' checked' : '') . ' name="' . $this->name . $subscript . '[negate]' . '" onClick="submit();">'; $lineHTML .= '<input type="hidden" value="1" name="' . $this->name . $subscript . '[inputValue]' . '"' . $GLOBALS['TBE_TEMPLATE']->formWidth(10) . '>'; break; default: $lineHTML .= $this->mkTypeSelect($this->name . $subscript . '[type]', $fName); $lineHTML .= $this->mkCompSelect($this->name . $subscript . '[comparison]', $conf['comparison'], $conf['negate'] ? 1 : 0); $lineHTML .= '<input type="checkbox" class="checkbox"' . ($conf['negate'] ? ' checked' : '') . ' name="' . $this->name . $subscript . '[negate]' . '" onClick="submit();">'; if ($conf['comparison'] == 37 || $conf['comparison'] == 36) { // between: $lineHTML .= '<input type="text" value="' . htmlspecialchars($conf['inputValue']) . '" name="' . $this->name . $subscript . '[inputValue]' . '"' . $GLOBALS['TBE_TEMPLATE']->formWidth(5) . '> <input type="text" value="' . htmlspecialchars($conf['inputValue1']) . '" name="' . $this->name . $subscript . '[inputValue1]' . '"' . $GLOBALS['TBE_TEMPLATE']->formWidth(5) . '>'; // onChange='submit();' } else { $lineHTML .= '<input type="text" value="' . htmlspecialchars($conf['inputValue']) . '" name="' . $this->name . $subscript . '[inputValue]' . '"' . $GLOBALS['TBE_TEMPLATE']->formWidth(10) . '>'; // onChange="submit();" } break; } if ($fType != 'ignore') { $lineHTML .= $this->updateIcon(); if ($loopcount) { $lineHTML .= '<input type="image" border="0" ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], 'gfx/garbage.gif', 'width="11" height="12"') . 'title="Remove condition" name="qG_del' . $subscript . '">'; } $lineHTML .= '<input type="image" border="0" ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], 'gfx/add.gif', 'width="12" height="12"') . ' title="Add condition" name="qG_ins' . $subscript . '">'; if ($c != 0) { $lineHTML .= '<input type="image" border="0" ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], 'gfx/pil2up.gif', 'width="12" height="7"') . ' title="Move up" name="qG_up' . $subscript . '">'; } if ($c != 0 && $fType != 'newlevel') { $lineHTML .= '<input type="image" border="0" ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], 'gfx/pil2right.gif', 'height="12" width="7"') . ' title="New level" name="qG_nl' . $subscript . '">'; } if ($fType == 'newlevel') { $lineHTML .= '<input type="image" border="0" ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], 'gfx/pil2left.gif', 'height="12" width="7"') . ' title="Collapse new level" name="qG_remnl' . $subscript . '">'; } $codeArr[$arrCount]['html'] = $lineHTML; $codeArr[$arrCount]['query'] = $this->getQuerySingle($conf, $c > 0 ? 0 : 1); $arrCount++; $c++; } $loopcount = 1; } $this->queryConfig = $queryConfig; return $codeArr; } /** * [Describe function...] * * @param [type] $codeArr: ... * @param [type] $l: ... * @param [type] $table: ... * @return [type] ... */ function makeOptionList($fN, $conf, $table) { $out = ''; $fieldSetup = $this->fields[$fN]; if ($fieldSetup['type'] == 'files') { if ($conf['comparison'] == 66 || $conf['comparison'] == 67) { $fileExtArray = explode(',', $fieldSetup['allowed']); natcasesort($fileExtArray); foreach ($fileExtArray as $fileExt) { if (t3lib_div::inList($conf['inputValue'], $fileExt)) { $out .= '<option value="' . $fileExt . '" selected>.' . $fileExt . '</option>'; } else { $out .= '<option value="' . $fileExt . '">.' . $fileExt . '</option>'; } } } $d = dir(PATH_site . $fieldSetup['uploadfolder']); while (false !== ($entry = $d->read())) { if ($entry == '.' || $entry == '..') { continue; } $fileArray[] = $entry; } $d->close(); natcasesort($fileArray); foreach ($fileArray as $fileName) { if (t3lib_div::inList($conf['inputValue'], $fileName)) { $out .= '<option value="' . $fileName . '" selected>' . $fileName . '</option>'; } else { $out .= '<option value="' . $fileName . '">' . $fileName . '</option>'; } } } if ($fieldSetup['type'] == 'multiple') { foreach ($fieldSetup['items'] as $key => $val) { if (substr($val[0], 0, 4) == 'LLL:') { $value = $GLOBALS['LANG']->sL($val[0]); } else { $value = $val[0]; } if (t3lib_div::inList($conf['inputValue'], $val[1])) { $out .= '<option value="' . $val[1] . '" selected>' . $value . '</option>'; } else { $out .= '<option value="' . $val[1] . '">' . $value . '</option>'; } } } if ($fieldSetup['type'] == 'binary') { foreach ($fieldSetup['items'] as $key => $val) { if (substr($val[0], 0, 4) == 'LLL:') { $value = $GLOBALS['LANG']->sL($val[0]); } else { $value = $val[0]; } if (t3lib_div::inList($conf['inputValue'], pow(2, $key))) { $out .= '<option value="' . pow(2, $key) . '" selected>' . $value . '</option>'; } else { $out .= '<option value="' . pow(2, $key) . '">' . $value . '</option>'; } } } if ($fieldSetup['type'] == 'relation') { if ($fieldSetup['items']) { foreach ($fieldSetup['items'] as $key => $val) { if (substr($val[0], 0, 4) == 'LLL:') { $value = $GLOBALS['LANG']->sL($val[0]); } else { $value = $val[0]; } if (t3lib_div::inList($conf['inputValue'], $val[1])) { $out .= '<option value="' . $val[1] . '" selected>' . $value . '</option>'; } else { $out .= '<option value="' . $val[1] . '">' . $value . '</option>'; } } } global $TCA; if (stristr($fieldSetup['allowed'], ',')) { $from_table_Arr = explode(',', $fieldSetup['allowed']); $useTablePrefix = 1; if (!$fieldSetup['prepend_tname']) { $checkres = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fN, $table, t3lib_BEfunc::deleteClause($table), $groupBy = '', $orderBy = '', $limit = ''); if ($checkres) { while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($checkres)) { if (stristr($row[$fN], ',')) { $checkContent = explode(',', $row[$fN]); foreach ($checkContent as $singleValue) { if (!stristr($singleValue, '_')) { $dontPrefixFirstTable = 1; } } } else { $singleValue = $row[$fN]; if (strlen($singleValue) && !stristr($singleValue, '_')) { $dontPrefixFirstTable = 1; } } } } } } else { $from_table_Arr[0] = $fieldSetup['allowed']; } if ($fieldSetup['prepend_tname']) { $useTablePrefix = 1; } if ($fieldSetup['foreign_table']) { $from_table_Arr[0] = $fieldSetup['foreign_table']; } $counter = 0; $webMountPageTree = ''; while (list(, $from_table) = each($from_table_Arr)) { if (($useTablePrefix && !$dontPrefixFirstTable && $counter != 1) || $counter == 1) { $tablePrefix = $from_table . '_'; } $counter = 1; if (is_array($TCA[$from_table])) { t3lib_div::loadTCA($from_table); $labelField = $TCA[$from_table]['ctrl']['label']; $altLabelField = $TCA[$from_table]['ctrl']['label_alt']; if ($TCA[$from_table]['columns'][$labelField]['config']['items']) { foreach ($TCA[$from_table]['columns'][$labelField]['config']['items'] as $labelArray) { if (substr($labelArray[0], 0, 4) == 'LLL:') { $labelFieldSelect[$labelArray[1]] = $GLOBALS['LANG']->sL($labelArray[0]); } else { $labelFieldSelect[$labelArray[1]] = $labelArray[0]; } } $useSelectLabels = 1; } if ($TCA[$from_table]['columns'][$altLabelField]['config']['items']) { foreach ($TCA[$from_table]['columns'][$altLabelField]['config']['items'] as $altLabelArray) { if (substr($altLabelArray[0], 0, 4) == 'LLL:') { $altLabelFieldSelect[$altLabelArray[1]] = $GLOBALS['LANG']->sL($altLabelArray[0]); } else { $altLabelFieldSelect[$altLabelArray[1]] = $altLabelArray[0]; } } $useAltSelectLabels = 1; } $altLabelFieldSelect = $altLabelField ? ',' . $altLabelField : ''; $select_fields = 'uid,' . $labelField . $altLabelFieldSelect; if (!$GLOBALS['BE_USER']->isAdmin() && $GLOBALS['TYPO3_CONF_VARS']['BE']['lockBeUserToDBmounts']) { $webMounts = $GLOBALS['BE_USER']->returnWebmounts(); $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1); foreach ($webMounts as $key => $val) { if ($webMountPageTree) { $webMountPageTreePrefix = ','; } $webMountPageTree .= $webMountPageTreePrefix . $this->getTreeList($val, 999, $begin = 0, $perms_clause); } if ($from_table == 'pages') { $where_clause = 'uid IN (' . $webMountPageTree . ') '; if (!$GLOBALS['SOBE']->MOD_SETTINGS['show_deleted']) { $where_clause .= t3lib_BEfunc::deleteClause($from_table) . ' AND' . $perms_clause; } } else { $where_clause = 'pid IN (' . $webMountPageTree . ') '; if (!$GLOBALS['SOBE']->MOD_SETTINGS['show_deleted']) { $where_clause .= t3lib_BEfunc::deleteClause($from_table); } } } else { $where_clause = 'uid'; if (!$GLOBALS['SOBE']->MOD_SETTINGS['show_deleted']) { $where_clause .= t3lib_BEfunc::deleteClause($from_table); } } $orderBy = 'uid'; if (!$this->tableArray[$from_table]) { $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select_fields, $from_table, $where_clause, $groupBy = '', $orderBy, $limit = ''); } if ($res) { while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { $this->tableArray[$from_table][] = $row; } } foreach ($this->tableArray[$from_table] as $key => $val) { if ($useSelectLabels) { $outArray[$tablePrefix . $val['uid']] = htmlspecialchars($labelFieldSelect[$val[$labelField]]); } elseif ($val[$labelField]) { $outArray[$tablePrefix . $val['uid']] = htmlspecialchars($val[$labelField]); } elseif ($useAltSelectLabels) { $outArray[$tablePrefix . $val['uid']] = htmlspecialchars($altLabelFieldSelect[$val[$altLabelField]]); } else { $outArray[$tablePrefix . $val['uid']] = htmlspecialchars($val[$altLabelField]); } } if ($GLOBALS['SOBE']->MOD_SETTINGS['options_sortlabel'] && is_array($outArray)) { natcasesort($outArray); } } } foreach ($outArray as $key2 => $val2) { if (t3lib_div::inList($conf['inputValue'], $key2)) { $out .= '<option value="' . $key2 . '" selected>[' . $key2 . '] ' . $val2 . '</option>'; } else { $out .= '<option value="' . $key2 . '">[' . $key2 . '] ' . $val2 . '</option>'; } } } return $out; } /** * [Describe function...] * * @param [type] $codeArr: ... * @param [type] $l: ... * @return [type] ... */ function printCodeArray($codeArr, $l = 0) { $line = ''; if ($l) { $indent = '<td style="vertical-align:top;"><img height="1" width="50"></td>'; } $lf = $l * 30; $bgColor = t3lib_div::modifyHTMLColor($GLOBALS['TBE_TEMPLATE']->bgColor2, $lf, $lf, $lf); foreach ($codeArr as $k => $v) { $line .= '<tr>' . $indent . '<td bgcolor="' . $bgColor . '"' . $this->noWrap . '>' . $v['html'] . '</td></tr>'; if ($this->enableQueryParts) { $line .= '<tr>' . $indent . '<td>' . $this->formatQ($v['query']) . '</td></tr>'; } if (is_array($v['sub'])) { $line .= '<tr>' . $indent . '<td' . $this->noWrap . '>' . $this->printCodeArray($v['sub'], $l + 1) . '</td></tr>'; } } $out = '<table border="0" cellpadding="0" cellspacing="1">' . $line . '</table>'; return $out; } /** * [Describe function...] * * @param [type] $str: ... * @return [type] ... */ function formatQ($str) { return '<font size="1" face="verdana" color="maroon"><i>' . htmlspecialchars($str) . '</i></font>'; } /** * [Describe function...] * * @param [type] $name: ... * @param [type] $op: ... * @param [type] $draw: ... * @param [type] $submit: ... * @return [type] ... */ function mkOperatorSelect($name, $op, $draw, $submit) { if ($draw) { $out = '<select name="' . $name . '[operator]"' . ($submit ? ' onChange="submit();"' : '') . '>'; // $out .= '<option value="AND"' . (!$op || $op == "AND" ? ' selected' : '') . '>' . $this->lang["AND"] . '</option>'; $out .= '<option value="OR"' . ($op == 'OR' ? ' selected' : '') . '>' . $this->lang['OR'] . '</option>'; $out .= '</select>'; } else { $out = '<input type="hidden" value="' . $op . '" name="' . $name . '[operator]">'; $out .= '<img src="clear.gif" height="1" width="47">'; } return $out; } /** * [Describe function...] * * @param [type] $name: ... * @param [type] $fieldName: ... * @param [type] $prepend: ... * @return [type] ... */ function mkTypeSelect($name, $fieldName, $prepend = 'FIELD_') { $out = '<select name="' . $name . '" onChange="submit();">'; $out .= '<option value=""></option>'; foreach ($this->fields as $key => $value) { if (!$value['exclude'] || $GLOBALS['BE_USER']->check('non_exclude_fields', $this->table . ':' . $key)) { $label = $this->fields[$key]['label']; $label_alt = $this->fields[$key]['label_alt']; $out .= '<option value="' . $prepend . $key . '"' . ($key == $fieldName ? ' selected' : '') . '>' . $label . '</option>'; } } $out .= '</select>'; return $out; } /** * [Describe function...] * * @param [type] $fieldName: ... * @return [type] ... */ function verifyType($fieldName) { $first = ''; foreach ($this->fields as $key => $value) { if (!$first) { $first = $key; } if ($key == $fieldName) { return $key; } } return $first; } /** * [Describe function...] * * @param [type] $comparison: ... * @param [type] $neg: ... * @return [type] ... */ function verifyComparison($comparison, $neg) { $compOffSet = $comparison >> 5; $first = -1; for ($i = 32 * $compOffSet + $neg; $i < 32 * ($compOffSet + 1); $i += 2) { if ($first == -1) { $first = $i; } if (($i >> 1) == ($comparison >> 1)) { return $i; } } return $first; } /** * [Describe function...] * * @param [type] $name: ... * @param [type] $fieldName: ... * @return [type] ... */ function mkFieldToInputSelect($name, $fieldName) { $out = '<input type="Text" value="' . htmlspecialchars($fieldName) . '" name="' . $name . '"' . $GLOBALS['TBE_TEMPLATE']->formWidth() . '>' . $this->updateIcon(); $out .= '<a href="#" onClick="document.forms[0][\'' . $name . '\'].value=\'\';return false;">' . t3lib_iconWorks::getSpriteIcon('actions-edit-delete', array('title' => 'Clear list')) . '</a>'; $out .= '<BR><select name="_fieldListDummy" size="5" onChange="document.forms[0][\'' . $name . '\'].value+=\',\'+this.value">'; foreach ($this->fields as $key => $value) { if (!$value['exclude'] || $GLOBALS['BE_USER']->check('non_exclude_fields', $this->table . ':' . $key)) { $label = $this->fields[$key]['label']; $label_alt = $this->fields[$key]['label_alt']; $out .= '<option value="' . $key . '"' . ($key == $fieldName ? ' selected' : '') . '>' . $label . '</option>'; } } $out .= '</select>'; return $out; } /** * [Describe function...] * * @param [type] $name: ... * @param [type] $cur: ... * @return [type] ... */ function mkTableSelect($name, $cur) { global $TCA; $out = '<select name="' . $name . '" onChange="submit();">'; $out .= '<option value=""></option>'; foreach ($TCA as $tN => $value) { if ($GLOBALS['BE_USER']->check('tables_select', $tN)) { $out .= '<option value="' . $tN . '"' . ($tN == $cur ? ' selected' : '') . '>' . $GLOBALS['LANG']->sl($TCA[$tN]['ctrl']['title']) . '</option>'; } } $out .= '</select>'; return $out; } /** * [Describe function...] * * @param [type] $name: ... * @param [type] $comparison: ... * @param [type] $neg: ... * @return [type] ... */ function mkCompSelect($name, $comparison, $neg) { $compOffSet = $comparison >> 5; $out = '<select name="' . $name . '" onChange="submit();">'; for ($i = 32 * $compOffSet + $neg; $i < 32 * ($compOffSet + 1); $i += 2) { if ($this->lang['comparison'][$i . '_']) { $out .= '<option value="' . $i . '"' . (($i >> 1) == ($comparison >> 1) ? ' selected' : '') . '>' . $this->lang['comparison'][$i . '_'] . '</option>'; } } $out .= '</select>'; return $out; } /** * [Describe function...] * * @param [type] $arr: ... * @return [type] ... */ function getSubscript($arr) { while (is_array($arr)) { reset($arr); list($key,) = each($arr); $retArr[] = $key; $arr = $arr[$key]; } return $retArr; } /** * [Describe function...] * * @return [type] ... */ function initUserDef() { } /** * [Describe function...] * * @return [type] ... */ function userDef() { } /** * [Describe function...] * * @param [type] $queryConfig: ... * @return [type] ... */ function userDefCleanUp($queryConfig) { return $queryConfig; } /** * [Describe function...] * * @param [type] $queryConfig: ... * @param [type] $pad: ... * @return [type] ... */ function getQuery($queryConfig, $pad = '') { $qs = ''; // Since we don't traverse the array using numeric keys in the upcoming whileloop make sure it's fresh and clean ksort($queryConfig); $first = 1; foreach ($queryConfig as $key => $conf) { switch ($conf['type']) { case 'newlevel': $qs .= LF . $pad . trim($conf['operator']) . ' (' . $this->getQuery($queryConfig[$key]['nl'], $pad . ' ') . LF . $pad . ')'; break; case 'userdef': $qs .= LF . $pad . getUserDefQuery($conf, $first); break; default: $qs .= LF . $pad . $this->getQuerySingle($conf, $first); break; } $first = 0; } return $qs; } /** * [Describe function...] * * @param [type] $conf: ... * @param [type] $first: ... * @return [type] ... */ function getQuerySingle($conf, $first) { $qs = ''; $prefix = $this->enablePrefix ? $this->table . '.' : ''; if (!$first) { // Is it OK to insert the AND operator if none is set? $qs .= trim(($conf['operator'] ? $conf['operator'] : 'AND')) . ' '; } $qsTmp = str_replace('#FIELD#', $prefix . trim(substr($conf['type'], 6)), $this->compSQL[$conf['comparison']]); $inputVal = $this->cleanInputVal($conf); if ($conf['comparison'] == 68 || $conf['comparison'] == 69) { $inputVal = explode(',', $inputVal); foreach ($inputVal as $key => $fileName) { $inputVal[$key] = "'" . $fileName . "'"; } $inputVal = implode(',', $inputVal); $qsTmp = str_replace('#VALUE#', $inputVal, $qsTmp); } elseif ($conf['comparison'] == 162 || $conf['comparison'] == 163) { $inputValArray = explode(',', $inputVal); $inputVal = 0; foreach ($inputValArray as $key => $fileName) { $inputVal += intval($fileName); } $qsTmp = str_replace('#VALUE#', $inputVal, $qsTmp); } else { $qsTmp = str_replace('#VALUE#', $GLOBALS['TYPO3_DB']->quoteStr($inputVal, $this->table), $qsTmp); } if ($conf['comparison'] == 37 || $conf['comparison'] == 36 || $conf['comparison'] == 66 || $conf['comparison'] == 67 || $conf['comparison'] == 100 || $conf['comparison'] == 101) { // between: $inputVal = $this->cleanInputVal($conf, '1'); $qsTmp = str_replace('#VALUE1#', $GLOBALS['TYPO3_DB']->quoteStr($inputVal, $this->table), $qsTmp); } $qs .= trim($qsTmp); return $qs; } /** * [Describe function...] * * @param [type] $conf: ... * @param [type] $suffix: ... * @return [type] ... */ function cleanInputVal($conf, $suffix = '') { 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)) { $inputVal = $conf['inputValue' . $suffix]; } elseif ($conf['comparison'] == 39 || $conf['comparison'] == 38) { // in list: $inputVal = implode(',', t3lib_div::intExplode(',', $conf['inputValue' . $suffix])); } elseif ($conf['comparison'] == 68 || $conf['comparison'] == 69 || $conf['comparison'] == 162 || $conf['comparison'] == 163) { // in list: if (is_array($conf['inputValue' . $suffix])) { $inputVal = implode(',', $conf['inputValue' . $suffix]); } elseif ($conf['inputValue' . $suffix]) { $inputVal = $conf['inputValue' . $suffix]; } else { $inputVal = 0; } } else { $inputVal = doubleval($conf['inputValue' . $suffix]); } return $inputVal; } /** * [Describe function...] * * @param [type] $qcArr: ... * @return [type] ... */ function getUserDefQuery($qcArr) { } /** * [Describe function...] * * @return [type] ... */ function updateIcon() { return '<input type="image" border="0" ' . t3lib_iconWorks::skinImg($GLOBALS['BACK_PATH'], 'gfx/refresh_n.gif', 'width="14" height="14"') . ' title="Update" name="just_update">'; } /** * [Describe function...] * * @return [type] ... */ function getLabelCol() { global $TCA; return $TCA[$this->table]['ctrl']['label']; } /** * [Describe function...] * * @param [type] $modSettings: ... * @param [type] $enableList: ... * @return [type] ... */ function makeSelectorTable($modSettings, $enableList = 'table,fields,query,group,order,limit') { $enableArr = explode(',', $enableList); // Make output $TDparams = ' class="bgColor5" nowrap'; if (in_array('table', $enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableSelectATable']) { $out = ' <tr> <td' . $TDparams . '><strong>Select a table:</strong></td> <td' . $TDparams . '>' . $this->mkTableSelect('SET[queryTable]', $this->table) . '</td> </tr>'; } if ($this->table) { // Init fields: $this->setAndCleanUpExternalLists('queryFields', $modSettings['queryFields'], 'uid,' . $this->getLabelCol()); $this->setAndCleanUpExternalLists('queryGroup', $modSettings['queryGroup']); $this->setAndCleanUpExternalLists('queryOrder', $modSettings['queryOrder'] . ',' . $modSettings['queryOrder2']); // Limit: $this->extFieldLists['queryLimit'] = $modSettings['queryLimit']; if (!$this->extFieldLists['queryLimit']) { $this->extFieldLists['queryLimit'] = 100; } $parts = t3lib_div::intExplode(',', $this->extFieldLists['queryLimit']); if ($parts[1]) { $this->limitBegin = $parts[0]; $this->limitLength = $parts[1]; } else { $this->limitLength = $this->extFieldLists['queryLimit']; } $this->extFieldLists['queryLimit'] = implode(',', array_slice($parts, 0, 2)); // Insert Descending parts if ($this->extFieldLists['queryOrder']) { $descParts = explode(',', $modSettings['queryOrderDesc'] . ',' . $modSettings['queryOrder2Desc']); $orderParts = explode(',', $this->extFieldLists['queryOrder']); $reList = array(); foreach ($orderParts as $kk => $vv) { $reList[] = $vv . ($descParts[$kk] ? ' DESC' : ''); } $this->extFieldLists['queryOrder_SQL'] = implode(',', $reList); } // Query Generator: $this->procesData($modSettings['queryConfig'] ? unserialize($modSettings['queryConfig']) : ''); // debug($this->queryConfig); $this->queryConfig = $this->cleanUpQueryConfig($this->queryConfig); // debug($this->queryConfig); $this->enableQueryParts = $modSettings['search_query_smallparts']; $codeArr = $this->getFormElements(); $queryCode = $this->printCodeArray($codeArr); if (in_array('fields', $enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableSelectFields']) { $out .= ' <tr> <td' . $TDparams . '><strong>Select fields:</strong></td> <td' . $TDparams . '>' . $this->mkFieldToInputSelect('SET[queryFields]', $this->extFieldLists['queryFields']) . '</td> </tr>'; } if (in_array('query', $enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableMakeQuery']) { $out .= '<tr> <td colspan="2"' . $TDparams . '><strong>Make Query:</strong></td> </tr> <tr> <td colspan="2">' . $queryCode . '</td> </tr> '; } if (in_array('group', $enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableGroupBy']) { $out .= '<tr> <td' . $TDparams . '><strong>Group By:</strong></td> <td' . $TDparams . '>' . $this->mkTypeSelect('SET[queryGroup]', $this->extFieldLists['queryGroup'], '') . '</td> </tr>'; } if (in_array('order', $enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableOrderBy']) { $orderByArr = explode(',', $this->extFieldLists['queryOrder']); // debug($orderByArr); $orderBy = ''; $orderBy .= $this->mkTypeSelect('SET[queryOrder]', $orderByArr[0], '') . ' ' . t3lib_BEfunc::getFuncCheck($GLOBALS['SOBE']->id, 'SET[queryOrderDesc]', $modSettings['queryOrderDesc'], '', '', 'id="checkQueryOrderDesc"') . ' <label for="checkQueryOrderDesc">Descending</label>'; if ($orderByArr[0]) { $orderBy .= '<BR>' . $this->mkTypeSelect('SET[queryOrder2]', $orderByArr[1], '') . ' ' . t3lib_BEfunc::getFuncCheck($GLOBALS['SOBE']->id, 'SET[queryOrder2Desc]', $modSettings['queryOrder2Desc'], '', '', 'id="checkQueryOrder2Desc"') . ' <label for="checkQueryOrder2Desc">Descending</label>'; } $out .= '<tr> <td' . $TDparams . '><strong>Order By:</strong></td> <td' . $TDparams . '>' . $orderBy . '</td> </tr>'; } if (in_array('limit', $enableArr) && !$GLOBALS['BE_USER']->userTS['mod.']['dbint.']['disableLimit']) { $limit = '<input type="Text" value="' . htmlspecialchars($this->extFieldLists['queryLimit']) . '" name="SET[queryLimit]" id="queryLimit"' . $GLOBALS['TBE_TEMPLATE']->formWidth(10) . '>' . $this->updateIcon(); $prevLimit = ($this->limitBegin - $this->limitLength) < 0 ? 0 : $this->limitBegin - $this->limitLength; if ($this->limitBegin) { $prevButton = '<input type="button" value="previous ' . $this->limitLength . '" onclick=\'document.getElementById("queryLimit").value="' . $prevLimit . ',' . $this->limitLength . '";document.forms[0].submit();\'>'; } if (!$this->limitLength) { $this->limitLength = 100; } $nextLimit = $this->limitBegin + $this->limitLength; if ($nextLimit < 0) { $nextLimit = 0; } if ($nextLimit) { $nextButton = '<input type="button" value="next ' . $this->limitLength . '" onclick=\'document.getElementById("queryLimit").value="' . $nextLimit . ',' . $this->limitLength . '";document.forms[0].submit();\'>'; } $numberButtons = '<input type="button" value="10" onclick=\'document.getElementById("queryLimit").value="10";document.forms[0].submit();\'>'; $numberButtons .= '<input type="button" value="20" onclick=\'document.getElementById("queryLimit").value="20";document.forms[0].submit();\'>'; $numberButtons .= '<input type="button" value="50" onclick=\'document.getElementById("queryLimit").value="50";document.forms[0].submit();\'>'; $numberButtons .= '<input type="button" value="100" onclick=\'document.getElementById("queryLimit").value="100";document.forms[0].submit();\'>'; $out .= '<tr> <td' . $TDparams . '><strong>Limit:</strong></td> <td' . $TDparams . '>' . $limit . $prevButton . $nextButton . ' ' . $numberButtons . '</td> </tr> '; } } $out = '<table border="0" cellpadding="3" cellspacing="1" class="qg-make-query">' . $out . '</table>'; $out .= $this->JSbottom($this->formName); return $out; } /** * [Describe function...] * * @param [type] $qString: ... * @param [type] $depth: ... * @param [type] $begin: ... * @param [type] $perms_clause: ... * @return [type] ... */ function getTreeList($id, $depth, $begin = 0, $perms_clause) { $depth = intval($depth); $begin = intval($begin); $id = intval($id); if ($begin == 0) { $theList = $id; } else { $theList = ''; } if ($id && $depth > 0) { $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 'uid', 'pages', 'pid=' . $id . ' ' . t3lib_BEfunc::deleteClause('pages') . ' AND ' . $perms_clause ); while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { if ($begin <= 0) { $theList .= ',' . $row['uid']; } if ($depth > 1) { $theList .= $this->getTreeList($row['uid'], $depth - 1, $begin - 1, $perms_clause); } } } return $theList; } /** * [Describe function...] * * @param [type] $qString: ... * @param [type] $fN: ... * @return [type] ... */ function getSelectQuery($qString = '', $fN = '') { if (!$qString) { $qString = $this->getQuery($this->queryConfig); } $qString = '(' . $qString . ')'; if (!$GLOBALS['BE_USER']->isAdmin() && $GLOBALS['TYPO3_CONF_VARS']['BE']['lockBeUserToDBmounts']) { $webMounts = $GLOBALS['BE_USER']->returnWebmounts(); $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1); $webMountPageTree = ''; foreach ($webMounts as $key => $val) { if ($webMountPageTree) { $webMountPageTreePrefix = ','; } $webMountPageTree .= $webMountPageTreePrefix . $this->getTreeList($val, 999, $begin = 0, $perms_clause); } if ($this->table == 'pages') { $qString .= ' AND uid IN (' . $webMountPageTree . ')'; } else { $qString .= ' AND pid IN (' . $webMountPageTree . ')'; } } $fieldlist = $this->extFieldLists['queryFields'] . ',pid' . ($GLOBALS['TCA'][$this->table]['ctrl']['delete'] ? ',' . $GLOBALS['TCA'][$this->table]['ctrl']['delete'] : ''); if (!$GLOBALS['SOBE']->MOD_SETTINGS['show_deleted']) { $qString .= t3lib_BEfunc::deleteClause($this->table); } $query = $GLOBALS['TYPO3_DB']->SELECTquery( $fieldlist, $this->table, $qString, trim($this->extFieldLists['queryGroup']), $this->extFieldLists['queryOrder'] ? trim($this->extFieldLists['queryOrder_SQL']) : '', $this->extFieldLists['queryLimit'] ); return $query; } /** * [Describe function...] * * @param [type] $formname: ... * @return [type] ... */ function JSbottom($formname) { $out = ''; if ($this->extJSCODE) { $out .= ' <script language="javascript" type="text/javascript" src="' . $GLOBALS['BACK_PATH'] . '../t3lib/jsfunc.evalfield.js"></script> <script language="javascript" type="text/javascript" src="' . $GLOBALS['BACK_PATH'] . 'jsfunc.tbe_editor.js"></script> <script language="javascript" type="text/javascript"> TBE_EDITOR.formname = "' . $formname . '"; TBE_EDITOR.formnameUENC = "' . rawurlencode($formname) . '"; TBE_EDITOR.backend_interface = "' . $GLOBALS['BE_USER']->uc['interfaceSetup'] . '"; ' . $this->extJSCODE . ' </script>'; } return $out; } /** * Sets the current name of the input form. * * @param string $formName: The name of the form. * @return void */ public function setFormName($formName) { $this->formName = trim($formName); } } if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_querygenerator.php'])) { include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_querygenerator.php']); } ?>