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);
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc