You are here

instagram_feeds_moderation.module in Instagram Feeds 7

File

modules/instagram_feeds_moderation/instagram_feeds_moderation.module
View source
<?php

/**
 * @file
 * Code for the Instagram Feeds Moderation feature.
 */
include_once 'instagram_feeds_moderation.features.inc';

/**
 * Implements hook_proprocess_views_view_table().
 */
function instagram_feeds_moderation_preprocess_views_view_table(&$vars) {
  if ('instagram_feeds_moderation' == $vars['view']->name && 'admin_instagram_media_items' == $vars['view']->current_display) {
    foreach ($vars['view']->result as $id => $row) {
      if (isset($row->field_field_instf_blacklist_type[0]['raw']['value']) && 'black' == $row->field_field_instf_blacklist_type[0]['raw']['value']) {
        $vars['row_classes'][$id][] = 'blacklisted';
      }
    }
  }
}

/**
 * Implements hook_form_alter().
 */
function instagram_feeds_moderation_form_alter(&$form, &$form_state, $form_id) {
  switch ($form_id) {
    case 'taxonomy_form_term':

      // Hide Description field for Instagram Users terms.
      if (INSTAGRAM_FEEDS_USERS_VOCABULARY_NAME == $form['vocabulary_machine_name']['#value']) {
        $form['description']['#access'] = FALSE;
        $form['metatags']['#access'] = FALSE;
        $form['relations']['#access'] = FALSE;
        $form['redirect']['#access'] = FALSE;
        $form['field_instf_uid']['#access'] = FALSE;

        // Add needed stylesheet.
        $form['#attached']['css'][] = drupal_get_path('module', 'instagram_feeds_moderation') . '/css/instagram_feeds_moderation.css';
      }
      break;
    case 'views_exposed_form':
      if (isset($form_state['view']) && 'instagram_feeds_moderation' == $form_state['view']->name && 'admin_instagram_media_items' == $form_state['view']->current_display) {

        // Add a select form element for selecting Feed Name.
        $feeds_opts = instagram_feeds_moderation_get_feeds();
        $feeds_opts_t = array(
          'All' => t('- Any -'),
        );
        foreach ($feeds_opts as $key => $value) {
          $feeds_opts_t[$key] = t('!feedname', array(
            '!feedname' => $value,
          ));
        }
        $form['feed'] = array(
          '#type' => 'select',
          '#options' => $feeds_opts_t,
          '#default_value' => 'All',
        );
        array_unshift($form['#submit'], 'instagram_feeds_moderation_views_exposed_form_submit');
        $form['#info']['filter-feed'] = array(
          'value' => 'feed',
          'label' => t('Feed Name'),
        );

        // Add a select form element for selecting Image Moderation Status.
        $mode_options = array(
          'published' => t('Published'),
          'flagged' => t('Flagged'),
          'archived' => t('Archived'),
          'blocked' => t('Blocked'),
        );
        $form['node_status']['#value'] = '';
        $form['node_status']['#type'] = 'value';
        $form['flagged']['#value'] = '';
        $form['flagged']['#type'] = 'value';
        $form['archived']['#value'] = '';
        $form['archived']['#type'] = 'value';
        $def_status = 'All';
        if (NODE_NOT_PUBLISHED === $form['node_status']['#default_value']) {
          $def_status = 'blocked';
          $form['node_status']['#value'] = FALSE;
        }
        elseif (1 == $form['archived']['#default_value']) {
          $def_status = 'archived';
          $form['archived']['#value'] = 1;
        }
        elseif (1 == $form['flagged']['#default_value']) {
          $def_status = 'flagged';
          $form['flagged']['#value'] = 1;
        }
        elseif ($form['node_status']['#default_value']) {
          $def_status = 'published';
        }
        unset($form['node_status']['#default_value'], $form['flagged']['#default_value'], $form['archived']['#default_value']);
        $form['mod_status'] = array(
          '#type' => 'select',
          '#options' => $mode_options,
          '#options' => array(
            'All' => t('- Any -'),
          ) + $mode_options,
          '#default_value' => $def_status,
        );
        $form['#info']['filter-mod_status']['value'] = 'mod_status';
        $form['#info']['filter-mod_status']['label'] = $form['#info']['filter-status']['label'];
        unset($form['#info']['filter-status'], $form['#info']['filter-flagged'], $form['#info']['filter-flagged_1']);
        $input_block = array(
          'filter-input_block' => array(
            'value' => 'input_block',
          ),
        );
        $form['#info'] = array_merge($input_block, $form['#info']);
        $form['input_block'] = array(
          '#type' => 'container',
          '#attributes' => array(
            'class' => array(
              'field-under-fields',
            ),
          ),
          '#weight' => -10,
        );
        $form['user']['#title'] = $form['#info']['filter-field_instf_user_tid']['label'];
        $form['input_block']['user'] = $form['user'];
        unset($form['user'], $form['#info']['filter-field_instf_user_tid']);
        $form['tag']['#title'] = $form['#info']['filter-field_instf_hash_tags_tid']['label'];
        $form['input_block']['tag'] = $form['tag'];
        unset($form['tag'], $form['#info']['filter-field_instf_hash_tags_tid']);
        $form['date']['min']['#title_display'] = $form['date']['max']['#title_display'] = 'invisible';

        // Filter images by Feed name.
        if (isset($form_state['view']->exposed_input['feed']) && is_numeric($form_state['view']->exposed_input['feed'])) {
          $form['input_block']['user']['#value'] = implode(',', instagram_feeds_moderation_get_usernames($form_state['view']->exposed_input['feed']));
          $form['input_block']['tag']['#value'] = implode(',', instagram_feeds_moderation_get_tagnames($form_state['view']->exposed_input['feed']));
        }
      }
      break;
    case 'views_form_instagram_feeds_moderation_admin_instagram_media_items':
      if (!isset($form['confirm']['#value']) || !$form['confirm']['#value']) {

        // Add needed stylesheet.
        $form['#attached']['css'][] = drupal_get_path('module', 'instagram_feeds_moderation') . '/css/instagram_feeds_moderation.css';
        $form['#attached']['js'][] = drupal_get_path('module', 'instagram_feeds_moderation') . '/js/instagram-items-moderation.js';
        $form['select']['#collapsible'] = FALSE;
      }
      break;
    case 'views_form_instagram_feeds_moderation_admin_instagram_feeds':
      if (!isset($form['confirm']['#value']) || !$form['confirm']['#value']) {
        $form['select']['#collapsible'] = FALSE;
        $form['select']['add_feed'] = array(
          '#type' => 'item',
          '#markup' => l(t('Add Feed'), 'node/add/' . str_replace('_', '-', INSTAGRAM_FEEDS_SETTINGS_NODE_TYPE), array(
            'attributes' => array(
              'class' => array(
                'button',
              ),
            ),
            'query' => drupal_get_destination(),
          )),
          '#weight' => -1,
        );
        $form['#attached']['css'][] = drupal_get_path('module', 'instagram_feeds_moderation') . '/css/instagram_feeds_moderation.css';
        $form['#attached']['js'][] = drupal_get_path('module', 'instagram_feeds_moderation') . '/js/instagram-items-moderation.js';
      }
      break;
    case 'instagram_feed_node_form':
      if (!empty($form['nid']['#value'])) {
        $form['actions']['manage_images'] = array(
          '#type' => 'submit',
          '#value' => t('Manage Images'),
          '#weight' => 1,
          '#submit' => array(
            'instagram_feeds_moderation_node_form_submit',
          ),
        );
      }
      break;
  }
}

