Beispiel #1
0
 /**
  * Update votes in database from API response.
  */
 public function updateVotes($response)
 {
     $votes = array();
     if (!empty($response['response']['items'])) {
         foreach ($response['response']['items'] as $item) {
             $entity_type = '';
             $entity_id = '';
             $field_id = '';
             $field_index = 0;
             // Parse identifier.
             if (strstr($item['identifier'], '_field_')) {
                 // Item is a field.
                 preg_match("/^(.*)_(\\d+)_field_(\\d+)(?:_index_(\\d+))?\$/", $item['identifier'], $identifier_parts);
                 if (!empty($identifier_parts[1])) {
                     $entity_type = $identifier_parts[1];
                 } else {
                     continue;
                 }
                 if (!empty($identifier_parts[2])) {
                     $entity_id = $identifier_parts[2];
                 } else {
                     continue;
                 }
                 if (!empty($identifier_parts[3])) {
                     $field_id = $identifier_parts[3];
                 } else {
                     continue;
                 }
                 if (!empty($identifier_parts[4])) {
                     $field_index = $identifier_parts[4];
                 }
             } else {
                 // Item is an entity.
                 preg_match("/^(.*)_(\\d+)\$/", $item['identifier'], $identifier_parts);
                 if (!empty($identifier_parts[1])) {
                     $entity_type = $identifier_parts[1];
                 } else {
                     continue;
                 }
                 if (!empty($identifier_parts[2])) {
                     $entity_id = $identifier_parts[2];
                 } else {
                     continue;
                 }
             }
             $vote_source = LIKEBTN_VOTING_VOTE_SOURCE;
             if ($field_id) {
                 $vote_source = 'field_' . $field_id . '_index_' . $field_index;
             }
             $likes = 0;
             if (!empty($item['likes'])) {
                 $likes = $item['likes'];
             }
             $dislikes = 0;
             if (!empty($item['dislikes'])) {
                 $dislikes = $item['dislikes'];
             }
             // If vote for this entity/field has been already stored - continue.
             foreach ($votes as $vote) {
                 if ($vote['entity_type'] == $entity_type && $vote['entity_id'] == $entity_id && $vote['vote_source'] == $vote_source) {
                     continue 2;
                 }
             }
             // Get entity info.
             try {
                 $entity_type_info = entity_get_info($entity_type);
                 if (empty($entity_type_info['controller class'])) {
                     continue;
                 }
             } catch (Exception $e) {
                 continue;
             }
             // Likes and Disliked stored in Voting API.
             $votes[] = array('entity_type' => $entity_type, 'entity_id' => $entity_id, 'value_type' => 'points', 'value' => $likes, 'tag' => LIKEBTN_VOTING_TAG, 'uid' => 0, 'vote_source' => $vote_source);
             $votes[] = array('entity_type' => $entity_type, 'entity_id' => $entity_id, 'value_type' => 'points', 'value' => $dislikes * -1, 'tag' => LIKEBTN_VOTING_TAG, 'uid' => 0, 'vote_source' => $vote_source);
             // Remove (backup) votes cast on this entity by other modules.
             /*$remove_old_votes_fields = array(
               'entity_type' => $entity_type . '_backup',
               );
               try {
               db_update('votingapi_vote')
               ->fields($remove_old_votes_fields)
               ->condition('entity_type', $entity_type)
               ->condition('vote_source', array('like', 'dislike'), 'NOT IN')
               ->execute();
               }
               catch (Exception $e) {}
               */
             // Remove votes cast on this entity by the previous version
             // of the plugin, when vote_source was ''
             /*try {
                     db_delete('votingapi_vote')
                     ->condition('entity_type', $entity_type)
                     ->condition('entity_id', $entity_id)
                     ->condition('tag', 'vote')
                     ->condition('vote_source', '')
                     ->execute();
                     }
                     catch (Exception $e) {
             
                     }
                     */
             // Update LikeBtn fields.
             if ($vote_source) {
                 $entities = entity_load($entity_type, array($entity_id));
                 if (empty($entities[$entity_id])) {
                     continue;
                 }
                 $entity = $entities[$entity_id];
                 list($tmp_entity_id, $entity_revision_id, $bundle) = entity_extract_ids($entity_type, $entity);
                 // Get entity LikeBtn fields.
                 $entity_fields = field_info_instances($entity_type, $bundle);
                 // Set field value.
                 $likes_minus_dislikes = $likes - $dislikes;
                 foreach ($entity_fields as $field_name => $field_info) {
                     if ($field_info['widget']['module'] != 'likebtn') {
                         continue;
                     }
                     $field_fields_data = array('entity_type' => $entity_type, 'bundle' => $bundle, 'entity_id' => $entity_id, 'revision_id' => $entity_id, 'delta' => $field_index, 'language' => isset($entity->language) ? $entity->language : LANGUAGE_NONE);
                     $field_fields_data[$field_name . '_likebtn_likes'] = $likes;
                     $field_fields_data[$field_name . '_likebtn_dislikes'] = $dislikes;
                     $field_fields_data[$field_name . '_likebtn_likes_minus_dislikes'] = $likes_minus_dislikes;
                     try {
                         // Insert value.
                         db_insert('field_data_' . $field_name)->fields($field_fields_data)->execute();
                     } catch (Exception $e) {
                         // Update value.
                         try {
                             db_update('field_data_' . $field_name)->fields($field_fields_data)->condition('entity_type', $entity_type)->condition('bundle', $bundle)->condition('entity_id', $entity_id)->execute();
                         } catch (Exception $e) {
                         }
                     }
                 }
             }
         }
         if ($votes) {
             // Prepare criteria for removing previous vote values.
             $criteria = array();
             foreach ($votes as $vote) {
                 $criteria[] = array('entity_type' => $vote['entity_type'], 'entity_id' => $vote['entity_id'], 'value_type' => $vote['value_type'], 'tag' => $vote['tag'], 'uid' => $vote['uid'], 'vote_source' => $vote['vote_source']);
             }
             // Votes must be saved altogether.
             votingapi_set_votes($votes, $criteria);
             return TRUE;
         }
         return FALSE;
     }
 }
 /**
  * Override RawDKANEntityContext::post_save()
  */
 public function post_save($wrapper, $fields)
 {
     parent::post_save($wrapper, $fields);
     $this->moderate($wrapper, $fields);
     if (isset($fields['rating'])) {
         $votes = array('entity_type' => 'node', 'entity_id' => $wrapper->value()->nid, 'value_type' => 'points', 'value' => $fields['rating'], 'tag' => 'feedback');
         $criteria = NULL;
         votingapi_set_votes($votes, $criteria);
     }
 }