fixed sql error reported by Uwe Redecker on the German list and got cfs as orga fields working (including multiselections)

This commit is contained in:
Ralf Becker 2008-03-30 08:53:40 +00:00
parent 3d211e2cab
commit b0da799ee7
2 changed files with 69 additions and 15 deletions

View File

@ -618,22 +618,73 @@ class bocontacts extends socontacts
list($name,$value) = explode(':',$part);
$org[$name] = $value;
}
$csvs = array('cat_id'); // fields with comma-separated-values
$contacts = parent::search('',$this->org_fields,'','','',false,'AND',false,$org);
// split regular fields and custom fields
$custom_fields = $regular_fields = array();
foreach($this->org_fields as $name)
{
if ($name[0] != '#')
{
$regular_fields[] = $name;
}
else
{
$custom_fields[] = $name = substr($name,1);
$regular_fields['id'] = 'id';
if (substr($this->customfields[$name]['type'],0,6)=='select' && $this->customfields[$name]['rows'] || // multiselection
$this->customfields[$name]['type'] == 'radio')
{
$csvs[] = '#'.$name;
}
}
}
// read the regular fields
$contacts = parent::search('',$regular_fields,'','','',false,'AND',false,$org);
if (!$contacts) return false;
// if we have custom fields, read and merge them in
if ($custom_fields)
{
foreach($contacts as $contact)
{
$ids[] = $contact['id'];
}
if (($cfs = $this->read_customfields($ids,$custom_fields)))
{
foreach ($contacts as &$contact)
{
$id = $contact['id'];
if (isset($cfs[$id]))
{
foreach($cfs[$id] as $name => $value)
{
$contact['#'.$name] = $value;
}
}
}
unset($contact);
}
}
// create a statistic about the commonness of each fields values
$fields = array();
foreach($contacts as $contact)
{
foreach($contact as $name => $value)
{
if ($name != 'cat_id') $fields[$name][$value]++;
}
foreach(explode(',',$contact['cat_id']) as $part)
if (!in_array($name,$csvs))
{
list($name) = explode(',',$part);
$fields['cat_id'][$name]++;
$fields[$name][$value]++;
}
else
{
// for comma separated fields, we have to use each single value
foreach(explode(',',$value) as $val)
{
$fields[$name][$val]++;
}
}
}
}
foreach($fields as $name => $values)
@ -645,18 +696,18 @@ class bocontacts extends socontacts
//echo "<p>$name: '$value' $num/".count($contacts)."=".($num / (double) count($contacts))." >= $this->org_common_factor = ".($num / (double) count($contacts) >= $this->org_common_factor ? 'true' : 'false')."</p>\n";
if ($value && $num / (double) count($contacts) >= $this->org_common_factor)
{
if ($name != 'cat_id')
if (!in_array($name,$csvs))
{
$org[$name] = $value;
}
else
{
$org[$name] = array();
foreach ($values as $catid => $catvalue)
foreach ($values as $value => $num)
{
if ($catid && $catvalue / (double) count($values) >= $this->org_common_factor)
if ($value && $num / (double) count($contacts) >= $this->org_common_factor)
{
$org[$name][] = $catid;
$org[$name][] = $value;
}
}
$org[$name] = implode(',',$org[$name]);

View File

@ -314,24 +314,27 @@ class socontacts
* Read all customfields of the given id's
*
* @param int/array $ids
* @param array $field_names=null custom fields to read, default all
* @return array id => name => value
*/
function read_customfields($ids)
function read_customfields($ids,$field_names=null)
{
if ($this->contact_repository == 'ldap')
{
return array(); // ldap does not support custom-fields (non-nummeric uid)
}
if (is_null($fields)) $fields = array_keys($this->customfields);
foreach($ids as $key => $id)
{
if (!(int)$id) unset($ids[$key]);
}
if (!$ids) return array(); // nothing to do, eg. all these contacts are in ldap
if (!$ids || !$field_names) return array(); // nothing to do, eg. all these contacts are in ldap
$fields = array();
foreach((array)$this->soextra->search(array(
$this->extra_id => $ids,
$this->extra_key => array_keys($this->customfields),
$this->extra_key => $field_names,
),false) as $data)
{
if ($data) $fields[$data[$this->extra_id]][$data[$this->extra_key]] = $data[$this->extra_value];