Създаване на Action за потребителски модул

Views bulk operations actions

Модула "Avatar selection" от DO ни дава възможност да имаме галерия от аватари от които новите потребители могат да избират изображения за свой аватар. Но ако искаме да го използваме и за масово задаване на аватари на вече съществуващи потребители, които нямат аватар? Модула има функционалност за задаване на случаен аватар при регистриране на нов потребител, но няма възможност масово да задаваме аватари на вече регистрирани такива.
Представете си колко добре би било да можем да направим списък на потребители с views и във views_bulk_operations да изберем "set random avatar" за този списък.

За целта ни трябва собствен Action, който да използваме с views_bulk_operations. Той изглежда така:

/**
 * Implements hook_action_info().
 */
function MY_MODULE_action_info() {
  return array(
    'set_user_random_avatar' => array(
      'type' => 'user',
      'label' => t('Avatar selection - set random avatar'),
      'configurable' => FALSE,
      'vbo_configurable' => FALSE,
      'triggers' => array('user_update'),
    ),
  );
}
 
/**
 * Generates settings form for set_user_random_avatar().
 *
 * @param array $context
 *   An array of options of this action (in case it is being edited)
 *
 * @return array
 *   Settings form as Form API array.
 */
function set_user_random_avatar_form($context) {
  $form['author'] = array(
    '#title' => t('Author name'),
    '#type' => 'textfield',
    '#description' => t('Set random avatar.'),
    '#default_value' => isset($context['author']) ? $context['author'] : '',
  );
 
  // Verify user permissions and provide an easier way to fill this field.
  if (user_access('access user profiles')) {
    $form['author']['#autocomplete_path'] = 'user/autocomplete';
  }
 
  return $form;
}
 
/**
 * Validates settings form for set_user_random_avatar().
 *
 * Verifies that user exists before continuing.
 */
function set_user_random_avatar_validate($form, $form_state) {
  if (!$account = user_load_by_name($form_state['values']['author'])) {
    form_set_error('author', t('Please, provide a valid username'));
  }
}
 
/**
 * Submit handler for set_user_random_avatar.
 *
 * Returns an associative array of values which will be available in the
 * $context when an action is executed.
 */
function set_user_random_avatar_submit($form, $form_state) {
  return array('author' => $form_state['values']['author']);
}
 
/**
 * Action function for set_user_random_avatar action.
 */
function set_user_random_avatar($account) {
  $picture_directory =  file_default_scheme() . '://' . variable_get('user_picture_path', 'pictures');
 
  // use default avatar_selection module to get random avatar
  $picture = avatar_selection_get_random_image($account);
  $info = image_get_info($picture->uri);
 
  // Prepare the pictures directory.
  file_prepare_directory($picture_directory, FILE_CREATE_DIRECTORY);
  $destination = file_stream_wrapper_uri_normalize($picture_directory . '/picture-' . $account->uid . '-' . REQUEST_TIME . '.' . $info['extension']);
 
  if ($picture) {
    $picture->status = 0;
    $picture = file_copy($picture, 'temporary://' . $picture->filename);
  }
 
  // Move the temporary file into the final location.
  if ($picture = file_move($picture, $destination, FILE_EXISTS_RENAME)) {
    $picture->status = FILE_STATUS_PERMANENT;
    $account->picture = file_save($picture);
    file_usage_add($picture, 'user', 'user', $account->uid);
 
    //save user info
    user_save($account);
  }
}
Category: