You are here

twitterfield.module in TwitterField 7

Same filename and directory in other branches
  1. 6 twitterfield.module

The Twitter Field Widget provides a custom field formatter to display Twitter Id's as Twitter Profile Widgets.

File

twitterfield.module
View source
<?php

/**
 * @file
 *   The Twitter Field Widget provides a custom field formatter to display
 *   Twitter Id's as Twitter Profile Widgets.
 */

/**
 * Implements hook_theme().
 */
function twitterfield_theme() {
  return array(
    'twitter_widget' => array(
      'variables' => array(
        'type' => NULL,
        'value' => NULL,
        'title' => NULL,
        'subject' => NULL,
      ),
      'template' => 'twitter-widget',
    ),
  );
}

/**
 * Implements hook_field_widget_info().
 */
function twitterfield_field_widget_info() {
  return array(
    'twitterfield' => array(
      'label' => t('TwitterField'),
      'field types' => array(
        'text',
      ),
      'settings' => array(
        'size' => 60,
        'allowed_types' => array(
          'username',
        ),
      ),
    ),
  );
}

/**
 * Implements hook_field_widget_settings_form().
 */
function twitterfield_field_widget_settings_form($field, $instance) {
  $widget = $instance['widget'];
  $settings = $widget['settings'];
  if ($widget['type'] == 'twitterfield') {
    $form['size'] = array(
      '#type' => 'textfield',
      '#title' => t('Size of textfield'),
      '#default_value' => $settings['size'],
      '#required' => TRUE,
      '#element_validate' => array(
        'element_validate_integer_positive',
      ),
    );
    $form['allowed_types'] = array(
      '#type' => 'checkboxes',
      '#title' => t('Allowed Types'),
      '#default_value' => $settings['allowed_types'],
      '#options' => array(
        'username' => t('Usernames (@username)'),
        'list' => t('Lists (@username/list)'),
        'hashtag' => t('Hashtags (#topic)'),
        'search' => t('Searches'),
      ),
      '#description' => t('Select which types of expressions can be stored in this field.'),
      '#element_validate' => array(
        '_twitterfield_field_widget_settings_allowed_types_validate',
      ),
    );
  }
  return $form;
}

/**
 * #element_validate function for widget settings form Allowed Types selection.
 */
function _twitterfield_field_widget_settings_allowed_types_validate($element, &$form_state) {
  if (!array_filter($element['#value'])) {
    form_set_error('allowed_types', t('You must select at least one type to allow.'));
  }
}

/**
 * Implements hook_field_widget_info().
 */
function twitterfield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
  switch ($instance['widget']['type']) {
    case 'twitterfield':
      $element['value'] = $element + array(
        '#type' => 'textfield',
        '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
        '#size' => $instance['widget']['settings']['size'],
        '#maxlength' => $field['settings']['max_length'],
        '#attributes' => array(
          'class' => array(
            'text-full',
          ),
        ),
        '#element_validate' => array(
          '_twitterfield_field_widget_validate',
        ),
      );
      break;
  }
  return $element;
}

/**
 * An #element_validate callback for the twitterfield field widget.
 */
function _twitterfield_field_widget_validate($element, &$form_state) {
  if (empty($element['#value'])) {
    return;
  }
  $instance = field_widget_instance($element, $form_state);
  $allowed_types = $instance['widget']['settings']['allowed_types'];
  $allowed_types_count = count(array_filter($allowed_types));
  $error = '';
  if ($allowed_types_count == 0) {

    // We must be on the settings page, checking the default value,
    // and the allowed types failed validation.
    return;
  }
  elseif ($allowed_types_count == 1) {
    if ($allowed_types['username'] && !twitterfield_is_username($element['#value'])) {
      $error = t('Only Usernames are allowed, and must be prepended with "@".');
    }
    elseif ($allowed_types['list'] && !twitterfield_is_list($element['#value'])) {
      $error = t('Only Lists are allowed, and must be in the format "@username/list".');
    }
    elseif ($allowed_types['hashtag'] && !twitterfield_is_hashtag($element['#value'])) {
      $error = t('Only Hashtags are allowed, and must be prepended with "#".');
    }
    elseif ($allowed_types['search'] && !twitterfield_is_search($element['#value'])) {
      $error = t('Only search strings are allowed.');
    }
  }
  else {
    if (!$allowed_types['username'] && twitterfield_is_username($element['#value'])) {
      $error = t('Usernames are not allowed.');
    }
    elseif (!$allowed_types['list'] && twitterfield_is_list($element['#value'])) {
      $error = t('Lists are not allowed.');
    }
    elseif (!$allowed_types['hashtag'] && twitterfield_is_hashtag($element['#value'])) {
      $error = t('Hashtags are not allowed.');
    }
    elseif (!$allowed_types['search'] && twitterfield_is_search($element['#value'])) {
      $error = t('Search strings are not allowed.');
    }
  }
  if ($error) {
    form_error($element, $error);
  }
}

/**
 * Implements hook_field_widget_error().
 */
function twitterfield_field_widget_error($element, $error, $form, &$form_state) {
  form_error($element['value'], $error['message']);
}

/**
 * Implements hook_field_formatter_info().
 */
function twitterfield_field_formatter_info() {
  $value = array(
    'twitterfield_twitter_link' => array(
      'label' => 'Twitter Link',
      'field types' => array(
        'text',
      ),
    ),
    'twitterfield_twitter_widget' => array(
      'label' => t('Twitter Widget'),
      'field types' => array(
        'text',
      ),
    ),
  );
  if (module_exists('twitter_pull')) {
    $value['twitterfield_twitter_pull'] = array(
      'label' => t('Twitter Pull'),
      'field types' => array(
        'text',
      ),
      'settings' => array(
        'items' => 5,
        'title' => '',
      ),
    );
  }
  return $value;
}

