Closed (fixed)
Project:
Views (for Drupal 7)
Version:
6.x-2.7
Component:
Code
Priority:
Normal
Category:
Support request
Assigned:
Unassigned
Reporter:
Created:
17 Nov 2009 at 11:27 UTC
Updated:
1 Dec 2009 at 22:00 UTC
I'm currently doing this but it doesn't feel ... right?
/**
* Implementation of hook_views_handlers().
*/
function gamertags_views_handlers() {
return array(
'info' => array(
'path' => drupal_get_path('module', 'gamertags') .'/plugins',
),
'handlers' => array(
'views_handler_field_user_gamertags' => array(
'parent' => 'views_handler_field',
'path' => drupal_get_path('module', 'gamertags') .'/plugins',
),
)
);
} // gamertags_views_handlers
/**
* Implementation of hook_views_data()
*/
function gamertags_views_data() {
$data['users']['gamertags'] = array(
'real field' => 'data',
'field' => array(
'title' => t('Gamertags'),
'help' => t("All the user's Gamertags."),
'handler' => 'views_handler_field_user_gamertags',
'click sortable' => FALSE,
),
);
$data['users']['gamertag_xbox'] = array(
'real field' => 'data',
'field' => array(
'title' => t('Xbox Gamertag'),
'help' => t("The user's Xbox Live Gamertag."),
'handler' => 'views_handler_field_user_gamertags',
'click sortable' => FALSE,
),
);
$data['users']['gamertag_psn'] = array(
'real field' => 'data',
'field' => array(
'title' => t('PSN Gamertag'),
'help' => t("The user's Playstation Network Gamertag."),
'handler' => 'views_handler_field_user_gamertags',
'click sortable' => FALSE,
),
);
$data['users']['gamertag_wii'] = array(
'real field' => 'data',
'field' => array(
'title' => t('Wii Friend Code'),
'help' => t("The user's Wii Friend Code."),
'handler' => 'views_handler_field_user_gamertags',
'click sortable' => FALSE,
),
);
$data['users']['gamertag_steam'] = array(
'real field' => 'data',
'field' => array(
'title' => t('Steam Gamercard'),
'help' => t("The user's Steam Gamertag."),
'handler' => 'views_handler_field_user_gamertags',
'click sortable' => FALSE,
),
);
return $data;
} // gamertags_views_data
Then the handler looks like this;
/**
* Field handler for Gamertags.
*/
class views_handler_field_user_gamertags extends views_handler_field {
function render($values) {
// Fake an account object.
$data = unserialize($values->users_data);
$account = new stdClass();
switch ($this->field) {
case 'gamertag_xbox':
$account->xbox_gamertag = $data['xbox_gamertag'];
break;
case 'gamertag_psn':
$account->psn_gamertag = $data['psn_gamertag'];
$account->psn_region = $data['psn_region'];
break;
case 'gamertag_wii':
$account->wii_gamertag = $data['wii_gamertag'];
break;
case 'gamertag_steam':
$account->steam_gamertag = $data['steam_gamertag'];
break;
case 'gamertags':
$account->xbox_gamertag = $data['xbox_gamertag'];
$account->psn_gamertag = $data['psn_gamertag'];
$account->psn_region = $data['psn_region'];
$account->wii_gamertag = $data['wii_gamertag'];
$account->steam_gamertag = $data['steam_gamertag'];
break;
}
return theme('gamertags_all', $account);
}
} // gamertags_views_handler_field_gamertags
I expected to be able to pass 'additional_fields' in through the construct and map them using $values->{$this->aliases['uid']}; I also didn't expect the query to be; users.data AS users_data I thought it would be users_data AS users_gamertag_psn??? I'm a bit puzzled and any help would be very much appreciated thank you.
Pobster
Comments
Comment #1
pobster commentedI probably should point out that I first tried doing it more like this;
But that wouldn't appear without defining a whole group. Seeing as this is just an extension to the user group, it didn't seem applicable?
edit: BTW, forget about the extra question regarding passing in additional_fields, I worked that out... User error...
edit #2: The module code can be found here; http://drupalcode.org/viewvc/drupal/contributions/modules/gamertags/?pat...
Pobster
Comment #2
merlinofchaos commentedIf you're adding aliases to an already existing table, you need to use hook_views_data_alter() and add your data to the users table.
I think the way you're doing it in the first seems more or less right, other than that. Your object just needs to define a query() method so it doesn't perform an ensure_my_field() -- and instead just do the add_additional_fields. See the base query() method on views_handler_field for what that does. You want it to do less.
You might take a glance at taxonomy.views.inc which adds fake fields to the 'node' object for taxonomy: all terms as well.
Comment #3
pobster commentedExcellent, thank you!
Pobster