diff --git a/extension/qfq/qfq/AbstractBuildForm.php b/extension/qfq/qfq/AbstractBuildForm.php index 109535f25e027d8368e2a186bbc37be06fde5de7..3ff0441c80e595e5124bf073cccfe63227afaa60 100644 --- a/extension/qfq/qfq/AbstractBuildForm.php +++ b/extension/qfq/qfq/AbstractBuildForm.php @@ -9,9 +9,10 @@ namespace qfq; use qfq; -use qfq\Store; -use qfq\OnArray; -use qfq\UserFormException; + +//use qfq\Store; +//use qfq\OnArray; +//use qfq\UserFormException; require_once(__DIR__ . '/../qfq/store/Store.php'); require_once(__DIR__ . '/../qfq/Constants.php'); @@ -787,23 +788,27 @@ abstract class AbstractBuildForm { /** * Check $formElement for FE_TYPE_AHEAD_SQL or FE_TYPE_AHEAD_LDAP_SERVER. * If one of them is given: fill $urlParam. + * Set some parameter for later outside use, especially FE_TYPEAHEAD_LIMIT, FE_TYPEAHEAD_MINLENGTH * * @param array $formElement * @return string */ - private function typeAheadBuildParam(array $formElement) { + private function typeAheadBuildParam(array &$formElement) { $urlParam = ''; + $formElement[FE_TYPEAHEAD_LIMIT] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_LIMIT, TYPEAHEAD_DEFAULT_LIMIT); + $formElement[FE_TYPEAHEAD_MINLENGTH] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_MINLENGTH, 2); + if (isset($formElement[FE_TYPEAHEAD_SQL])) { - $urlParam = FE_TYPEAHEAD_SQL . '=' . $formElement[FE_TYPEAHEAD_SQL]; + $sql = $this->checkSqlAppendLimit($formElement[FE_TYPEAHEAD_SQL], $formElement[FE_TYPEAHEAD_LIMIT]); + $urlParam = FE_TYPEAHEAD_SQL . '=' . $sql; } elseif (isset($formElement[FE_TYPEAHEAD_LDAP_SERVER])) { $formElement[FE_TYPEAHEAD_LDAP_SERVER] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_LDAP_SERVER); $formElement[FE_TYPEAHEAD_LDAP_BASE_DN] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_LDAP_BASE_DN); $formElement[FE_TYPEAHEAD_LDAP_SEARCH] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_LDAP_SEARCH); $formElement[FE_TYPEAHEAD_LDAP_VALUE_PRINTF] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_LDAP_VALUE_PRINTF); $formElement[FE_TYPEAHEAD_LDAP_KEY_PRINTF] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_LDAP_KEY_PRINTF); - $formElement[FE_TYPEAHEAD_LIMIT] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_LIMIT, TYPEAHEAD_DEFAULT_LIMIT); $arr = [ FE_TYPEAHEAD_LDAP_SERVER => $formElement[FE_TYPEAHEAD_LDAP_SERVER], @@ -817,12 +822,30 @@ abstract class AbstractBuildForm { $urlParam = OnArray::toString($arr); } - if ($urlParam != '') { - $formElement[FE_TYPEAHEAD_LIMIT] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_LIMIT, TYPEAHEAD_DEFAULT_LIMIT); - $formElement[FE_TYPEAHEAD_MINLENGTH] = Support::setIfNotSet($formElement, FE_TYPEAHEAD_MINLENGTH, 2); + return $urlParam; + } + + /** + * Checks if $sql contains a SELECT statement. + * Check for existence of a LIMIT Parameter. If not found add one. + * + * @param $sql + * @param $limit + * @return string Checked and maybe extended $sql statement. + * @throws \qfq\UserFormException + */ + private function checkSqlAppendLimit($sql, $limit) { + $sql = trim($sql); + + if (false === stristr(substr($sql, 0, 7), 'SELECT ')) { + throw new UserFormException("Expect a SELECT statement in " . FE_TYPEAHEAD_SQL . " - got: " . $sql, ERROR_BROKEN_PARAMETER); } - return $urlParam; + if (false === stristr($sql, ' LIMIT ')) { + $sql .= " LIMIT $limit"; + } + + return $sql; } /** diff --git a/extension/qfq/qfq/Constants.php b/extension/qfq/qfq/Constants.php index 4ae06fad2732aaee4d054ec0e1df14c43187df44..cb94a561a608fa2f225fb2e7e77de9b85a83b26d 100644 --- a/extension/qfq/qfq/Constants.php +++ b/extension/qfq/qfq/Constants.php @@ -458,11 +458,13 @@ const DATA_HIDDEN = 'data-hidden'; const DATA_DISABLED = 'data-disabled'; const DATA_REQUIRED = 'data-required'; +const CLASS_TYPEAHEAD = 'qfq-typeahead'; const DATA_TYPEAHEAD_SIP = 'data-typeahead-sip'; // Used for typeAhead +//const CLASS_TYPEAHEAD = 'qfq-type-ahead'; +//const DATA_TYPEAHEAD_SIP = 'data-sip'; // Used for typeAhead + const DATA_TYPEAHEAD_LIMIT = 'data-typeahead-limit'; const DATA_TYPEAHEAD_MINLENGTH = 'data-typeahead-minlength'; -const CLASS_TYPEAHEAD = 'qfq-typeahead'; - // BuildForm const SYMBOL_NEW = 'new'; diff --git a/extension/qfq/qfq/form/TypeAhead.php b/extension/qfq/qfq/form/TypeAhead.php index fc8d032bfb49dafe1d5f2e56f9f5830c519b0aa7..87545b6cab77607f3235ae870973ea98bae844bd 100644 --- a/extension/qfq/qfq/form/TypeAhead.php +++ b/extension/qfq/qfq/form/TypeAhead.php @@ -79,7 +79,7 @@ class TypeAhead { $sipVars = $sipClass->getVarsFromSip($this->vars[TYPEAHEAD_API_SIP]); if (isset($sipVars[FE_TYPEAHEAD_SQL])) { - $arr = typeAheadSql($sipVars, $this->vars[TYPEAHEAD_API_QUERY]); + $arr = $this->typeAheadSql($sipVars, $this->vars[TYPEAHEAD_API_QUERY]); } elseif (isset($sipVars[FE_TYPEAHEAD_LDAP_SERVER])) { $ldap = new Ldap(); $arr = $ldap->process($sipVars, $this->vars[TYPEAHEAD_API_QUERY]); diff --git a/extension/qfq/qfq/helper/Ldap.php b/extension/qfq/qfq/helper/Ldap.php index 1425f7def6b0d037e746e72bda262cf430dbdd64..c5c1ef04699c3a03675ef26719991f95910f67b1 100644 --- a/extension/qfq/qfq/helper/Ldap.php +++ b/extension/qfq/qfq/helper/Ldap.php @@ -33,7 +33,8 @@ class Ldap { throw new UserFormException("Unable to connect to LDAP server: $ldapServer", ERROR_LDAP_CONNECT); } - $sr = ldap_search($ds, $ldapBaseDn, $ldapSearch, null, null, $ldapLimit); +// $sr = ldap_search($ds, $ldapBaseDn, $ldapSearch, null, null, $ldapLimit); + $sr = ldap_search($ds, $ldapBaseDn, $ldapSearch); $info = ldap_get_entries($ds, $sr); for ($i = 0; $i < $info["count"]; $i++) { @@ -64,13 +65,13 @@ class Ldap { // keyArr[0]: printf format string // keyArr[1..x]: columnnames $keyArr = KeyValueStringParser::explodeWrapped(',', $format); - if (count($keyArr) <= 2) { + if (count($keyArr) < 2) { throw new UserFormException("Expect a sprintf compatible format string with a least one argument. Got: '" . $format . "'", ERROR_MISSING_PRINTF_ARGUMENTS); } $args = array(); $args[] = $keyArr[0]; - $keyArr = array_shift($keyArr); + array_shift($keyArr); foreach ($keyArr as $arg) { $keyName = trim($arg); $args[] = $infoElement[$keyName][0];