Änderungen an der Klasse ItemCollection
Verfasst: Di 14. Feb 2006, 11:37
Habe mal wieder etwas angepasst. Es bezieht sich auf die Version 4.5.0 alpha (steht zumindest in der Setuproutine). Ich kann daher nicht sagen ob das Problem bei späteren Versionen weiterhin besteht.
Und zwar ist es nicht möglich bei einer Klasse, die von ItemCollection abgeleitet ist, bei einer Gruppenbedingung mehrere Where's des gleichen Feldes einzutragen.
Beispiel:
Bei einer Suche über die Datenbestände gibt der User "x y" für Feld z ein.
Jetzt will ich natürlich nicht nur prüfen, ob "z like '%x y%'", sondern
"z like '%x%' and z like '%y%'".
Allerdings wird nur die zuletzt eingestellte Bedingung für z ausgeführt.
Sprich, das SQL Statement, das erzeugt wird, hat nur "z like '%y%'".
Meine Änderung, um das zu beseitigen sieht wie folgt aus:
die Funktionen können entweder direkt in der class.genericdb.php ersetzt, oder nur in den, von ItemCollection, abgeleiteten Klassen eingefügt werden, und so überladen.
Hoffe das hilft jemandem.
Und zwar ist es nicht möglich bei einer Klasse, die von ItemCollection abgeleitet ist, bei einer Gruppenbedingung mehrere Where's des gleichen Feldes einzutragen.
Beispiel:
Bei einer Suche über die Datenbestände gibt der User "x y" für Feld z ein.
Jetzt will ich natürlich nicht nur prüfen, ob "z like '%x y%'", sondern
"z like '%x%' and z like '%y%'".
Allerdings wird nur die zuletzt eingestellte Bedingung für z ausgeführt.
Sprich, das SQL Statement, das erzeugt wird, hat nur "z like '%y%'".
Meine Änderung, um das zu beseitigen sieht wie folgt aus:
Code: Alles auswählen
function setWhereGroup ($group, $field, $restriction, $operator = "=")
{
$field = strtolower($field);
if (!isset($this->_groupCounter[$group]))
$this->_groupCounter[$group] = 0;
$this->_where["groups"][$group][$this->_groupCounter[$group]]["operator"] = $operator;
$this->_where["groups"][$group][$this->_groupCounter[$group]]["restriction"] = $restriction;
$this->_where["groups"][$group][$this->_groupCounter[$group]]["field"] = $field;
$this->_groupCounter[$group]++;
}
function _buildGroupWhereStatements()
{
$wheres = array();
$groupwhere = array();
$lastgroup = false;
$groupwherestatement = "";
/* Find out if there are any defined groups */
if (count($this->_where["groups"]) > 0)
{
/* Step trough all groups */
foreach ($this->_where["groups"] as $groupname => $group)
{
$wheres = array();
/* Fetch restriction, fields and operators and build single group where statements */
foreach ($group as $cnt => $item)
{
$restriction = "'" . $this->_itemClassInstance->_inFilter($item["restriction"]) . "'";
$wheres[] = implode(" ", array($item["field"], $item["operator"], $restriction));
}
/* Add completed substatements */
$operator = 'AND';
if (array_key_exists($groupname, $this->_innerGroupConditions))
{
$operator = $this->_innerGroupConditions[$groupname];
}
$groupwhere[$groupname] = implode(" ".$operator." ", $wheres);
}
}
/* Combine groups */
foreach ($groupwhere as $groupname => $group)
{
if ($lastgroup != false)
{
$operator = "AND";
/* Check if there's a group condition */
if (array_key_exists($groupname, $this->_groupConditions))
{
if (array_key_exists($lastgroup, $this->_groupConditions[$groupname]))
{
$operator = $this->_groupConditions[$groupname][$lastgroup];
}
}
/* Reverse check */
if (array_key_exists($lastgroup, $this->_groupConditions))
{
if (array_key_exists($groupname, $this->_groupConditions[$lastgroup]))
{
$operator = $this->_groupConditions[$lastgroup][$groupname];
}
}
$groupwherestatement .= " ". $operator . " (" . $group . ")";
}
else
{
$groupwherestatement .= "(" . $group . ")";
}
$lastgroup = $groupname;
}
return ($groupwherestatement);
}
Hoffe das hilft jemandem.