mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-02-04 20:40:14 +01:00
"replace ambiguous auto-id with (an exact match of) table_name.autoid"
This commit is contained in:
parent
892e22a4a0
commit
bfab75389c
@ -12,14 +12,14 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Generalized SQL Storage Object with build in custom field support
|
* Generalized SQL Storage Object with build in custom field support
|
||||||
*
|
*
|
||||||
* This class allows to display, search, order and filter by custom fields simply by replacing so_sql
|
* This class allows to display, search, order and filter by custom fields simply by replacing so_sql
|
||||||
* by it and adding custom field widgets to the eTemplates of an applications.
|
* by it and adding custom field widgets to the eTemplates of an applications.
|
||||||
* It's inspired by the code from Klaus Leithoff, which does the same thing limited to addressbook.
|
* It's inspired by the code from Klaus Leithoff, which does the same thing limited to addressbook.
|
||||||
*
|
*
|
||||||
* The schema of the custom fields table should be like (the lenght of the cf name is nowhere enfored and
|
* The schema of the custom fields table should be like (the lenght of the cf name is nowhere enfored and
|
||||||
* varies throughout eGW from 40-255, the value column from varchar(255) to longtext!):
|
* varies throughout eGW from 40-255, the value column from varchar(255) to longtext!):
|
||||||
*
|
*
|
||||||
* 'egw_app_extra' => array(
|
* 'egw_app_extra' => array(
|
||||||
* 'fd' => array(
|
* 'fd' => array(
|
||||||
* 'prefix_id' => array('type' => 'int','precision' => '4','nullable' => False),
|
* 'prefix_id' => array('type' => 'int','precision' => '4','nullable' => False),
|
||||||
@ -50,21 +50,21 @@ class so_sql_cf extends so_sql
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* name of id column, defaults to the regular tables auto id
|
* name of id column, defaults to the regular tables auto id
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
var $extra_id = '_id';
|
var $extra_id = '_id';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Name of key (cf name) column or just a postfix added to the table prefix
|
* Name of key (cf name) column or just a postfix added to the table prefix
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
var $extra_key = '_name';
|
var $extra_key = '_name';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Name of value column or just a postfix added to the table prefix
|
* Name of value column or just a postfix added to the table prefix
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
var $extra_value = '_value';
|
var $extra_value = '_value';
|
||||||
@ -72,17 +72,17 @@ class so_sql_cf extends so_sql
|
|||||||
var $extra_join;
|
var $extra_join;
|
||||||
var $extra_join_order;
|
var $extra_join_order;
|
||||||
var $extra_join_filter;
|
var $extra_join_filter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom fields of $app, read by the constructor
|
* Custom fields of $app, read by the constructor
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $customfields;
|
var $customfields;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* constructor of the class
|
* constructor of the class
|
||||||
*
|
*
|
||||||
* Please note the different params compared to so_sql!
|
* Please note the different params compared to so_sql!
|
||||||
*
|
*
|
||||||
* @param string $app application name to load table schemas
|
* @param string $app application name to load table schemas
|
||||||
@ -102,10 +102,10 @@ class so_sql_cf extends so_sql
|
|||||||
{
|
{
|
||||||
// calling the so_sql constructor
|
// calling the so_sql constructor
|
||||||
parent::__construct($app,$table,$db,$column_prefix,$no_clone);
|
parent::__construct($app,$table,$db,$column_prefix,$no_clone);
|
||||||
|
|
||||||
$this->extra_table = $extra_table;
|
$this->extra_table = $extra_table;
|
||||||
if (!$this->extra_id) $this->extra_id = $this->autoinc_id; // default to auto id of regular table
|
if (!$this->extra_id) $this->extra_id = $this->autoinc_id; // default to auto id of regular table
|
||||||
|
|
||||||
// if names from columns of extra table are only postfixes (starting with _), prepend column prefix
|
// if names from columns of extra table are only postfixes (starting with _), prepend column prefix
|
||||||
if (!($prefix=$column_prefix))
|
if (!($prefix=$column_prefix))
|
||||||
{
|
{
|
||||||
@ -136,7 +136,7 @@ class so_sql_cf extends so_sql
|
|||||||
$this->extra_join = " LEFT JOIN $extra_table ON $table.$this->autoinc_id=$extra_table.$this->extra_id";
|
$this->extra_join = " LEFT JOIN $extra_table ON $table.$this->autoinc_id=$extra_table.$this->extra_id";
|
||||||
$this->extra_join_order = " LEFT JOIN $extra_table extra_order ON $table.$this->autoinc_id=extra_order.$this->extra_id";
|
$this->extra_join_order = " LEFT JOIN $extra_table extra_order ON $table.$this->autoinc_id=extra_order.$this->extra_id";
|
||||||
$this->extra_join_filter = " JOIN $extra_table extra_filter ON $table.$this->autoinc_id=extra_filter.$this->extra_id";
|
$this->extra_join_filter = " JOIN $extra_table extra_filter ON $table.$this->autoinc_id=extra_filter.$this->extra_id";
|
||||||
|
|
||||||
$this->customfields = config::get_customfields($app);
|
$this->customfields = config::get_customfields($app);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,7 +184,7 @@ class so_sql_cf extends so_sql
|
|||||||
$this->extra_id => $data[$this->autoinc_id],
|
$this->extra_id => $data[$this->autoinc_id],
|
||||||
$this->extra_key => $field,
|
$this->extra_key => $field,
|
||||||
);
|
);
|
||||||
|
|
||||||
if((string) $data[self::CF_PREFIX.$field] === '') // dont write empty values
|
if((string) $data[self::CF_PREFIX.$field] === '') // dont write empty values
|
||||||
{
|
{
|
||||||
$this->db->delete($this->extra_table,$where,__LINE__,__FILE__,$this->app); // just delete them, in case they were previously set
|
$this->db->delete($this->extra_table,$where,__LINE__,__FILE__,$this->app); // just delete them, in case they were previously set
|
||||||
@ -197,7 +197,7 @@ class so_sql_cf extends so_sql
|
|||||||
}
|
}
|
||||||
return false; // no error
|
return false; // no error
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* merges in new values from the given new data-array
|
* merges in new values from the given new data-array
|
||||||
*
|
*
|
||||||
@ -223,7 +223,7 @@ class so_sql_cf extends so_sql
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* reads row matched by key and puts all cols in the data array
|
* reads row matched by key and puts all cols in the data array
|
||||||
*
|
*
|
||||||
* reimplented to also read the custom fields
|
* reimplented to also read the custom fields
|
||||||
*
|
*
|
||||||
* @param array $keys array with keys in form internalName => value, may be a scalar value if only one key
|
* @param array $keys array with keys in form internalName => value, may be a scalar value if only one key
|
||||||
@ -259,7 +259,7 @@ class so_sql_cf extends so_sql
|
|||||||
if (is_array($keys) && count($keys)) $this->data_merge($keys);
|
if (is_array($keys) && count($keys)) $this->data_merge($keys);
|
||||||
|
|
||||||
$ret = parent::save(null,$extra_where);
|
$ret = parent::save(null,$extra_where);
|
||||||
|
|
||||||
if ($ret == 0 && $this->customfields)
|
if ($ret == 0 && $this->customfields)
|
||||||
{
|
{
|
||||||
$this->save_customfields($this->data);
|
$this->save_customfields($this->data);
|
||||||
@ -300,9 +300,9 @@ class so_sql_cf extends so_sql
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* query rows for the nextmatch widget
|
* query rows for the nextmatch widget
|
||||||
*
|
*
|
||||||
* Reimplemented to also read the custom fields (if enabled via $query['selectcols']).
|
* Reimplemented to also read the custom fields (if enabled via $query['selectcols']).
|
||||||
*
|
*
|
||||||
* Please note: the name of the nextmatch-customfields has to be 'customfields'!
|
* Please note: the name of the nextmatch-customfields has to be 'customfields'!
|
||||||
*
|
*
|
||||||
* @param array $query with keys 'start', 'search', 'order', 'sort', 'col_filter'
|
* @param array $query with keys 'start', 'search', 'order', 'sort', 'col_filter'
|
||||||
@ -331,7 +331,7 @@ class so_sql_cf extends so_sql
|
|||||||
$query['col_filter'],$join,$need_full_no_count);
|
$query['col_filter'],$join,$need_full_no_count);
|
||||||
|
|
||||||
if (!$rows) $rows = array(); // otherwise false returned from search would be returned as array(false)
|
if (!$rows) $rows = array(); // otherwise false returned from search would be returned as array(false)
|
||||||
|
|
||||||
$selectcols = $query['selectcols'] ? explode(',',$query['selectcols']) : array();
|
$selectcols = $query['selectcols'] ? explode(',',$query['selectcols']) : array();
|
||||||
|
|
||||||
if ($rows && $this->customfields && (!$selectcols || in_array('customfields',$selectcols)))
|
if ($rows && $this->customfields && (!$selectcols || in_array('customfields',$selectcols)))
|
||||||
@ -359,7 +359,7 @@ class so_sql_cf extends so_sql
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* searches db for rows matching searchcriteria
|
* searches db for rows matching searchcriteria
|
||||||
*
|
*
|
||||||
* Reimplemented to search, order and filter by custom fields
|
* Reimplemented to search, order and filter by custom fields
|
||||||
*
|
*
|
||||||
* @param array/string $criteria array of key and data cols, OR a SQL query (content for WHERE), fully quoted (!)
|
* @param array/string $criteria array of key and data cols, OR a SQL query (content for WHERE), fully quoted (!)
|
||||||
@ -383,19 +383,29 @@ class so_sql_cf extends so_sql
|
|||||||
if ($criteria && is_array($criteria) && isset($criteria[$this->extra_value]))
|
if ($criteria && is_array($criteria) && isset($criteria[$this->extra_value]))
|
||||||
{
|
{
|
||||||
$criteria[] = $this->extra_table.'.'.$this->extra_value . ' ' .
|
$criteria[] = $this->extra_table.'.'.$this->extra_value . ' ' .
|
||||||
$this->db->capabilities[egw_db::CAPABILITY_CASE_INSENSITIV_LIKE]. ' ' .
|
$this->db->capabilities[egw_db::CAPABILITY_CASE_INSENSITIV_LIKE]. ' ' .
|
||||||
$this->db->quote('%'.$criteria[$this->extra_value].'%');
|
$this->db->quote('%'.$criteria[$this->extra_value].'%');
|
||||||
unset($criteria[$this->extra_value]);
|
unset($criteria[$this->extra_value]);
|
||||||
$join .= $this->extra_join;
|
$join .= $this->extra_join;
|
||||||
|
|
||||||
|
// replace ambiguous auto-id with (an exact match of) table_name.autoid
|
||||||
|
if (isset($criteria[$this->autoinc_id]))
|
||||||
|
{
|
||||||
|
if ((int)$criteria[$this->autoinc_id])
|
||||||
|
{
|
||||||
|
$criteria[] = $this->table_name.'.'.$this->autoinc_id.'='.(int)$criteria[$this->autoinc_id];
|
||||||
|
}
|
||||||
|
unset($criteria[$this->autoinc_id]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// check if we order by a custom field --> join cf table for given cf and order by it's value
|
// check if we order by a custom field --> join cf table for given cf and order by it's value
|
||||||
if (strpos($order_by,self::CF_PREFIX) !== false &&
|
if (strpos($order_by,self::CF_PREFIX) !== false &&
|
||||||
preg_match('/'.self::CF_PREFIX.'([^ ]+) (asc|desc)/i',$order_by,$matches))
|
preg_match('/'.self::CF_PREFIX.'([^ ]+) (asc|desc)/i',$order_by,$matches))
|
||||||
{
|
{
|
||||||
$order_by = str_replace($matches[0],'extra_order.'.$this->extra_value.' IS NULL,extra_order.'.$this->extra_value.' '.$matches[2],$order_by);
|
$order_by = str_replace($matches[0],'extra_order.'.$this->extra_value.' IS NULL,extra_order.'.$this->extra_value.' '.$matches[2],$order_by);
|
||||||
$join .= $this->extra_join_order.' AND extra_order.'.$this->extra_key.'='.$this->db->quote($matches[1]);
|
$join .= $this->extra_join_order.' AND extra_order.'.$this->extra_key.'='.$this->db->quote($matches[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if we filter by a custom field
|
// check if we filter by a custom field
|
||||||
foreach($filter as $name => $val)
|
foreach($filter as $name => $val)
|
||||||
{
|
{
|
||||||
@ -420,10 +430,10 @@ class so_sql_cf extends so_sql
|
|||||||
unset($filter[$name]);
|
unset($filter[$name]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::search($criteria,$only_keys,$order_by,$extra_cols,$wildcard,$empty,$op,$start,$filter,$join,$need_full_no_count);
|
return parent::search($criteria,$only_keys,$order_by,$extra_cols,$wildcard,$empty,$op,$start,$filter,$join,$need_full_no_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prevent someone calling the old php4 so_sql constructor
|
* Prevent someone calling the old php4 so_sql constructor
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user