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); list($name,$value) = explode(':',$part);
$org[$name] = $value; $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 (!$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 // create a statistic about the commonness of each fields values
$fields = array(); $fields = array();
foreach($contacts as $contact) foreach($contacts as $contact)
{ {
foreach($contact as $name => $value) foreach($contact as $name => $value)
{ {
if ($name != 'cat_id') $fields[$name][$value]++; if (!in_array($name,$csvs))
}
foreach(explode(',',$contact['cat_id']) as $part)
{ {
list($name) = explode(',',$part); $fields[$name][$value]++;
$fields['cat_id'][$name]++; }
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) 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"; //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 ($value && $num / (double) count($contacts) >= $this->org_common_factor)
{ {
if ($name != 'cat_id') if (!in_array($name,$csvs))
{ {
$org[$name] = $value; $org[$name] = $value;
} }
else else
{ {
$org[$name] = array(); $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]); $org[$name] = implode(',',$org[$name]);

View File

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