Browse Source

Adding default heartbeat type for user friendships
adding logic for handling repeating entities in string for token Replace

logicp 7 years ago
parent
commit
05381e87eb

+ 1 - 0
bugs.txt

@@ -0,0 +1 @@
+1. Sometimes messageMap arguments have integers as keys in HeartbeatTypeForm

+ 20 - 0
config/install/heartbeat.heartbeat_type.user_friendship.yml

@@ -0,0 +1,20 @@
+uuid: c2c54bb0-8376-4a7d-bf5e-6a336c44c2c5
+langcode: en
+status: true
+dependencies: {  }
+id: user_friendship
+label: 'User Friendship'
+hid: null
+message_id: null
+description: 'Records the event of a user befriending another user'
+mainentity: flagging
+message: '!user1 has become friends with !user2'
+message_concat: ''
+perms: 0
+group_type: HEARTBEAT_GROUP_NONE
+arguments: '{"!user1":"[user:account-name]","!user2":"[user:account-name]"}'
+variables:
+  - '[user:account-name]'
+  - '[user:account-name]'
+attachments: null
+

+ 57 - 1
src/Entity/Heartbeat.php

@@ -7,6 +7,7 @@ use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Entity\RevisionableContentEntityBase;
 use Drupal\Core\Entity\EntityChangedTrait;
 use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\token\TokenServiceProvider;
 use Drupal\user\UserInterface;
 
 /**
@@ -407,8 +408,15 @@ class Heartbeat extends RevisionableContentEntityBase implements HeartbeatInterf
    * @param null $mediaData
    * @return null|string
    */
