openquestions-1.0.x-dev/openquestions.module
openquestions.module
<?php
use Drupal\Core\Render\Element;
use Drupal\openquestions\Entity\OqItem;
use Drupal\openquestions\Entity\OqQuestion;
use Drupal\openquestions\Entity\OqVote;
use Drupal\openquestions\Entity\OqApplication;
use Drupal\openquestions\Entity\OqApplicationHistory;
use Drupal\views\ViewExecutable;
use Drupal\user\UserInterface;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\Core\Url;
/**
* Implements hook_theme().
*/
function openquestions_theme() {
return [
'oq_item' => [
'render element' => 'elements',
],
'oq_vote' => [
'render element' => 'elements',
],
'oq_question' => [
'render element' => 'elements',
],
'oq_application' => [
'render element' => 'elements',
],
'oq_application_history' => [
'render element' => 'elements',
],
'table__openquestions_voting' => [
'variables' => [
'caption' => NULL,
'question_id' => NULL,
'current_uid' => NULL,
'accounts' => NULL,
'votes' => NULL,
],
],
];
}
/**
* Implements hook_views_pre_render().
*/
function openquestions_views_pre_render(ViewExecutable $view) {
if (!empty($view->storage) && $view->storage->id() == 'oq_applications') {
$view->element['#attached']['library'][] = 'openquestions/openquestions_voting';
}
}
/**
* Prepares variables for oq item templates.
*
* Default template: oq-item.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An associative array containing the oq item information and any
* fields attached to the entity.
* - attributes: HTML attributes for the containing element.
*/
function template_preprocess_oq_item(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
}
/**
* Prepares variables for oq question templates.
*
* Default template: oq-question.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An associative array containing the oq question information and any
* fields attached to the entity.
* - attributes: HTML attributes for the containing element.
*/
function template_preprocess_oq_question(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
}
/**
* Prepares variables for oq vote templates.
*
* Default template: oq-vote.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An associative array containing the oq vote information and any
* fields attached to the entity.
* - attributes: HTML attributes for the containing element.
*/
function template_preprocess_oq_vote(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
}
/**
* Prepares variables for oq application templates.
*
* Default template: oq-application.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An associative array containing the oq application information and any
* fields attached to the entity.
* - attributes: HTML attributes for the containing element.
*/
function template_preprocess_oq_application(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
}
/**
* Prepares variables for oq application history templates.
*
* Default template: oq-application-history.html.twig.
*
* @param array $variables
* An associative array containing:
* - elements: An associative array containing the oq application history information and any
* fields attached to the entity.
* - attributes: HTML attributes for the containing element.
*/
function template_preprocess_oq_application_history(array &$variables) {
$variables['view_mode'] = $variables['elements']['#view_mode'];
foreach (Element::children($variables['elements']) as $key) {
$variables['content'][$key] = $variables['elements'][$key];
}
}
/**
* Implements hook_user_cancel().
*/
function openquestions_user_cancel($edit, UserInterface $account, $method) {
switch ($method) {
case 'user_cancel_block_unpublish':
// Unpublish oq items.
$storage = \Drupal::entityTypeManager()->getStorage('oq_item');
$oq_item_ids = $storage->getQuery()
->condition('uid', $account->id())
->condition('status', 1)
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_item_ids) as $oq_item) {
$oq_item->set('status', FALSE);
$oq_item->save();
}
// Unpublish oq votes.
$storage = \Drupal::entityTypeManager()->getStorage('oq_vote');
$oq_vote_ids = $storage->getQuery()
->condition('uid', $account->id())
->condition('status', 1)
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_vote_ids) as $oq_vote) {
$oq_vote->set('status', FALSE);
$oq_vote->save();
}
// Unpublish oq questions.
$storage = \Drupal::entityTypeManager()->getStorage('oq_question');
$oq_question_ids = $storage->getQuery()
->condition('uid', $account->id())
->condition('status', 1)
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_question_ids) as $oq_question) {
$oq_question->set('status', FALSE);
$oq_question->save();
}
// Unpublish oq applications.
$storage = \Drupal::entityTypeManager()->getStorage('oq_application');
$oq_application_ids = $storage->getQuery()
->condition('uid', $account->id())
->condition('status', 1)
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_application_ids) as $oq_application) {
$oq_application->set('status', FALSE);
$oq_application->save();
}
// Unpublish oq application histories.
$storage = \Drupal::entityTypeManager()->getStorage('oq_application_history');
$oq_application_history_ids = $storage->getQuery()
->condition('uid', $account->id())
->condition('status', 1)
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_application_history_ids) as $oq_application_history) {
$oq_application_history->set('status', FALSE);
$oq_application_history->save();
}
break;
case 'user_cancel_reassign':
// Anonymize oq items.
$storage = \Drupal::entityTypeManager()->getStorage('oq_item');
$oq_item_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_item_ids) as $oq_item) {
$oq_item->setOwnerId(0);
$oq_item->save();
}
// Anonymize oq votes.
$storage = \Drupal::entityTypeManager()->getStorage('oq_vote');
$oq_vote_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_vote_ids) as $oq_vote) {
$oq_vote->setOwnerId(0);
$oq_vote->save();
}
// Anonymize oq questions.
$storage = \Drupal::entityTypeManager()->getStorage('oq_question');
$oq_question_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_question_ids) as $oq_question) {
$oq_question->setOwnerId(0);
$oq_question->save();
}
// Anonymize oq applications.
$storage = \Drupal::entityTypeManager()->getStorage('oq_application');
$oq_application_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_application_ids) as $oq_application) {
$oq_application->setOwnerId(0);
$oq_application->save();
}
// Anonymize oq application histories.
$storage = \Drupal::entityTypeManager()->getStorage('oq_application_history');
$oq_application_history_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
foreach ($storage->loadMultiple($oq_application_history_ids) as $oq_application_history) {
$oq_application_history->setOwnerId(0);
$oq_application_history->save();
}
break;
}
}
/**
* Implements hook_ENTITY_TYPE_predelete() for user entities.
*/
function openquestions_user_predelete(UserInterface $account) {
// Delete oq items.
$storage = \Drupal::entityTypeManager()->getStorage('oq_item');
$oq_item_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
$oq_items = $storage->loadMultiple($oq_item_ids);
$storage->delete($oq_items);
// Delete oq questions.
$storage = \Drupal::entityTypeManager()->getStorage('oq_question');
$oq_question_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
$oq_questions = $storage->loadMultiple($oq_question_ids);
$storage->delete($oq_questions);
// Delete oq votes.
$storage = \Drupal::entityTypeManager()->getStorage('oq_vote');
$oq_vote_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
$oq_votes = $storage->loadMultiple($oq_vote_ids);
$storage->delete($oq_votes);
// Delete oq applications.
$storage = \Drupal::entityTypeManager()->getStorage('oq_application');
$oq_application_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
$oq_applications = $storage->loadMultiple($oq_application_ids);
$storage->delete($oq_applications);
// Delete oq application histories.
$storage = \Drupal::entityTypeManager()->getStorage('oq_application_history');
$oq_application_history_ids = $storage->getQuery()
->condition('uid', $account->id())
->accessCheck(FALSE)
->execute();
$oq_application_histories = $storage->loadMultiple($oq_application_history_ids);
$storage->delete($oq_application_histories);
}
/**
* Implements hook_entity_bundle_info_alter().
*/
function openquestions_entity_bundle_info_alter(array &$bundles): void {
if (isset($bundles['oq_item']['oq_item'])) {
$bundles['oq_item']['oq_item']['class'] = \Drupal\openquestions\Entity\Bundle\OqItemBundle::class;
}
}
function openquestions_preprocess_table__openquestions_voting(&$variables) {
$variables['#caption'] = $variables['caption'];
$rows = [];
$row = [];
foreach ($variables['accounts'] as $account) {
$row[] = new FormattableMarkup('<a class="oq_voter" href=":url">@text</a>', [
':url' => $account['url'],
'@text' => $account['name'],
]);
}
$rows[] = $row;
$row = [];
foreach ($variables['votes'] as $vote) {
switch ($vote['type']) {
case 'voted':
$row[] = new FormattableMarkup('<a class="oq_vote" href=":url">@text</a>', [
':url' => $vote['vote_url'],
'@text' => $vote['value'],
]);
break;
case 'empty':
$row[] = new FormattableMarkup('<span class="oq_unvoted" title="@title">@text</span>', [
'@title' => 'No vote yet',
'@text' => $vote['value'],
]);
break;
case 'canceled':
$row[] = new FormattableMarkup('<a class="oq_canceled_vote" href=":url">@text</a>', [
':url' => $vote['vote_url'],
'@text' => $vote['value'],
]);
break;
case 'voteable':
foreach (['item_id', 'question_id', 'uid'] as $k) {
$vote[$k] = intval(1 * $vote[$k]);
}
/* $row[] = new FormattableMarkup('<a href="#" class="oq_voteable" data-item_id="@item_id" data-question_id="@question_id" data-uid="@uid">@text</a>', [
'@text' => $vote['value'],
'@item_id' => $vote['item_id'],
'@question_id' => $vote['question_id'],
'@uid' => $vote['uid'],
]);
*/
$dialogOptions = [
'width' => '50%',
];
$row[] = new FormattableMarkup('<a href=":url" id="@id" class="use-ajax" data-dialog-type="modal" data-dialog-options="@dialog_options" data-item_id="@item_id" data-question_id="@question_id" data-uid="@uid">@text</a>', [
'@text' => $vote['value'],
':url' => Url::fromRoute('openquestions.add_oq_vote_form', [
'nojs' => 'ajax',
'oq_item_id' => $vote['item_id'],
'oq_question_id' => $vote['question_id'],
'uid' => $vote['uid'],
])->toString(),
'@dialog_options' => json_encode($dialogOptions),
'@item_id' => $vote['item_id'],
'@question_id' => $vote['question_id'],
'@uid' => $vote['uid'],
'@id' => 'votelink-item' . $vote['item_id'] . '-question' . $vote['question_id'] . '-uid' . $vote['uid'],
]);
break;
}
}
$rows[] = $row;
$variables['rows'] = $rows;
template_preprocess_table($variables);
}
