class HeartbeatBlock in Heartbeat 8
Provides a 'HeartbeatBlock' block.
Plugin annotation
@Block(
id = "heartbeat_block",
admin_label = @Translation("Heartbeat block"),
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Core\Block\BlockBase implements BlockPluginInterface, PluginWithFormsInterface, PreviewFallbackInterface uses BlockPluginTrait, ContextAwarePluginAssignmentTrait
- class \Drupal\heartbeat\Plugin\Block\HeartbeatBlock implements ContainerFactoryPluginInterface
- class \Drupal\Core\Block\BlockBase implements BlockPluginInterface, PluginWithFormsInterface, PreviewFallbackInterface uses BlockPluginTrait, ContextAwarePluginAssignmentTrait
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
Expanded class hierarchy of HeartbeatBlock
1 file declares its use of HeartbeatBlock
- StatusForm.php in modules/
statusmessage/ src/ Form/ StatusForm.php
File
- src/
Plugin/ Block/ HeartbeatBlock.php, line 35
Namespace
Drupal\heartbeat\Plugin\BlockView source
class HeartbeatBlock extends BlockBase implements ContainerFactoryPluginInterface {
/**
* Drupal\heartbeat\HeartbeatTypeService definition.
*
* @var \Drupal\heartbeat\HeartbeatTypeService
*/
protected $heartbeatTypeService;
/**
* Drupal\heartbeat\HeartbeatStreamServices definition.
*
* @var \Drupal\heartbeat\HeartbeatStreamServices
*/
protected $heartbeatStreamServices;
/**
* Drupal\heartbeat\HeartbeatService definition.
*
* @var \Drupal\heartbeat\HeartbeatService
*/
protected $heartbeatService;
protected $entityTypeManager;
protected $dateFormatter;
protected $flagService;
protected $formBuilder;
protected $configFactory;
protected $timestamp;
/**
* Construct.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param string $plugin_definition
* The plugin implementation definition.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, HeartbeatTypeService $heartbeat_heartbeattype, HeartbeatStreamServices $heartbeatstream, HeartbeatService $heartbeat, EntityTypeManager $entity_type_manager, DateFormatter $date_formatter, FlagService $flag_service, FormBuilder $form_builder, ConfigFactory $configFactory) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->heartbeatTypeService = $heartbeat_heartbeattype;
$this->heartbeatStreamServices = $heartbeatstream;
$this->heartbeatService = $heartbeat;
$this->entityTypeManager = $entity_type_manager;
$this->dateFormatter = $date_formatter;
$this->flagService = $flag_service;
$this->formBuilder = $form_builder;
$this->configFactory = $configFactory;
$this->timestamp = time();
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('heartbeat.heartbeattype'), $container
->get('heartbeatstream'), $container
->get('heartbeat'), $container
->get('entity_type.manager'), $container
->get('date.formatter'), $container
->get('flag'), $container
->get('form_builder'), $container
->get('config.factory'));
}
/**
* {@inheritdoc}
* @throws \Drupal\Core\Database\InvalidQueryException
*/
public function build() {
$messages = array();
if (\Drupal::currentUser()
->id() > 0) {
$myConfig = \Drupal::service('config.factory')
->getEditable('heartbeat_feed.settings');
$friendData = \Drupal::config('heartbeat_friendship.settings')
->get('data');
//TODO Use User IDs from friendData as conditions for heartbeats, rather than retrieving friendships in a separate query as is what follows in the lines ahead
$feed = $myConfig
->get('message');
if ($feed === null || $feed === 'null') {
$feed = "Public";
$myConfig
->set('message', $feed)
->save();
}
$uids = null;
$query = Database::getConnection()
->select('heartbeat_friendship', 'hf')
->fields('hf', [
'uid',
'uid_target',
]);
$conditionOr = $query
->orConditionGroup()
->condition('hf.uid', \Drupal::currentUser()
->id())
->condition('hf.uid_target', \Drupal::currentUser()
->id());
$results = $query
->condition($conditionOr)
->execute();
if ($result = $results
->fetchAll()) {
$uids = array();
foreach ($result as $uid) {
$uids[] = $uid->uid_target;
$uids[] = $uid->uid;
}
}
if ($feed !== null && $this->heartbeatStreamServices) {
$uids = count($uids) > 1 ? array_unique($uids) : $uids;
if (!empty($uids)) {
foreach ($this->heartbeatStreamServices
->createStreamForUidsByType($uids, $feed) as $heartbeat) {
$this
->renderMessage($messages, $heartbeat);
}
}
else {
foreach ($this->heartbeatStreamServices
->createStreamByType($feed) as $heartbeat) {
$this
->renderMessage($messages, $heartbeat);
}
}
}
else {
foreach ($this->heartbeatStreamServices
->loadAllStreams() as $heartbeat) {
$this
->renderMessage($messages, $heartbeat);
}
}
}
else {
foreach ($this->heartbeatStreamServices
->loadAllStreams() as $heartbeat) {
$this
->renderMessage($messages, $heartbeat);
}
}
return [
'#theme' => 'heartbeat_stream',
'#messages' => $messages,
'#attached' => array(
'library' => 'heartbeat/heartbeat',
'drupalSettings' => [
'activeFeed' => 'jigga',
'friendData' => $friendData,
],
),
'#cache' => array(
'max-age' => 0,
),
];
}
private function renderMessage(array &$messages, $heartbeat) {
$timeago = null;
$diff = $this->timestamp - $heartbeat
->getCreatedTime();
switch (true) {
case $diff < 86400:
$timeago = $this->dateFormatter
->formatInterval(REQUEST_TIME - $heartbeat
->getCreatedTime()) . ' ago';
break;
case $diff >= 86400 && $diff < 172800:
$timeago = 'Yesterday at ' . $this->dateFormatter
->format($heartbeat
->getCreatedTime(), 'heartbeat_time');
break;
case $diff >= 172800:
$timeago = $this->dateFormatter
->format($heartbeat
->getCreatedTime(), 'heartbeat_short');
break;
}
$user = $heartbeat
->getOwner();
$userView = user_view($user, 'compact');
$userPic = $user
->get('user_picture')
->getValue();
if (!empty($userPic)) {
$profilePic = $userPic[0]['target_id'];
}
if (NULL === $profilePic) {
$profilePic = 86;
}
$pic = File::load($profilePic);
if ($pic !== NULL) {
$style = $this->entityTypeManager
->getStorage('image_style')
->load('thumbnail');
$rendered = $style
->buildUrl($pic
->getFileUri());
}
$cids = \Drupal::entityQuery('comment')
->condition('entity_id', $heartbeat
->id())
->condition('entity_type', 'heartbeat')
->sort('cid', 'ASC')
->execute();
$comments = [];
foreach ($cids as $cid) {
$url = Url::fromRoute('heartbeat.sub_comment_request', array(
'cid' => $cid,
));
$commentLink = Link::fromTextAndUrl(t('Reply'), $url);
$commentLink = $commentLink
->toRenderable();
$commentLink['#attributes'] = array(
'class' => array(
'button',
'button-action',
'use-ajax',
),
);
$comment = Comment::load($cid);
$commentOwner = user_view($comment
->getOwner(), 'comment');
$subCids = \Drupal::entityQuery('comment')
->condition('entity_id', $cid)
->condition('entity_type', 'comment')
->sort('cid', 'ASC')
->execute();
$subComments = [];
if (count($subCids) > 0) {
foreach ($subCids as $subCid) {
$subComment = Comment::load($subCid);
$subDiff = $this->timestamp - $subComment
->getCreatedTime();
switch (true) {
case $subDiff < 86400:
$timeago = $this->dateFormatter
->formatInterval(REQUEST_TIME - $subComment
->getCreatedTime()) . ' ago';
break;
case $subDiff >= 86400 && $subDiff < 172800:
$timeago = 'Yesterday at ' . $this->dateFormatter
->format($subComment
->getCreatedTime(), 'heartbeat_time');
break;
case $subDiff >= 172800:
$timeago = $this->dateFormatter
->format($subComment
->getCreatedTime(), 'heartbeat_short');
break;
}
$subCommentOwner = user_view($subComment
->getOwner(), 'comment');
$subCommentTime = $this->timestamp - $subComment
->getCreatedTime() < 172800 ? $this->dateFormatter
->formatInterval(REQUEST_TIME - $subComment
->getCreatedTime()) . ' ago' : $this->dateFormatter
->format($subComment
->getCreatedTime(), 'heartbeat_short');
$subComments[] = [
'id' => $subCid,
'body' => $subComment
->get('comment_body')->value,
'username' => $subComment
->getAuthorName(),
'owner' => $subCommentOwner,
'timeAgo' => $subCommentTime,
'commentLike' => Heartbeat::flagAjaxBuilder('heartbeat_like_comment', $subComment, $this->flagService),
];
}
}
$commentTimeDiff = $this->timestamp - $comment
->getCreatedTime();
switch (true) {
case $commentTimeDiff < 86400:
$cTimeago = $this->dateFormatter
->formatInterval(REQUEST_TIME - $comment
->getCreatedTime()) . ' ago';
break;
case $commentTimeDiff >= 86400 && $commentTimeDiff < 172800:
$cTimeago = 'Yesterday at ' . $this->dateFormatter
->format($comment
->getCreatedTime(), 'heartbeat_time');
break;
case $commentTimeDiff >= 172800:
$cTimeago = $this->dateFormatter
->format($comment
->getCreatedTime(), 'heartbeat_short');
break;
}
$comments[] = [
'id' => $cid,
'body' => $comment
->get('comment_body')->value,
'username' => $comment
->getAuthorName(),
'owner' => $commentOwner,
'timeAgo' => $cTimeago,
'commentLike' => Heartbeat::flagAjaxBuilder('heartbeat_like_comment', $comment, $this->flagService),
'reply' => $commentLink,
'subComments' => $subComments,
];
}
$form = \Drupal::service('form_builder')
->getForm('\\Drupal\\heartbeat\\Form\\HeartbeatCommentForm', $heartbeat);
$commentCount = count($comments);
$messages[] = array(
'heartbeat' => $heartbeat
->getMessage()
->getValue()[0]['value'],
'userPicture' => $rendered,
'userId' => $user
->id(),
'timeAgo' => $timeago,
'id' => $heartbeat
->id(),
'userName' => $user
->getAccountName(),
'user' => $userView,
'commentForm' => $form,
'comments' => array_reverse($comments),
'commentCount' => $commentCount > 0 ? $commentCount : '',
'likeFlag' => Heartbeat::flagAjaxBuilder('heartbeat_like', $heartbeat, $this->flagService),
'unlikeFlag' => Heartbeat::flagAjaxBuilder('heartbeat_unlike', $heartbeat, $this->flagService),
);
}
public static function renderOneHeartbeat(Heartbeat $heartbeat) {
$timeago = 'Just now';
$user = $heartbeat
->getOwner();
$userView = user_view($user, 'compact');
$userPic = $user
->get('user_picture')
->getValue();
if (!empty($userPic)) {
$profilePic = $userPic[0]['target_id'];
}
if (NULL === $profilePic) {
$profilePic = 86;
}
$pic = File::load($profilePic);
if ($pic !== NULL) {
$style = \Drupal::entityTypeManager()
->getStorage('image_style')
->load('thumbnail');
$rendered = $style
->buildUrl($pic
->getFileUri());
}
$flagService = \Drupal::service('flag');
$form = \Drupal::service('form_builder')
->getForm('\\Drupal\\heartbeat\\Form\\HeartbeatCommentForm', $heartbeat);
return '<div class="heartbeat-message" id="heartbeat-' . $heartbeat
->id() . '">
<div class="heartbeat-message-wrap">
<div class="heartbeat-owner">
<a href="/user/' . $user
->id() . '"><img src="' . $rendered . '" />
' . $user
->getAccountName() . '
</a>
' . \Drupal::service('renderer')
->render($userView)
->__toString() . '
<div class="time-ago"> . ' . $timeago . '</div>
</div>
<div class="heartbeat-content hid-' . $heartbeat
->id() . '">
' . $heartbeat
->getMessage()
->getValue()[0]['value'] . '
</div>
</div>
<div class="heartbeat-interaction-wrap">
<div class="heartbeat-like">
' . \Drupal::service('renderer')
->renderplain(Heartbeat::flagAjaxBuilder('heartbeat_like', $heartbeat, $flagService))
->__toString() . '
</div>
<div class="heartbeat-unlike">
' . \Drupal::service('renderer')
->renderplain(Heartbeat::flagAjaxBuilder('heartbeat_unlike', $heartbeat, $flagService))
->__toString() . '
</div>
<div class="heartbeat-comment-button">
Comment
</div>
<div class="heartbeat-comment" id="comment-' . $heartbeat
->id() . '">
' . \Drupal::service('renderer')
->renderplain($form)
->__toString() . '
<div class="heartbeat-comments"></div>
</div>
</div>
</div>';
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
BlockPluginInterface:: |
constant | Indicates the block label (title) should be displayed to end users. | ||
BlockPluginTrait:: |
protected | property | The transliteration service. | |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
protected | function | Returns generic default configuration for block plugins. | |
BlockPluginTrait:: |
protected | function | Indicates whether the block should be shown. | 16 |
BlockPluginTrait:: |
public | function | 16 | |
BlockPluginTrait:: |
public | function | 13 | |
BlockPluginTrait:: |
public | function | 3 | |
BlockPluginTrait:: |
public | function | Creates a generic configuration form for all block types. Individual block plugins can add elements to this form by overriding BlockBase::blockForm(). Most block plugins should not override this method unless they need to alter the generic form elements. | 2 |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | 19 | |
BlockPluginTrait:: |
public | function | 1 | |
BlockPluginTrait:: |
public | function | 1 | |
BlockPluginTrait:: |
public | function | 3 | |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | Sets the transliteration service. | |
BlockPluginTrait:: |
public | function | Most block plugins should not override this method. To add submission handling for a specific block type, override BlockBase::blockSubmit(). | |
BlockPluginTrait:: |
protected | function | Wraps the transliteration service. | |
BlockPluginTrait:: |
public | function | Most block plugins should not override this method. To add validation for a specific block type, override BlockBase::blockValidate(). | 1 |
ContextAwarePluginAssignmentTrait:: |
protected | function | Builds a form element for assigning a context to a given slot. | |
ContextAwarePluginAssignmentTrait:: |
protected | function | Wraps the context handler. | |
ContextAwarePluginBase:: |
protected | property | The data objects representing the context of this plugin. | |
ContextAwarePluginBase:: |
private | property | Data objects representing the contexts passed in the plugin configuration. | |
ContextAwarePluginBase:: |
protected | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
The cache contexts associated with this object. Overrides CacheableDependencyInterface:: |
9 |
ContextAwarePluginBase:: |
public | function |
The maximum age for which this object may be cached. Overrides CacheableDependencyInterface:: |
7 |
ContextAwarePluginBase:: |
public | function |
The cache tags associated with this object. Overrides CacheableDependencyInterface:: |
4 |
ContextAwarePluginBase:: |
public | function |
This code is identical to the Component in order to pick up a different
Context class. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the value for a defined context. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the values for all defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Set a context on this plugin. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Sets the value for a defined context. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function | Implements magic __get() method. | |
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
HeartbeatBlock:: |
protected | property | ||
HeartbeatBlock:: |
protected | property | ||
HeartbeatBlock:: |
protected | property | ||
HeartbeatBlock:: |
protected | property | ||
HeartbeatBlock:: |
protected | property | ||
HeartbeatBlock:: |
protected | property | Drupal\heartbeat\HeartbeatService definition. | |
HeartbeatBlock:: |
protected | property | Drupal\heartbeat\HeartbeatStreamServices definition. | |
HeartbeatBlock:: |
protected | property | Drupal\heartbeat\HeartbeatTypeService definition. | |
HeartbeatBlock:: |
protected | property | ||
HeartbeatBlock:: |
public | function |
Overrides BlockPluginInterface:: |
|
HeartbeatBlock:: |
public static | function |
Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: |
|
HeartbeatBlock:: |
private | function | ||
HeartbeatBlock:: |
public static | function | ||
HeartbeatBlock:: |
public | function |
Construct. Overrides BlockPluginTrait:: |
|
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
PluginWithFormsTrait:: |
public | function | ||
PluginWithFormsTrait:: |
public | function | ||
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
TypedDataTrait:: |
protected | property | The typed data manager used for creating the data types. | |
TypedDataTrait:: |
public | function | Gets the typed data manager. | 2 |
TypedDataTrait:: |
public | function | Sets the typed data manager. | 2 |