/**
 * Implements hook_field_formatter_settings_form().
 */
function twitterfield_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $element = array();
  if ($display['type'] == 'twitterfield_twitter_pull') {
    $element['items'] = array(
      '#title' => t('Items to display'),
      '#type' => 'textfield',
      '#size' => 5,
      '#default_value' => $settings['items'],
      '#element_validate' => array(
        'element_validate_integer_positive',
      ),
      '#required' => TRUE,
    );
    $element['title'] = array(
      '#title' => t('Override Title'),
      '#description' => t('Use %nonetoken to display no title, or leave blank to use the default title.', array(
        '%nonetoken' => '<none>',
      )),
      '#type' => 'textfield',
      '#size' => 20,
      '#default_value' => $settings['title'],
    );
  }
  return $element;
}

/**
 * Implements hook_field_formatter_settings_summary().
 */
function twitterfield_field_formatter_settings_summary($field, $instance, $view_mode) {
  $display = $instance['display'][$view_mode];
  $settings = $display['settings'];
  $summary = array();
  if ($display['type'] == 'twitterfield_twitter_pull') {
    $summary[] = t('Items to display') . ': ' . $settings['items'];
    $summary[] = t('Title') . ': ' . (empty($settings['title']) ? '<em>default</em>' : check_plain($settings['title']));
  }
  return implode('<br />', $summary);
}

/**
 * Implements hook_field_formatter_view().
 */
function twitterfield_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();
  switch ($display['type']) {
    case 'twitterfield_twitter_link':
      foreach ($items as $delta => $item) {
        if ($item['safe_value']) {
          $value = $item['safe_value'];
          if (twitterfield_is_username($value) || twitterfield_is_list($value)) {
            $url_part = substr($value, 1);
          }
          else {

            // hashtag or search string.
            $url_part = 'search?q=' . rawurlencode($value);
          }
          $element[$delta] = array(
            '#markup' => l($value, 'http://twitter.com/' . $url_part, array(
              'attributes' => array(
                'class' => 'twitterfield_twitter_link',
              ),
            )),
          );
        }
      }
      break;
    case 'twitterfield_twitter_widget':
      foreach ($items as $delta => $item) {
        if ($item['safe_value']) {
          $type = 'search';
          $value = $item['safe_value'];

          // Title and subject need to be escaped for insertion into javascript string.
          $title = NULL;
          $subject = addslashes($value);
          if (twitterfield_is_username($value)) {
            $type = 'profile';
            $value = substr($value, 1);
          }
          elseif (twitterfield_is_list($value)) {
            $type = 'list';
            $value = explode('/', substr($value, 1));
          }
          else {

            // Search expressions need to be escaped for insertion in javascript string.
            $value = addslashes($value);
          }
          $element[$delta] = array(
            '#markup' => theme('twitter_widget', array(
              'type' => $type,
              'value' => $value,
              'title' => $title,
              'subject' => $subject,
            )),
          );
        }
      }
      break;
    case 'twitterfield_twitter_pull':
      foreach ($items as $delta => $item) {
        if ($item['safe_value']) {
          $title = $item['safe_value'];
          if (!empty($display['settings']['title'])) {
            if ($display['settings']['title'] == '<none>') {
              $title = FALSE;
            }
            else {
              $title = $display['settings']['title'];
            }
          }
          $element[$delta] = array(
            '#markup' => twitter_pull_render($item['safe_value'], $title, $display['settings']['items']),
          );
        }
      }
      break;
  }
  return $element;
}

/**
 * Check if the given value is a twitter username.
 *
 * @param $value String to check.
 * @return boolean
 */
function twitterfield_is_username($value) {
  return preg_match('/^@[\\w]+$/', $value);
}

/**
 * Check if the given value is a twitter list.
 *
 * @param $value String to check.
 * @return boolean
 */
function twitterfield_is_list($value) {
  return preg_match('/^@[\\w]+\\/[\\w]+$/', $value);
}

/**
 * Check if the given value is a Hashtag.
 *
 * @param $value String to check.
 * @return boolean
 */
function twitterfield_is_hashtag($value) {
  return preg_match('/^#[\\w]+$/', $value);
}

/**
 * Check if the given value is a search phrase.
 *
 * @param $value String to check.
 * @return boolean
 */
function twitterfield_is_search($value) {
  return strpos($value, ' ') !== FALSE || !preg_match('/^[@#]/', $value);
}

Functions

Namesort descending Description
twitterfield_field_formatter_info Implements hook_field_formatter_info().
twitterfield_field_formatter_settings_form Implements hook_field_formatter_settings_form().
twitterfield_field_formatter_settings_summary Implements hook_field_formatter_settings_summary().
twitterfield_field_formatter_view Implements hook_field_formatter_view().
twitterfield_field_widget_error Implements hook_field_widget_error().
twitterfield_field_widget_form Implements hook_field_widget_info().
twitterfield_field_widget_info Implements hook_field_widget_info().
twitterfield_field_widget_settings_form Implements hook_field_widget_settings_form().
twitterfield_is_hashtag Check if the given value is a Hashtag.
twitterfield_is_list Check if the given value is a twitter list.
twitterfield_is_search Check if the given value is a search phrase.
twitterfield_is_username Check if the given value is a twitter username.
twitterfield_theme Implements hook_theme().
_twitterfield_field_widget_settings_allowed_types_validate #element_validate function for widget settings form Allowed Types selection.
_twitterfield_field_widget_validate An #element_validate callback for the twitterfield field widget.