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

pobster’s picture

Title: Guidance with table aliases... » Guidance with table (and field) aliases...

I probably should point out that I first tried doing it more like this;

  $data['gamertags']['gamertag_steam'] = array(
    'table' => 'users',
    '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,
    ),
  );

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

merlinofchaos’s picture

Status: Active » Fixed

If 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.

pobster’s picture

Excellent, thank you!

Pobster

Status: Fixed » Closed (fixed)

Automatically closed -- issue fixed for 2 weeks with no activity.