-  public static function buildMessage(\Drupal\token\Token $tokenService, $preparsedMessage, $entities = NULL, $mediaData = NULL) {
+  public static function buildMessage(\Drupal\token\Token $tokenService, $preparsedMessage, $entities = NULL, $entityType, $mediaData = NULL) {
+    $options = null;
+    if ($entityType == 'flag') {
+//      $options = [
+//        'callback' => '\Drupal\heartbeat\Entity\Heartbeat::handleMultipleEntities',
+//      ];
+      self::handleMultipleEntities($tokenService, $preparsedMessage, $entities);
 
+    }
     $parsedMessage = $tokenService->replace($preparsedMessage . '<a href="/node/[node:nid]">', $entities);
     /** @noinspection NestedTernaryOperatorInspection */
     $message = $parsedMessage;
@@ -436,6 +444,54 @@ class Heartbeat extends RevisionableContentEntityBase implements HeartbeatInterf
     return '<'. $type . ' src="' . str_replace('public://', '/sites/default/files/', $filePath) . '" / >';
   }
 
+  protected static function handleMultipleEntities(\Drupal\token\token $tokenService, $message, $entities) {
+    $tokens = $tokenService->scan($message);
+
+    foreach($tokens as $key => $token) {
+      echo 'jigga';
+      foreach ($token as $type) {
+        if (substr_count($message, $type) > 1) {
+          foreach ($entities as $entityKey => $entityValue) {
+            if ($entityValue instanceof \stdClass && count($entityValue->entities) > 1) {
+              if ($key == $entityValue->type) {
+                $messageArray = explode($type, $message);
+                $stringRebuild = array();
+                $i = 0;
+                foreach ($entityValue->entities as $entity) {
+                  $stringRebuild[] = $tokenService->replace($message, array($key => $entity));
+                  $repeated = self::getWordRepeats($stringRebuild[$i]);
+                }
+                $nullhere = 'stop';
+
+              }
+            }
+          }
+        }
+      }
+
+    }
+  }
+
+  public static function getWordRepeats($phrases) {
+    $counts = array();
+    foreach ($phrases as $phrase) {
+      $words = explode(' ', $phrase);
+      foreach ($words as $word) {
+        $word = preg_replace("#[^a-zA-Z\-]#", "", $word);
+        $counts[$word] += 1;
+      }
+    }
+    return $counts;
+  }
+
+
+  function user_mail_tokens(&$replacements, $data, $options) {
+    if (isset($data['user'])) {
+      $replacements['[user:one-time-login-url]'] = user_pass_reset_url($data['user'], $options);
+      $replacements['[user:cancel-url]'] = user_cancel_url($data['user'], $options);
+    }
+  }
+
 
   /**
    * Returns class of argument

+ 61 - 46
src/EventSubscriber/HeartbeatEventSubscriber.php

@@ -5,6 +5,8 @@ namespace Drupal\heartbeat\EventSubscriber;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\EventDispatcher\Event;
 use Drupal\flag\FlagService;
+use Drupal\user\Entity\User;
+use Drupal\heartbeat\Entity\Heartbeat;
 use Drupal\heartbeat\HeartbeatTypeServices;
 use Drupal\heartbeat\HeartbeatStreamServices;
 use Drupal\heartbeat\HeartbeatService;
@@ -68,52 +70,65 @@ class HeartbeatEventSubscriber implements EventSubscriberInterface {
    * @param GetResponseEvent $event
    */
   public function flag_entity_flagged(Event $event) {
-//    $stophere = null;
-//    $flagging = $event->getFlagging();
-//    if ($flagging->getFlagId() == 'friendship') {
-//      $entity = $this->flagService->getFlagById($flagging->getFlagId());
-//
-//      $user = $flagging->getOwner();
-//
-//
-//      if ($entity->id() && $user->isAuthenticated()) {
-//
-//        $heartbeatTypeService = \Drupal::service('heartbeat.heartbeattype');
-//        $tokenService = \Drupal::service('token');
-//
-//        foreach ($heartbeatTypeService->getTypes() as $type) {
-//
-//          $heartbeatTypeEntity = $heartbeatTypeService->load($type);
-//          $arguments = json_decode($heartbeatTypeEntity->getArguments());
-//
-//          foreach ($arguments as $key => $argument) {
-//            $variables[$key] = $argument;
-//          }
-//
-//          $preparsedMessageString = strtr($heartbeatTypeEntity->getMessage(), $variables);
-//
-//          $entities = array(
-//            'node' => $entity,
-//            'user' => $user,
-//          );
-//
-//          $heartbeatMessage = Heartbeat::buildMessage($tokenService, $preparsedMessageString, $entities, $media);
-//
-//          //      $translatedMessage = t($messageTemplate);
-//
-//          $heartbeatActivity = Heartbeat::create([
-//            'type' => $heartbeatTypeEntity->id(),
-//            'uid' => $user->id(),
-//            'nid' => $entity->id(),
-//            'name' => 'Dev Test',
-//          ]);
-//
-//          $heartbeatActivity->setMessage($heartbeatMessage);
-//          $heartbeatActivity->save();
-//
-//        }
-//      }
-//    }
+    $stophere = null;
+    $flagging = $event->getFlagging();
+    if ($flagging->getFlagId() == 'friendship') {
+      $entity = $this->flagService->getFlagById($flagging->getFlagId());
+
+      $user = $flagging->getOwner();
+
+
+      if ($entity->id() && $user->isAuthenticated()) {
+
+        $heartbeatTypeService = \Drupal::service('heartbeat.heartbeattype');
+        $tokenService = \Drupal::service('token');
+
+        foreach ($heartbeatTypeService->getTypes() as $type) {
+
+          $heartbeatTypeEntity = $heartbeatTypeService->load($type);
+
+          if ($heartbeatTypeEntity->getMainEntity() == "flagging") {
+            $arguments = json_decode($heartbeatTypeEntity->getArguments());
+//            $entityTypeFlagging = $flagging->getEntityType();
+//            $id = $entityTypeFlagging->id();
+//            $id_other = $flagging->get('entity_id');
+//            $entityTypeId = $flagging->getEntityTypeId();
+//            $flaggable = $flagging->getFlaggableId();
+            $user2 = User::load($flagging->getFlaggableId());
+
+
+            foreach ($arguments as $key => $argument) {
+              $variables[$key] = $argument;
+            }
+
+            $preparsedMessageString = strtr($heartbeatTypeEntity->getMessage(), $variables);
+            $entitiesObj = new \stdClass();
+            $entitiesObj->type = 'user';
+            $entitiesObj->entities = [$user, $user2];
+            $entities = array(
+              'flagging' => $entity,
+              'user' => $entitiesObj,
+            );
+
+            $heartbeatMessage = Heartbeat::buildMessage($tokenService, $preparsedMessageString, $entities, $entity->getEntityTypeId(), null);
+
+            //      $translatedMessage = t($messageTemplate);
+
+            $heartbeatActivity = Heartbeat::create([
+              'type' => $heartbeatTypeEntity->id(),
+              'uid' => $user->id(),
+              'nid' => $entity->id(),
+              'name' => 'Dev Test',
+            ]);
+
+            $heartbeatActivity->setMessage($heartbeatMessage);
+            $heartbeatActivity->save();
+
+          }
+        }
+      }
+    }
+
     drupal_set_message('Event flag.entity_flagged thrown by Subscriber in module heartbeat.', 'status', TRUE);
     return $event;
   }