/**
 * Custom form submission handler for views_exposed_form().
 */
function instagram_feeds_moderation_views_exposed_form_submit($form, &$form_state) {

  // Filter images by Moderation Status.
  switch ($form_state['values']['mod_status']) {
    case 'published':
      $form_state['values']['archived'] = FALSE;
      $form_state['values']['flagged'] = FALSE;
      $form_state['values']['node_status'] = NODE_PUBLISHED;
      break;
    case 'blocked':
      $form_state['values']['node_status'] = FALSE;
      break;
    case 'archived':
      $form_state['values']['archived'] = 1;
      $form_state['values']['flagged'] = FALSE;
      break;
    case 'flagged':
      $form_state['values']['flagged'] = 1;
      break;
  }
}

/**
 * Custom node form submit function.
 *
 * Save Instagram feed node and redirect to image managment page.
 */
function instagram_feeds_moderation_node_form_submit($form, &$form_state) {
  $node = node_form_submit_build_node($form, $form_state);
  node_save($node);
  $node_link = l(t('view'), 'node/' . $node->nid);
  $watchdog_args = array(
    '@type' => $node->type,
    '%title' => $node->title,
  );
  $t_args = array(
    '@type' => node_type_get_name($node),
    '%title' => $node->title,
  );
  watchdog('content', '@type: updated %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
  drupal_set_message(t('@type %title has been updated.', $t_args));

  // Clear the page and block caches.
  cache_clear_all();
  if (isset($_GET['destination'])) {
    unset($_GET['destination']);
  }
  $form_state['redirect'] = array(
    'admin/content/instagram/media',
    array(
      'query' => array(
        'feed' => $node->nid,
      ),
    ),
  );
}

/**
 * Implements hook_action_info().
 *
 * Create custom action for Instagram images moderation page
 * that flagged images as 'moderated' (archived).
 */
function instagram_feeds_moderation_action_info() {
  return array(
    'instagram_feeds_moderation_flag_archive' => array(
      'type' => 'node',
      'label' => t('Archive images'),
      'configurable' => FALSE,
      'behavior' => array(
        'changes_property',
      ),
    ),
    'instagram_feeds_moderation_flag_block' => array(
      'type' => 'node',
      'label' => t('Block images'),
      'configurable' => FALSE,
      'behavior' => array(
        'changes_property',
      ),
    ),
  );
}

/**
 * Flags an image as 'archived' (moderated).
 *
 * @ingroup actions
 */
function instagram_feeds_moderation_flag_archive($node) {
  if (NODE_PUBLISHED != $node->status) {
    $node->status = NODE_PUBLISHED;
    node_save($node);
  }
  $flag = flag_load('image_archived');
  if ($flag && !$flag
    ->is_flagged($node->nid)) {
    $flag
      ->flag('flag', $node->nid, NULL, TRUE);
  }
  $flag2 = flag_load('flag_as_inappropriate');
  if ($flag2 && $flag2
    ->is_flagged($node->nid)) {
    $flag2
      ->flag('unflag', $node->nid, NULL, TRUE);
  }
}

/**
 * Flags an image as 'blocked' (moderated).
 *
 * @ingroup actions
 */
function instagram_feeds_moderation_flag_block($node) {
  if (NODE_PUBLISHED == $node->status) {
    $node->status = NODE_NOT_PUBLISHED;
    node_save($node);
  }
  $flag = flag_load('image_archived');
  if ($flag && $flag
    ->is_flagged($node->nid)) {
    $flag
      ->flag('unflag', $node->nid, NULL, TRUE);
  }
  $flag2 = flag_load('flag_as_inappropriate');
  if ($flag2 && $flag2
    ->is_flagged($node->nid)) {
    $flag2
      ->flag('unflag', $node->nid, NULL, TRUE);
  }
}

/**
 * Implements hook_views_pre_render().
 */
function instagram_feeds_moderation_views_pre_render(&$view) {
  if ('instagram_feeds_moderation' == $view->name && 'admin_instagram_media_items' == $view->current_display) {
    $destination = drupal_get_destination();
    $view->display_handler->handlers['field']['field_instf_blacklist_type']->options['alter']['path'] .= '?destination=' . urlencode($destination['destination']);
  }
}

/**
 * Implements hook_views_pre_view().
 */
function instagram_feeds_moderation_views_pre_view(&$view) {
  if ('instagram_feeds_moderation' == $view->name && 'admin_instagram_media_items' == $view->current_display) {
    if (isset($_GET['feed']) && 'All' != $_GET['feed']) {
      $node = node_load($_GET['feed']);
      if (isset($node->type) && INSTAGRAM_FEEDS_SETTINGS_NODE_TYPE == $node->type) {
        $destination = drupal_get_destination();
        $import_button = l(t('Import Items'), 'node/' . $_GET['feed'] . '/import', array(
          'query' => $destination,
          'attributes' => array(
            'class' => array(
              'button',
            ),
          ),
        ));
        $view->display_handler->options['empty']['area']['content'] .= ' ' . $import_button;
      }
    }
  }
}

/**
 * Implements hook_preprocess_views_view_field().
 */
function instagram_feeds_moderation_preprocess_views_view_field(&$vars) {
  if ('instagram_feeds_moderation' == $vars['view']->name && 'admin_instagram_media_items' == $vars['view']->current_display) {
    switch ($vars['field']->field) {
      case 'nothing':
        $conditions = array(
          'tags' => array(),
          'users' => array(),
        );
        if (isset($vars['row']->_field_data['nid']['entity']->field_instf_hash_tags[LANGUAGE_NONE])) {
          foreach ($vars['row']->_field_data['nid']['entity']->field_instf_hash_tags[LANGUAGE_NONE] as $tid) {
            $conditions['tags'][] = $tid['tid'];
          }
        }
        if (isset($vars['row']->_field_data['nid']['entity']->field_instf_user[LANGUAGE_NONE])) {
          foreach ($vars['row']->_field_data['nid']['entity']->field_instf_user[LANGUAGE_NONE] as $tid) {
            $conditions['users'][] = $tid['tid'];
          }
        }
        $instagram_feeds = instagram_feeds_moderation_get_feeds($conditions);
        $vars['output'] = implode('<br />', $instagram_feeds);
        break;
      case 'status':
        if (!$vars['row']->node_status) {
          $vars['output'] = t('Blocked');
        }
        elseif (!empty($vars['row']->flag_content_node_timestamp) || !empty($vars['row']->flagging_node_timestamp)) {
          $vars['output'] = '<strong>' . t('Flagged') . '</strong>';
        }
        elseif (!empty($vars['row']->flag_content_node_1_timestamp) || !empty($vars['row']->flagging_node_1_timestamp)) {
          $vars['output'] = t('Archived');
        }
        break;
      case 'field_instf_image_url':
        $vars['field']->last_render = '<img src="' . $vars['field']->original_value . '" alt="" onerror="this.src=\'/' . drupal_get_path('module', 'instagram_feeds') . '/images/image_removed.svg\'" />';
        if ('field_instf_image_url_1' == $vars['field']->options['id']) {
          $vars['field']->last_render .= '<div class="hover">' . $vars['field']->last_tokens['[body]'] . '</div>';
        }
        break;
    }
  }
}

/**
 * Returns an associative array of instagram feeds for specified tags and users.
 *
 * @param array $conditions
 *   Associative array that contains 'tags' and 'users' arrays of term ids.
 *
 * @return array()
 *   Associative array with nids in keys and node titles in values according
 *   to input conditions or empty array, all list of nids and titles if
 *   conditions are not defined.
 */
function instagram_feeds_moderation_get_feeds($conditions = array(
  'tags' => array(),
  'users' => array(),
)) {
  $feeds_list =& drupal_static(__FUNCTION__);
  $feeds_list_all =& drupal_static(__FUNCTION__ . '_all');
  $result = array();
  if (!isset($feeds_list)) {
    $feeds_list = array();
    $feeds_list_all = array();
    $query_result = _instagram_feeds_moderation_get_feeds_query();
    foreach ($query_result as $node) {
      $feeds_list_all[$node->nid] = $node->title;
      if (!count(explode(',', $node->user_tids))) {
        foreach (explode(',', $node->tag_tids) as $tid) {
          $feeds_list[$tid . '__'][$node->nid] = $node->title;
        }
      }
      elseif (!count(explode(',', $node->tag_tids))) {
        foreach (explode(',', $node->user_tids) as $tid) {
          $feeds_list['__' . $tid][$node->nid] = $node->title;
        }
      }
      else {
        foreach (explode(',', $node->tag_tids) as $tid) {
          foreach (explode(',', $node->user_tids) as $utid) {
            $feeds_list[$tid . '__' . $utid][$node->nid] = $node->title;
          }
        }
      }
    }
    asort($feeds_list_all);
  }

  // If conditions are empty, return a list of all Instagram feeds.
  if (!count($conditions['tags']) && !count($conditions['users'])) {
    return $feeds_list_all;
  }
  if (count($conditions['tags'])) {
    foreach ($conditions['tags'] as $tid) {
      if (isset($feeds_list[$tid . '__'])) {
        $result += $feeds_list[$tid . '__'];
      }
    }
  }
  if (count($conditions['users'])) {
    foreach ($conditions['users'] as $tid) {
      if (isset($feeds_list['__' . $tid])) {
        $result += $feeds_list['__' . $tid];
      }
    }
  }
  if (count($conditions['tags']) && count($conditions['users'])) {
    foreach ($conditions['tags'] as $tid) {
      foreach ($conditions['users'] as $utid) {
        if (isset($feeds_list[$tid . '__' . $utid])) {
          $result += $feeds_list[$tid . '__' . $utid];
        }
      }
    }
  }
  asort($result);
  return $result;
}

/**
 * Helper function for finding all instagram feeds and their terms.
 *
 * @return array
 *   array of objects that contain feed nid, feed name, user_tids and tag_tids.
 */
function _instagram_feeds_moderation_get_feeds_query() {
  $result =& drupal_static(__FUNCTION__);
  if (!isset($result)) {
    $result = array();
    $q = db_select('node', 'n')
      ->fields('n', array(
      'nid',
      'title',
    ));
    $q
      ->leftJoin('field_data_field_instf_hash_tags', 'tags', 'n.nid = tags.entity_id');
    $q
      ->leftJoin('field_data_field_instf_user', 'users', 'n.nid = users.entity_id');
    $q
      ->leftJoin('taxonomy_term_data', 'term', 'tags.field_instf_hash_tags_tid = term.tid');
    $q
      ->leftJoin('taxonomy_term_data', 'uterm', 'users.field_instf_user_tid = uterm.tid');
    $q
      ->addExpression("GROUP_CONCAT(tags.field_instf_hash_tags_tid ORDER BY tags.field_instf_hash_tags_tid)", 'tag_tids');
    $q
      ->addExpression("GROUP_CONCAT(term.name ORDER BY term.tid)", 'tag_names');
    $q
      ->addExpression("GROUP_CONCAT(users.field_instf_user_tid ORDER BY users.field_instf_user_tid)", 'user_tids');
    $q
      ->addExpression("GROUP_CONCAT(uterm.name ORDER BY uterm.tid)", 'user_names');
    $q
      ->condition('n.type', INSTAGRAM_FEEDS_SETTINGS_NODE_TYPE);
    $q
      ->groupBy('n.nid');
    $q
      ->orderBy('n.title');
    $result = $q
      ->execute()
      ->fetchAllAssoc('nid');
  }
  return $result;
}

/**
 * Returns array of users for a specyfied Instagram Feed.
 *
 * @param string $nid
 *   Instagram Feeed's Node id.
 *
 * @return array
 *   An array where keys are user tids and values are user names.
 */
function instagram_feeds_moderation_get_usernames($nid = NULL) {
  $result = array();
  $query_result = _instagram_feeds_moderation_get_feeds_query();
  if (isset($query_result[$nid]) && !empty($query_result[$nid]->user_tids)) {
    $node = $query_result[$nid];
    $result = array_combine(explode(',', $node->user_tids), explode(',', $node->user_names));
  }
  return $result;
}

/**
 * Returns array of hash tags for a specyfied Instagram Feed.
 *
 * @param string $nid
 *   Instagram Feeed's Node id
 *
 * @return array
 *   An array where keys are hash tag tids and values are hash tag names.
 */
function instagram_feeds_moderation_get_tagnames($nid = NULL) {
  $result = array();
  $query_result = _instagram_feeds_moderation_get_feeds_query();
  if (isset($query_result[$nid]) && !empty($query_result[$nid]->tag_tids)) {
    $node = $query_result[$nid];
    $result = array_combine(explode(',', $node->tag_tids), explode(',', $node->tag_names));
  }
  return $result;
}

/**
 * Implements hook_flag().
 *
 * Publish or unpublish node if user flags / unflags image as inappropriate.
 */
function instagram_feeds_moderation_flag($op, $flag, $content_id, $account, $fcid) {
  if ('image_archived' == $flag->name && 'flag' == $op) {
    $inappropriate = flag_load('flag_as_inappropriate');
    if ($inappropriate && $inappropriate
      ->is_flagged($content_id)) {
      $inappropriate
        ->flag('unflag', $content_id, $account, TRUE);
    }
  }
}

/**
 * Implements hook_views_bulk_operations_form_alter().
 */
function instagram_feeds_moderation_views_bulk_operations_form_alter(&$form, &$form_state, $vbo) {
  if ($form_state['step'] == 'views_form_views_form') {
    switch ($form['form_id']['#value']) {
      case 'views_form_instagram_feeds_moderation_admin_instagram_media_items':
        if (!isset($form['confirm']['#value']) || !$form['confirm']['#value']) {

          // Add needed stylesheet.
          $form['#attached']['css'][] = drupal_get_path('module', 'instagram_feeds_moderation') . '/css/instagram_feeds_moderation.css';
          $form['select']['#collapsible'] = FALSE;
        }
        break;
      case 'views_form_instagram_feeds_moderation_admin_instagram_feeds':
        if (!isset($form['confirm']['#value']) || !$form['confirm']['#value']) {
          $form['select']['#collapsible'] = FALSE;
          $form['select']['add_feed'] = array(
            '#type' => 'item',
            '#markup' => l(t('Add Feed'), 'node/add/' . str_replace('_', '-', INSTAGRAM_FEEDS_SETTINGS_NODE_TYPE), array(
              'attributes' => array(
                'class' => array(
                  'button',
                ),
              ),
              'query' => drupal_get_destination(),
            )),
            '#weight' => -1,
          );
          $form['#attached']['css'][] = drupal_get_path('module', 'instagram_feeds_moderation') . '/css/instagram_feeds_moderation.css';
        }
        break;
    }
  }
}

Functions

Namesort descending Description
instagram_feeds_moderation_action_info Implements hook_action_info().
instagram_feeds_moderation_flag Implements hook_flag().
instagram_feeds_moderation_flag_archive Flags an image as 'archived' (moderated).
instagram_feeds_moderation_flag_block Flags an image as 'blocked' (moderated).
instagram_feeds_moderation_form_alter Implements hook_form_alter().
instagram_feeds_moderation_get_feeds Returns an associative array of instagram feeds for specified tags and users.
instagram_feeds_moderation_get_tagnames Returns array of hash tags for a specyfied Instagram Feed.
instagram_feeds_moderation_get_usernames Returns array of users for a specyfied Instagram Feed.
instagram_feeds_moderation_node_form_submit Custom node form submit function.
instagram_feeds_moderation_preprocess_views_view_field Implements hook_preprocess_views_view_field().
instagram_feeds_moderation_preprocess_views_view_table Implements hook_proprocess_views_view_table().
instagram_feeds_moderation_views_bulk_operations_form_alter Implements hook_views_bulk_operations_form_alter().
instagram_feeds_moderation_views_exposed_form_submit Custom form submission handler for views_exposed_form().
instagram_feeds_moderation_views_pre_render Implements hook_views_pre_render().
instagram_feeds_moderation_views_pre_view Implements hook_views_pre_view().
_instagram_feeds_moderation_get_feeds_query Helper function for finding all instagram feeds and their terms.