From 393f123228e1b03da38a65c372876000f5926606 Mon Sep 17 00:00:00 2001 From: Carsten Rose <carsten.rose@math.uzh.ch> Date: Wed, 15 Mar 2017 15:56:07 +0100 Subject: [PATCH] TypeAhead.php: fixed typo Ldap.php: fixed implementation errors of first run. AbstractBuildForm.php: set defaults for limit and minlegth. Implement function checkSqlAppendLimit() --- extension/qfq/qfq/AbstractBuildForm.php | 43 +++++++++++++++++++------ extension/qfq/qfq/Constants.php | 6 ++-- extension/qfq/qfq/form/TypeAhead.php | 2 +- extension/qfq/qfq/helper/Ldap.php | 7 ++-- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/extension/qfq/qfq/AbstractBuildForm.php b/extension/qfq/qfq/AbstractBuildForm.php index 109535f25..3ff0441c8 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 4ae06fad2..cb94a561a 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 fc8d032bf..87545b6ca 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 1425f7def..c5c1ef046 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]; -- GitLab