openlucius-2.0.0-alpha3/modules/entities/ol_like/src/Form/LikeForm.php
modules/entities/ol_like/src/Form/LikeForm.php
<?php
namespace Drupal\ol_like\Form;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\CssCommand;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\Html;
use Drupal\Core\Messenger\Messenger;
use Drupal\Core\Session\AccountInterface;
use Drupal\ol_like\Entity\OlLike;
use Drupal\ol_main\Services\OlComments;
use Drupal\ol_main\Services\OlGroups;
use Drupal\ol_members\Services\OlMembers;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Class LikeForm.
*/
class LikeForm extends FormBase {
/**
* @var $members
*/
protected $members;
/**
* @var $language_manager
*/
protected $groups;
/**
* @var $comments
*/
protected $comments;
/**
* Class constructor.
* @param AccountInterface $account
*/
public function __construct(OlMembers $members, Messenger $messenger, OlGroups $groups, OlComments $comments) {
$this->members = $members;
$this->messenger = $messenger;
$this->groups = $groups;
$this->comments = $comments;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('olmembers.members'),
$container->get('messenger'),
$container->get('olmain.groups'),
$container->get('olmain.comments')
);
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'like_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state, $entity = null, $entity_id = null) {
$uid = \Drupal::currentUser()->id();
$like_status = $this->getLikeStatus($entity, $entity_id, $uid);
$like_count = $this->getLikeCount($entity, $entity_id);
$liked_class = is_numeric($like_status) ? 'liked' : '';
$button_text = is_numeric($like_status) ? 'Liked' : 'Like';
$users_that_liked = ($like_count > 0) ? $this->getUsersThatLiked($entity, $entity_id, $uid) : '';
$form['entity'] = [
'#type' => 'hidden',
'#required' => true,
'#default_value' => $entity,
];
$form['entity_id'] = [
'#type' => 'hidden',
'#required' => true,
'#default_value' => $entity_id,
];
$form['actions'] = [
'#prefix' => '<span class="'.$entity.$entity_id .' '.$liked_class.'"><i class="fa fa-heart"></i> ',
'#type' => 'button',
'#attributes' => array('class' => array('btn btn-blue btn-sm like-button '.$entity.$entity_id)),
'#value' => $button_text,
'#ajax' => [
'callback' => '::submitLikeAjax',
'disable-refocus' => true,
'progress' => [
'type' => 'none',
]
],
'#suffix' => '</span> · <span id="like_count_'.$entity.$entity_id .'" class="'.$entity.$entity_id.' like_count '.$liked_class .'">' .$like_count .'</span>'
];
if(!empty($users_that_liked)) {
$form['users_that_liked'] = [
'#type' => 'markup',
'#weight' => '50',
'#markup' => '<span class="users_that_liked">' . t('Liked by: ') .$users_that_liked . '</span>',
];
}
$form['#attached']['library'][] = 'ol_like/like';
return $form;
}
/**
* Ajax callback to validate the email field.
*/
public function submitLikeAjax(array &$form, FormStateInterface $form_state) {
// Initiate.
$response = new AjaxResponse();
$uid = \Drupal::currentUser()->id();
$group_id = $this->groups->getCurrentGroupId();
$entity = $form_state->getValue('entity');
$entity_id = $form_state->getValue('entity_id');
$like_count = $this->getLikeCount($entity, $entity_id);
$like_count = (empty($like_count)) ? 0 : $like_count;
$like_status = $this->getLikeStatus($entity, $entity_id, $uid);
// Record exists, unlike, remove record.
if(is_numeric($like_status)){
\Drupal::database()->delete('ol_like')
->condition('entity', $entity, '=')
->condition('entity_id', $entity_id, '=')
->condition('user_id', $uid, '=')
->condition('group_id', $group_id, '=')
->execute();
// Add ajax commands
$css_you_liked = ['display' => 'none'];
$response->addCommand(new CssCommand('.you_liked_' .$entity .$entity_id, $css_you_liked));
$css = ['color' => '#9f9c9c'];
$response->addCommand(new CssCommand('.' . $entity.$entity_id, $css));
$response->addCommand(new InvokeCommand('.' .$entity .$entity_id, 'val', ['Like']));
$new_count = strval($like_count - 1);
$response->addCommand(new HtmlCommand('#like_count_'.$entity.$entity_id, $new_count));
}
// Record doesn't exists, Like, add record.
elseif (empty($like_status)) {
$ol_like = OlLike::create([
'entity' => Html::escape($entity),
'entity_id' => $entity_id,
'group_id' => $group_id,
]);
$ol_like->save();
// Add ajax commands
$response->addCommand(new HtmlCommand('.you_liked_'.$entity.$entity_id, 'You, '));
$css = ['color' => '#ed4956'];
$response->addCommand(new CssCommand('.' .$entity .$entity_id, $css));
$css_you_liked = ['display' => 'initial'];
$response->addCommand(new CssCommand('.you_liked_' .$entity .$entity_id, $css_you_liked));
$response->addCommand(new InvokeCommand('.' .$entity .$entity_id, 'val', ['Liked']));
$new_count = strval($like_count + 1);
$response->addCommand(new HtmlCommand('#like_count_'.$entity.$entity_id, $new_count));
}
// Wipe all messages, so on page refresh nothing comes up.
\Drupal::messenger()->deleteAll();
return $response;
}
/**
* @param $entity
* @param $entity_id
* @param $uid
*
* @return string
*/
private function getUsersThatLiked($entity, $entity_id, $uid){
// Query users that liked.
$query = \Drupal::database()->select('ol_like', 'oll');
$query->addField('oll', 'user_id');
$query->addField('ufd', 'name');
$query->condition('oll.entity', $entity);
$query->condition('oll.entity_id', $entity_id);
$query->join('users_field_data','ufd','ufd.uid = oll.user_id');
$users = $query->execute()->fetchAll();
$total = count((array)$users);
// Build users string
$users_string = '' ;
$liked_by_current = '';
$i = 0;
foreach ($users as $user){
if($user->user_id == $uid){
$liked_by_current = t('You, ');
continue;
}
$users_string .= $user->name;
if(++$i === $total) {
$users_string .= '.';
}else {
$users_string .= ', ';
}
}
return '<span class="you_liked you_liked_'.$entity.$entity_id.'">'.$liked_by_current .'</span>' .$users_string;
}
/**
* @param $entity
* @param $entity_id
* @return mixed
*/
private function getLikeStatus($entity, $entity_id, $uid){
$query = \Drupal::database()->select('ol_like', 'll');
$query->addField('ll', 'id');
$query->condition('ll.entity', $entity);
$query->condition('ll.entity_id', $entity_id);
$query->condition('ll.user_id', $uid);
return $query->execute()->fetchField();
}
/**
* @param $entity
* @param $entity_id
* @return mixed
*/
private function getLikeCount($entity, $entity_id){
$query = \Drupal::database()->select('ol_like', 'll');
$query->addField('ll', 'id');
$query->condition('ll.entity', $entity);
$query->condition('ll.entity_id', $entity_id);
$query->condition('ll.status', 1);
return $query->countQuery()->execute()->fetchField();
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
// We need this function, because interface requires it.
// But nothing is needed here, it's all ajax above.
}
}
