dblayeroo : Clean the columns name if there is only one table displayed, even if join is used

git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@5162 bf3deb0d-5f1a-0410-827f-c0cc1f45334c
This commit is contained in:
2019-03-22 13:08:13 +00:00
parent 99bc63ff0b
commit d3f9aaeaa2

View File

@@ -2011,6 +2011,42 @@ class dblayeroo
}
/* }}} */
/** Convert a CONCAT('text',field) to CONCAT('text',`table`.`field`) or
* generate an exception if the field is not available in table
* If the provided string is not a concat, return the original one
* @param string $concat The string to examine
* @param object $object The dblayer object to use
*/
private function concat ($concat, $object)
// {{{
{
if (substr ($concat, 0, 7) !== "CONCAT(")
return $concat;
if (substr ($concat, -1) !== ")")
$this->DBException ("CONCAT without ending parenthesis");
$tmp = substr ($concat, 7, -1);
$new = "CONCAT(";
foreach (explode (",", $tmp) as $part)
{
if ($new !== "CONCAT(")
$new .= ",";
if (substr ($part, 0, 1) === "'" &&
substr ($part, -1) === "'")
$new .= $part;
elseif (! array_key_exists ($part, $object->fields))
$this->DBException (sprintf (
"Invalid field to join in CONCAT : ".
"'%s' not defined in Distant table", $part));
else
$new .=
$this->sep.$object->tableprefix.$object->table.$this->sep.".".
$this->sep.$part.$this->sep;
}
$new .= ")";
return $new;
}
// }}}
/** Do the real join
* @param string $joinType The join type to use ("INNER", "LEFT", "RIGHT")
* @param object $object The dblayeroo object to use for searching the join
@@ -2040,45 +2076,30 @@ class dblayeroo
$this->DBException ("Invalid joinArray provided (not array)");
if (empty ($joinArray))
$this->DBException ("Invalid joinArray provided (empty array)");
$newJoinArray = array ();
foreach ($joinArray as $fieldLocal=>$fieldToJoin)
{
if (! array_key_exists ($fieldLocal, $this->fields))
if (substr ($fieldToJoin, 0, 7) === "CONCAT(")
$fieldLocal = $this->concat ($fieldToJoin, $object);
elseif (array_key_exists ($fieldToJoin, $object->fields))
$fieldLocal =
$this->sep.$object->tableprefix.$object->table.$this->sep.".".
$this->sep.$fieldToJoin.$this->sep;
else
$this->DBException (sprintf (
"Invalid field to join '%s' : not defined in Local table",
$fieldLocal));
if (substr ($fieldToJoin, 0, 7) === "CONCAT(")
{
if (substr ($fieldToJoin, -1) !== ")")
$this->DBException ("CONCAT without ending parenthesis");
$tmp = substr ($fieldToJoin, 7, -1);
$new = "CONCAT(";
foreach (explode (",", $tmp) as $part)
{
if ($new !== "CONCAT(")
$new .= ",";
if (substr ($part, 0, 1) === "'" &&
substr ($part, -1) === "'")
$new .= $part;
elseif (! array_key_exists ($part, $object->fields))
$this->DBException (sprintf (
"Invalid field to join in CONCAT : ".
"'%s' not defined in Distant table", $part));
else
$new .=
$this->sep.$object->tableprefix.$object->table.$this->sep.".".
$this->sep.$part.$this->sep;
}
$new .= ")";
$joinArray[$fieldLocal] = $new;
}
elseif (! array_key_exists ($fieldToJoin, $object->fields))
$fieldToJoin = $this->concat ($fieldToJoin, $object);
elseif (array_key_exists ($fieldToJoin, $object->fields))
$fieldToJoin =
$this->sep.$object->tableprefix.$object->table.$this->sep.".".
$this->sep.$fieldToJoin.$this->sep;
else
$this->DBException (sprintf (
"Invalid field to join '%s' : not defined in Distant table",
$fieldToJoin));
else
$joinArray[$fieldLocal] =
$this->sep.$object->tableprefix.$object->table.$this->sep.".".
$this->sep.$fieldToJoin.$this->sep;
$newJoinArray[$fieldLocal] = $fieldToJoin;
}
if (! isset ($object->table) || $object->table === null ||
trim ($object->table) === "")
@@ -2090,14 +2111,11 @@ class dblayeroo
$this->DBException ("No tableprefix defined in the Join object");
$this->joinObject[] = $object;
$tmp = "";
foreach ($joinArray as $fieldLocal=>$fieldToJoin)
foreach ($newJoinArray as $fieldLocal=>$fieldToJoin)
{
if ($tmp !== "")
$tmp .= " AND ";
$tmp .=
$this->sep.$this->tableprefix.$this->table.$this->sep.".".
$this->sep.$fieldLocal.$this->sep.
"=$fieldToJoin";
$tmp .= "$fieldLocal=$fieldToJoin";
}
// Correct the displayQuery in the main display fields with the display
// fields of object
@@ -3219,8 +3237,27 @@ class dblayeroo
// FETCH_ASSOC doesn't work in empty left join (return NULL instead of
// the filled value)
$fieldsAll = $this->fieldsAll (false);
if ($this->joinObject === null && count ($this->displayGet (false)))
// If the displayed fields are all in the same table, remove the table
// name in the columns
$cleanable = true;
$cleanTable = "";
foreach ($this->displayGet (true) as $display)
{
preg_match_all ("#".$this->sep."(.+)".$this->sep."\.#", $display,
$matches);
if ($cleanTable === "")
$cleanTable = $matches[1][0];
elseif ($cleanTable !== $matches[1][0])
{
$cleanable = false;
break;
}
}
//if ($this->joinObject === null && count ($this->displayGet (false)))
if ($cleanable)
{
// Force the fields to local ones as there is no use of external fields
$fieldsAll = $this->fields;
// Remove the table name as there is no collisions risk
// In case of Alias, remove the $this->sep too
$columns = array ();