knowledge-8.x-1.x-dev/src/Form/CompetencyForm.php

src/Form/CompetencyForm.php
<?php

namespace Drupal\knowledge\Form;

use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\knowledge_field\Helper\CompetencyField;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Form controller for Competency edit forms.
 *
 * @ingroup knowledge
 */
class CompetencyForm extends ContentEntityForm {

  /**
   * The current user account.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $account;

  /**
   * The knowledge settings config.
   *
   * @var \Drupal\Core\Config\Config
   */
  protected $settings;

  /**
   * The database connection.
   *
   * @var \Drupal\Core\Database\Connection
   */
  protected $database;

  /**
   * The date formatter service.
   *
   * @var \Drupal\Core\Datetime\DateFormatter
   */
  protected $dateFormatter;

  /**
   * The user role storage service.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $roleStorage;

  /**
   * The field group info array.
   *
   * @var array
   */
  protected $groups;

  /**
   * The Renderer service.
   *
   * @var \Drupal\Core\Render\Renderer
   */
  protected $render;

  /**
   * The field definitions for the knowledge competency entity.
   *
   * @var \Drupal\Core\Field\FieldDefinitionInterface[]
   */
  protected $definitions;

  /**
   * The competency service.
   *
   * @var \Drupal\knowledge\KnowledgeCompetencyServiceInterface
   */
  protected $competencyService;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    // Instantiates this form class.
    $instance = parent::create($container);
    $instance->account = $container->get('current_user');
    $instance->roleStorage = $container->get('entity_type.manager')->getStorage('user_role');
    $instance->settings = $container->get('config.factory')->get('knowledge.competency.settings');
    $instance->competencyService = $container->get('knowledge.competency');
    $instance->dateFormatter = $container->get('date.formatter');
    $instance->time = $container->get('datetime.time');
    $instance->render = $container->get('renderer');
    $instance->definitions = $container->get('entity_field.manager')->getFieldDefinitions('knowledge_competency', 'knowledge_competency');
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildForm($form, $form_state);

    $this->addRoleTabs($form);
    $this->buildCompetency($form);

    // In several places within this function, we vary $form on:
    // - The current user's permissions.
    // - Whether the current user is authenticated or anonymous.
    // - The 'user.settings' configuration.
    // - The knowledge field's definition.
    $form['#cache']['contexts'][] = 'user';
    $form['#cache']['contexts'][] = 'user.roles:authenticated';

    $form['user_id']['#type'] = 'hidden';

    $form['#attached']['library'][] = 'knowledge/competency_form';

    return $form;
  }

  /**
   * Adds the role tabs.
   *
   * @param array $form
   *   The form.
   */
  private function addRoleTabs(array &$form) {
    $roles_weight = $form['roles']['widget'][0]['#weight'];
    $form['skills'] = [
      "#type" => "vertical_tabs",
      "#weight" => $roles_weight,
      "#default_tab" => "edit-knowledge-publisher",
    ];
    $competency_roles = $this->competencyService->getRoleIds();
    $roles = $this->roleStorage->loadMultiple($competency_roles);
    foreach ($competency_roles as $role) {
      $form[$role] = [
        '#type' => 'details',
        '#title' => $roles[$role]?->label(),
        '#group' => 'skills',
      ];
    }
  }

  /**
   * Builds the competency.
   *
   * @param array $form
   *   The form.
   */
  protected function buildCompetency(array &$form) {
    $roles = [];
    $role_fields = CompetencyField::roleFields($this->definitions);

    foreach ($role_fields as $role => $fields) {
      $roles[$role] = [
        'correct' => 0,
        'total' => 0,
      ];
      foreach ($fields as $field_name) {
        $roles[$role]['total'] += 1;
        if ($this->entity->get($field_name)?->value) {
          $roles[$role]['correct'] += 1;
        }
        $form[$role][$field_name] = &$form[$field_name];
        unset($form[$field_name]);
      }
    }

    $setting = $this->competencyService->get();
    $default_tab = 'edit-' . str_replace('_', '-', $setting[0]['role']);
    foreach ($setting as $index => $r) {

      $role = $r['role'];
      if ($roles[$role]['total'] != $roles[$role]['correct']) {
        break;
      }

      $next = $setting[$index + 1] ?? NULL;
      if (is_null($next)) {
        break;
      }

      $next_role = $next['role'];
      $default_tab = 'edit-' . str_replace('_', '-', $next_role);
    }

    $form['skills']['#default_tab'] = $default_tab;
  }

  /**
   * Sets the default tab.
   *
   * @param array $form
   *   The form.
   */
  private function setDefaultTab(&$form) {

  }

  /**
   * {@inheritdoc}
   */
  public function save(array $form, FormStateInterface $form_state) {
    $contributor_proposal = $form_state->getValue('contributor_proposal');
    $publisher_proposal = $form_state->getValue('publisher_proposal');
    /** @var \Drupal\knowledge\KnowledgeCompetencyInterface $competency */
    $competency = $this->entity;
    if (empty($competency->contributor_proposed->value) && $contributor_proposal) {
      $competency->contributor_proposed->value = $this->time->getCurrentTime();
      $competency->contributor_coach->target_id = $this->account->id();
    }
    elseif (!empty($competency->contributor_proposed->value) && !$contributor_proposal) {
      $competency->contributor_proposed->value = NULL;
      $competency->contributor_coach->target_id = NULL;
      $competency->contributor_leader->target_id = NULL;
    }
    if (empty($competency->publisher_proposed->value) && $publisher_proposal) {
      $competency->publisher_proposed->value = $this->time->getCurrentTime();
      $competency->publisher_coach->target_id = $this->account->id();
    }
    elseif (!empty($competency->publisher_proposed->value) && !$publisher_proposal) {
      $competency->publisher_proposed->value = NULL;
      $competency->publisher_coach->target_id = NULL;
      $competency->publisher_leader->target_id = NULL;
    }
    $roles = $competency->get('roles');
    foreach ($roles as $index => $role) {

      if ($role->proposer) {
        $roles[$index]->proposer = $role->proposer->id();
      }
      if ($role->approver) {
        $roles[$index]->approver = $role->approver->id();
      }

    }

    $status = parent::save($form, $form_state);

    switch ($status) {
      case SAVED_NEW:
        $this->messenger()->addMessage($this->t("Created %user's Competency.", [
          '%user' => $competency->getOwner()->label(),
        ]));
        break;

      default:
        $this->messenger()->addMessage($this->t("Saved %user's Competency.", [
          '%user' => $competency->getOwner()->label(),
        ]));
    }

    return $status;
  }

}

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

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