View source
<?php
function profile_views_tables() {
$profile_fields = profile_views_get_fields();
foreach ($profile_fields as $field) {
$tables["{$field->name}"] = views_new_table('profile_values', 'internal', 'users', 'uid', 'uid', array(
'fid' => $field->fid,
));
profile_views_add_field($tables["{$field->name}"], $field);
profile_views_add_sort($tables["{$field->name}"], $field);
profile_views_add_filter($tables["{$field->name}"], $field);
}
return $tables;
}
function profile_views_arguments() {
}
function profile_views_default_views() {
}
function profile_views_get_fields() {
$fields = array();
$results = db_query("SELECT * FROM {profile_fields} ORDER BY category, weight");
while ($row = db_fetch_object($results)) {
if (user_access('administer users') || $row->visibility != PROFILE_PRIVATE) {
if (!empty($row->options)) {
if (unserialize($row->options) == false) {
$options = $row->options;
unset($row->options);
$row->options['selection'] = $options;
}
else {
$row->options = unserialize($row->options);
}
}
$fields[] = $row;
}
}
return $fields;
}
function profile_views_add_field(&$table, $field) {
$name = 'value';
$label = t('Profile: @field-name', array(
'@field-name' => $field->title,
));
switch ($field->type) {
case 'vocabulary':
$help = t('This will display all options of the profile field %field-name. ', array(
'%field-name' => $field->title,
));
$others = array(
'sortable' => true,
'handler' => 'views_handler_field_profile_vocabulary',
);
break;
case 'selection':
$help = t('This will display all options of the profile field %field-name. ', array(
'%field-name' => $field->title,
));
$others = array(
'sortable' => true,
'handler' => 'views_handler_field_profile_selection',
);
break;
case 'date':
$help = t('Display the date of the %field-name field.', array(
'%field-name' => $field->title,
));
$others = array(
'sortable' => false,
'handler' => 'views_handler_field_profile_date',
);
break;
case 'checkbox':
$help = t('Checkbox based profile field help');
$others = array(
'sortable' => true,
'handler' => 'views_handler_field_profile_checkbox',
);
break;
case 'textarea':
$help = t('Other types based profile field help');
$others = array(
'sortable' => true,
'handler' => 'views_handler_field_profile_textarea',
);
break;
default:
$help = t('Other types based profile field help');
$others = array(
'sortable' => true,
'handler' => 'views_handler_field_profile_default',
);
}
views_table_add_field($table, $name, $label, $help, $others);
}
function profile_views_add_sort(&$table, $field) {
$name = 'value';
$label = t('Profile: @field-name', array(
'@field-name' => $field->title,
));
$others = array();
switch ($field->type) {
case 'vocabulary':
$help = t('This allows you to sort by vocabulary terms');
break;
case 'selection':
$help = t('This allows you to sort by selection options');
break;
case 'date':
$other = array(
'handler' => 'views_handler_sort_profile_date',
);
$help = t('This allows you to sort by date');
break;
case 'checkbox':
$help = t('This allows you to sort yes/no');
break;
default:
$help = '';
}
views_table_add_sort($table, $name, $label, $help, $others);
}
function profile_views_add_filter(&$table, $field) {
$name = 'value';
$label = t('Profile: @field-name', array(
'@field-name' => $field->title,
));
switch ($field->type) {
case 'vocabulary':
$help = t('Taxonomy based profile field help');
$others = array(
'list' => 'views_handler_filter_tid_by_voc',
'value-type' => 'array',
'option' => 'string',
'operator' => 'views_handler_operator_andor',
'handler' => 'views_handler_filter_profile_andor',
'vocabulary' => $field->options['vocabulary'],
);
break;
case 'selection':
$help = t('Selection based profile field help');
$others = array(
'list' => 'views_handler_filter_profile_selection',
'operator' => 'views_handler_operator_andor',
'options' => $field->options['selection'],
'handler' => 'views_handler_filter_profile_andor',
);
break;
case 'date':
$help = t('This filter allows nodes to be filtered by their creation date.') . ' ' . views_t_strings('filter date');
$others = array(
'operator' => 'views_handler_operator_gtlt',
'value' => views_handler_filter_profile_date_value_form(),
'handler' => 'views_handler_filter_profile_date',
'value-type' => 'array',
'fid' => $field->fid,
);
break;
case 'checkbox':
$help = t('Checkbox based profile field help');
$others = array(
'operator' => array(
'=' => 'Equals',
),
'list' => 'views_handler_operator_yesno',
);
break;
default:
$help = t('Other types based profile field help');
$others = array(
'list-type' => 'list',
'operator' => 'views_handler_operator_like',
'handler' => 'views_handler_filter_like',
);
}
views_table_add_filter($table, $name, $label, $help, $others);
}
function views_handler_field_email($fieldinfo, $fielddata, $value, $data) {
return l($value, 'mailto:' . $value);
}
function views_handler_field_profile_vocabulary($fieldinfo, $fielddata, $value, $data) {
return _profile_field_vocabulary_getlist(unserialize($value), 'taxonomy/term/');
}
function views_handler_field_profile_selection($fieldinfo, $fielddata, $value, $data) {
$value = unserialize($value) === false ? $value : unserialize($value);
if (!is_array($value)) {
$value = array(
$value,
);
}
return check_plain(implode(', ', $value));
}
function views_handler_field_profile_textarea($fieldinfo, $fielddata, $value, $data) {
$value = unserialize($value) === false ? $value : unserialize($value);
return check_markup($value);
}
function views_handler_field_profile_default($fieldinfo, $fielddata, $value, $data) {
$value = unserialize($value) === false ? $value : unserialize($value);
return check_plain($value);
}
function views_handler_field_profile_checkbox($fieldinfo, $fielddata, $value, $data) {
$value = unserialize($value) === false ? $value : unserialize($value);
return check_plain($value) == '0' ? '✗' : '✓';
}
function views_handler_field_profile_date($fieldinfo, $fielddata, $value, $data) {
$format = substr(variable_get('date_format_short', 'm/d/Y - H:i'), 0, 5);
$value = unserialize($value);
$replace = array(
'd' => sprintf('%02d', $value['day']),
'j' => $value['day'],
'm' => sprintf('%02d', $value['month']),
'M' => map_month($value['month']),
'Y' => $value['year'],
'H:i' => null,
'g:ia' => null,
);
return strtr($format, $replace);
}
function views_handler_sort_profile_date($action, &$query, $sortinfo, $sort) {
}
function views_handler_filter_profile_selection($op, $filter) {
$options = array();
foreach (explode("\r", check_plain($filter['options'])) as $option) {
$options[trim($option)] = trim($option);
}
return $options;
}
function views_handler_filter_profile_date($op, $filter, &$filterinfo, &$query) {
if (empty($filter['value'])) {
return;
}
if (is_array($filter['value'])) {
$value = mktime(0, 0, 0, $filter['value']['month'], $filter['value']['day'], $filter['value']['year']);
}
else {
$value = $filter['value'] == 'now' ? time() : strtotime($filter['value']);
}
$users = array();
$results = db_query("SELECT uid, value FROM {profile_values} WHERE fid = %d", $filterinfo['fid']);
while ($profile = db_fetch_object($results)) {
$date = unserialize($profile->value);
$time = mktime(0, 0, 0, $date['month'], $date['day'], $date['year']);
switch ($filter['operator']) {
case '>':
if ($time > $value) {
$users[] = $profile->uid;
}
break;
case '>=':
if ($time >= $value) {
$users[] = $profile->uid;
}
break;
case '=':
if ($time == $value) {
$users[] = $profile->uid;
}
break;
case '!=':
if ($time != $value) {
$users[] = $profile->uid;
}
break;
case '<=':
if ($time <= $value) {
$users[] = $profile->uid;
}
break;
case '<':
if ($time < $value) {
$users[] = $profile->uid;
}
break;
}
}
if (empty($users)) {
$users[] = 'NULL';
}
if (checkdate($filter['value']['month'], $filter['value']['day'], $filter['value']['year'])) {
$query
->ensure_table('users');
$query
->add_where('users.uid IN(' . implode(', ', $users) . ')');
}
}
function views_handler_filter_profile_andor($op, $filter, $filterinfo, &$query) {
if (empty($filter['value'])) {
return;
}
switch ($op) {
case 'handler':
$table = $filterinfo['table'];
$column = $filterinfo['field'];
if (empty($column)) {
$fieldbits = explode('.', $filter['field']);
$column = $fieldbits[1];
}
$field = "{$table}.{$column}";
$query
->ensure_table($table);
$where = array();
$args = array();
$operator = $filter['operator'] == 'NOR' ? 'NOT LIKE' : 'LIKE';
if (!is_array($filter['value'])) {
$filter['value'] = array(
$filter['value'],
);
}
foreach ($filter['value'] as $value) {
$where[] = "%s {$operator} '%s'";
$args[] = $field;
$args[] = $value;
}
$operator = $filter['operator'] == 'NOR' ? 'AND' : $filter['operator'];
$where = implode(" {$operator} ", $where);
$query
->add_where("{$where}", $args);
break;
}
}
function views_handler_filter_profile_date_value_form() {
$form['#tree'] = true;
$form['day'] = array(
'#prefix' => '<div class="container-inline">',
'#type' => 'select',
'#options' => array(
'0' => '--',
) + drupal_map_assoc(range(1, 31)),
);
$form['month'] = array(
'#type' => 'select',
'#options' => array(
'0' => '--',
) + drupal_map_assoc(range(1, 12), 'map_month'),
);
$form['year'] = array(
'#type' => 'select',
'#options' => array(
'0' => '--',
) + drupal_map_assoc(range(2006, 2050)),
'#suffix' => '</div>',
);
$form['#after_build'] = array(
'views_handler_filter_profile_after_build',
);
return $form;
}
function views_handler_filter_profile_after_build($form_element) {
$form_element['year']['#name'] = $form_element['#name'] . '[year]';
$form_element['month']['#name'] = $form_element['#name'] . '[month]';
$form_element['day']['#name'] = $form_element['#name'] . '[day]';
$form_element['year']['#value'] = $form_element['#default_value']['year'];
$form_element['month']['#value'] = $form_element['#default_value']['month'];
$form_element['day']['#value'] = $form_element['#default_value']['day'];
return $form_element;
}