You are here

public function MeetingScoreForm::buildForm in Opigno Moxtra 3.x

Same name and namespace in other branches
  1. 8 src/Form/MeetingScoreForm.php \Drupal\opigno_moxtra\Form\MeetingScoreForm::buildForm()

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides FormInterface::buildForm

File

src/Form/MeetingScoreForm.php, line 74

Class

MeetingScoreForm
Provides a form for scoring a opigno_moxtra_meeting entity.

Namespace

Drupal\opigno_moxtra\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {

  /** @var \Drupal\opigno_moxtra\MeetingInterface $entity */
  $entity = $this
    ->getRequest()
    ->get('opigno_moxtra_meeting');
  if (!isset($entity)) {
    throw new NotFoundHttpException();
  }
  $training = $entity
    ->getTraining();
  if (!isset($training)) {
    $message = $this
      ->t('The meeting should has related training to save the presences.');
    $this
      ->messenger()
      ->addError($message);
    return $form;
  }
  $owner_id = $entity
    ->getOwnerId();
  $session_key = $entity
    ->getSessionKey();
  $info = $this->moxtraService
    ->getMeetingInfo($owner_id, $session_key);
  $status = !empty($info['data']) ? $info['data']['status'] : FALSE;
  if ($status !== 'SESSION_ENDED') {
    $message = $this
      ->t('The meeting has to be ended in order to save the presences.');
    $this
      ->messenger()
      ->addError($message);
    return $form;
  }
  $form['submit_scores'] = [
    '#type' => 'table',
    '#title' => $this
      ->t('Participants for @training', [
      '@training' => $training
        ->label(),
    ]),
    '#header' => [
      $this
        ->t('Name'),
      $this
        ->t('Attendance'),
      $this
        ->t('Score'),
    ],
  ];
  $scores =& $form['submit_scores'];

  // Load the meeting members
  // or the related training members, if there is no member restriction.
  $users = $entity
    ->getMembers();
  if (empty($users)) {
    $members = $training
      ->getMembers();
    $users = array_map(function ($member) {

      /** @var \Drupal\group\GroupMembership $member */
      return $member
        ->getUser();
    }, $members);
  }
  uasort($users, function ($user1, $user2) {

    /** @var \Drupal\user\Entity\User $user1 */

    /** @var \Drupal\user\Entity\User $user2 */
    return strcasecmp($user1
      ->getDisplayName(), $user2
      ->getDisplayName());
  });

  // Load the existing meeting results.

  /** @var \Drupal\opigno_moxtra\MeetingResultInterface[] $results */
  $results = $this->entityTypeManager
    ->getStorage('opigno_moxtra_meeting_result')
    ->loadByProperties([
    'meeting' => $entity
      ->id(),
  ]);

  // Reindex results by the user ID.
  $results_by_user = [];
  array_walk($results, function ($result) use (&$results_by_user) {

    /** @var \Drupal\opigno_moxtra\MeetingResultInterface $result */
    $results_by_user[$result
      ->getUserId()] = $result;
  });

  // Get the user IDs of the actual participants of the meeting.
  $participants = !empty($info['data']) ? array_map(function ($participant) {
    $prefix = $this->keyValueStorage
      ->get('prefix');
    $prefix = empty($prefix) ? '' : $prefix;
    $replace_pattern = [
      'm_' . $prefix,
      $prefix . '_',
      $prefix,
      'm_',
    ];
    return empty($participant['unique_id']) ? 1 : str_replace($replace_pattern, '', $participant['unique_id']);
  }, $info['data']['participants']) : [];
  foreach ($users as $user) {
    $id = $user
      ->id();
    if (isset($results_by_user[$id])) {

      // If result for this meeting and user is exists, use it.

      /** @var \Drupal\opigno_moxtra\MeetingResultInterface $result */
      $result = $results_by_user[$id];
      $attendance = $result
        ->getStatus();
      $score = $result
        ->getScore();
    }
    else {

      // Else get the default values.
      if (in_array($id, $participants)) {
        $attendance = 1;
        $score = 100;
      }
      else {
        $attendance = 0;
        $score = 0;
      }
    }
    $scores[$id]['name'] = $user
      ->toLink()
      ->toRenderable();
    $scores[$id]['attendance'] = [
      '#type' => 'select',
      '#options' => [
        0 => $this
          ->t('Absent'),
        1 => $this
          ->t('Attended'),
      ],
      '#default_value' => $attendance,
    ];
    $scores[$id]['score'] = [
      '#type' => 'number',
      '#min' => 0,
      '#max' => 100,
      '#step' => 1,
      '#default_value' => $score,
    ];
  }
  $form['submit'] = [
    '#type' => 'submit',
    '#value' => $this
      ->t('Save attendances'),
  ];
  return $form;
}