pos_entity_review.module
Tue Oct 04 2022 20:05:53 GMT+0000 (Coordinated Universal Time)
<?php /** * @file * Contains pos_entity_review.module. */ use Drupal\Core\Entity\Display\EntityViewDisplayInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityTypeInterface; use Drupal\Core\Form\FormState; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; use Drupal\pos_entity_cfp\Entity\Cfp; use Drupal\pos_entity_form_part\Form\EntityPartForm; use Drupal\pos_entity_review\Entity\ReviewType; use Drupal\pos_entity_review\Entity\ReviewTypeInterface; /** * Implements hook_help(). */ function pos_entity_review_help($route_name, RouteMatchInterface $route_match) { switch ($route_name) { // Main module help for the pos_entity_review module. case 'help.page.pos_entity_review': $output = ''; $output .= '<h3>' . t('About') . '</h3>'; $output .= '<p>' . t('Pos Review Base Entity Used by CFP in some states') . '</p>'; return $output; default: } } /** * Returns all execution as options. * * @return array * Array of all review types with labels. * * @throws \ReflectionException */ function _get_review_types_as_options() { $reflection_class = new ReflectionClass(ReviewTypeInterface::class); $states = []; foreach ($reflection_class->getConstants() as $constant_name => $constant) { if (strpos($constant_name, 'REVIEW_TYPE') !== FALSE) { $states[$constant] = ucfirst(strtolower(str_replace([ 'REVIEW_TYPE_', '_', ], [ '', ' ', ], $constant_name))); } } return $states; } /** * Implements hook_theme(). */ function pos_entity_review_theme() { $theme = []; $theme['review'] = [ 'render element' => 'elements', 'file' => 'review.page.inc', 'template' => 'review', ]; $theme['review_content_add_list'] = [ 'render element' => 'content', 'variables' => ['content' => NULL], 'file' => 'review.page.inc', ]; return $theme; } /** * Implements hook_theme_suggestions_HOOK(). */ function pos_entity_review_theme_suggestions_review(array $variables) { $suggestions = []; $entity = $variables['elements']['#review']; $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_'); $suggestions[] = 'review__' . $sanitized_view_mode; $suggestions[] = 'review__' . $entity->bundle(); $suggestions[] = 'review__' . $entity->bundle() . '__' . $sanitized_view_mode; $suggestions[] = 'review__' . $entity->id(); $suggestions[] = 'review__' . $entity->id() . '__' . $sanitized_view_mode; return $suggestions; } /** * Implements hook_entity_extra_field_info(). */ function pos_entity_review_entity_extra_field_info() { $extra = []; foreach (ReviewType::loadMultiple() as $review_type) { $extra['review'][$review_type->id()]['display']['view_link'] = [ 'label' => t('View link'), 'description' => 'Entity view link', 'visible' => FALSE, ]; $extra['review'][$review_type->id()]['display']['edit_link'] = [ 'label' => t('Edit link'), 'weight' => 0, 'visible' => FALSE, ]; $extra['review'][$review_type->id()]['display']['entity_label'] = [ 'label' => t('Entity label'), 'weight' => 0, 'visible' => FALSE, ]; if ($review_type->questionCanBeClarified()) { $extra['review'][$review_type->id()]['display']['clarify_question'] = [ 'label' => t('Clarify question button'), 'weight' => 0, 'visible' => FALSE, ]; } $extra['review'][$review_type->id()]['display']['correction_data'] = [ 'label' => t('Correction data(correction data for given)'), 'description' => t('If review is for correction state, corrections will be shown'), 'weight' => 0, 'visible' => FALSE, ]; $extra['review'][$review_type->id()]['display']['reviewer_additional_files'] = [ 'label' => t('Shows file upload for additional files'), 'description' => t('Reviewer need to attach document during work in some cases'), 'weight' => 0, 'visible' => FALSE, ]; $extra['review'][$review_type->id()]['display']['raw_signature'] = [ 'label' => t('Signature'), 'visible' => FALSE, ]; } return $extra; } /** * Implements hook_ENTITY_TYPE_view(). */ function pos_entity_review_review_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) { /** @var \Drupal\pos_entity_review\Entity\Review $entity */ if ($display->getComponent('view_link') && $entity->access('view') && !$entity->access('update')) { $view_link = $entity->toUrl(); $build['view_link'] = [ '#type' => 'link', '#title' => t('View'), '#url' => $view_link, '#attributes' => [ 'class' => ['button'], ], ]; } if ($display->getComponent('edit_link') && $entity->access('update')) { $edit_link = $entity->toUrl('edit-form'); $edit_link->setRouteParameter('destination', Url::fromRoute('<current>')->toString()); $build['edit_link'] = [ '#type' => 'link', '#title' => t('Edit'), '#url' => $edit_link, '#attributes' => [ 'class' => ['button', 'button--primary'], ], ]; } if ($display->getComponent('entity_label')) { $build['entity_label'] = [ '#type' => 'markup', '#markup' => '<h3>' . $entity->label() . '</h3>', ]; } if ($display->getComponent('clarify_question') && $entity->access('update')) { $build['clarify_question'] = [ '#title' => t('Clarify question'), '#type' => 'link', '#url' => $entity->toUrl('question-form')->setRouteParameter('destination', Url::fromRoute('<current>')->toString()), '#attributes' => [ 'class' => ['button'], ], ]; } if ($display->getComponent('correction_data')) { /** @var \Drupal\pos_entity_cfp\Entity\Cfp $cfp */ $cfp = $entity->getCfpEntity(); if ($cfp && $state_for_review = $entity->get('state_for_review')->value) { $correction_plugin = $cfp->getStateCorrectionPlugin($state_for_review); if ($correction_plugin) { $build['correction_data']['#type'] = 'container'; $build['correction_data']['questions'] = $correction_plugin->getCorrectionQuestionElement(); $build['correction_data']['answers'] = $correction_plugin->getCorrectionAnswersElement(); } } } if ($display->getComponent('reviewer_additional_files')) { if ((\Drupal::currentUser()->id() == $entity->getAssigneeId()) || (in_array('administrator', \Drupal::currentUser()->getRoles()))) { $field = 'reviewer_files'; /** @var \Drupal\pos_entity_form_part\Form\EntityPartForm $form_part */ $form_part = \Drupal::classResolver() ->getInstanceFromDefinition(EntityPartForm::class); $form_state = new FormState(); $form_part->setFields([$field]); $form_part->setEntity($entity); $form_part->setRedirectionRoute('<current>'); $form_part->setCurrentTabRedirect(TRUE); $form = \Drupal::formBuilder()->buildForm($form_part, $form_state); $form['reviewer_files']['widget']['#disable_dragging'] = TRUE; $build['reviewer_additional_files'] = $form; } } if ($display->getComponent('raw_signature')) { /** @var \Drupal\pos_entity_cfp\Entity\Cfp $cfp */ $cfp = $entity->getCfpEntity(); $build['raw_signature'] = [ '#type' => 'inline_template', '#template' => pos_entity_review_get_signature_part($cfp), ]; } } /** * Get signature part. */ function pos_entity_review_get_signature_part(Cfp $cfp) { $representative = $cfp->getApplicantEntity()->getCompanyRepresentative(); return '<div class="signatures"> <div class="signature-date"><p>Mjesto i datum: ____________________________ 2022.</p></div> <div class="signature"> <p>____________________________</p> <p>' . $cfp->getApplicantEntity()->get('applicant_name')->value . '</p> <p>' . $representative?->label() .'</p> </div>'; } /** * Implements hook_cron(). */ function pos_entity_review_cron() { $query = \Drupal::database()->query('SELECT id FROM `review` WHERE cfp NOT IN (SELECT id FROM cfp)'); $review_storage = \Drupal::entityTypeManager()->getStorage('review'); while ($row = $query->fetch()) { $review = $review_storage->load($row->id); if ($review) { $review->delete(); } } } /** * Implements hook_views_data_alter(). */ function pos_entity_review_views_data_alter(array &$data) { $data['review']['review_project_implementation_filter'] = [ 'title' => t('Járás" - Okres - Project Implementation Place (Filter)'), 'filter' => [ 'title' => t('Járás - Okres - Project Implementation Place (Filter)'), 'field' => 'cfp', 'id' => 'pos_review_address_filter', ], ]; } /** * Implements hook_review_passed_alter(). */ function pos_entity_review_review_passed_alter(&$passed, $entity) { /** @var \Drupal\pos_entity_review\Entity\ReviewType $review_type */ $review_type = ReviewType::load($entity->bundle()); if (($key_field = $review_type->getKeyField()) && !empty($accept_values = $review_type->getAcceptValues())) { if (in_array($entity->get($key_field)->value, $accept_values)) { if (pos_printer_is_printable_entity($entity->getEntityType(), $entity->bundle())) { if ($entity->isPrintConfirmed()) { $passed = TRUE; } } else { $passed = TRUE; } } } } /** * Implements hook_review_rejected_alter(). */ function pos_entity_review_review_rejected_alter(&$rejected, $entity) { /** @var \Drupal\pos_entity_review\Entity\ReviewType $review_type */ $review_type = ReviewType::load($entity->bundle()); if (($key_field = $review_type->getKeyField()) && !empty($reject_values = $review_type->getRejectValues())) { if (in_array($entity->get($key_field)->value, $reject_values)) { if (pos_printer_is_printable_entity($entity->getEntityType(), $entity->bundle())) { if ($entity->isPrintConfirmed()) { $rejected = TRUE; } } else { $rejected = TRUE; } } } } /** * Implements hook_entity_bundle_field_info_alter(). */ function pos_entity_review_entity_bundle_field_info_alter(&$fields, EntityTypeInterface $entity_type, $bundle) { if ($entity_type->id() === 'review' && !empty($bundle)) { $review_type = ReviewType::load($bundle); if ($key_field = $review_type->getKeyField()) { if (isset($fields[$key_field])) { $fields[$key_field]->addConstraint('reviewKeyFieldCondition'); } } } if ($entity_type->id() === 'review' && $bundle === 'acceptance_2022_01') { if ($fields['cf_comment']) { $fields['cf_comment']->setRequired(TRUE); $fields['cf_comment']->addPropertyConstraints('value', ['NamedLength' => ['min' => 20, 'max' => 500]]); } } } /** * Implements hook_mail(). */ function pos_entity_review_mail($key, &$message, $params) { switch ($key) { case 'reviewer_clarify_question': $message['headers']['From'] = $params['from']; $message['headers']['Sender'] = $params['from']; $message['subject'] = $params['subject']; $message['body'][] = $params['message']; $message['headers']['Content-Type'] = 'text/html'; break; } }
Comments