monitoring-8.x-1.x-dev/modules/multigraph/src/Form/MultigraphForm.php

modules/multigraph/src/Form/MultigraphForm.php
<?php
/**
 * @file
 * Contains \Drupal\monitoring_multigraph\Form\MultigraphForm.
 */

namespace Drupal\monitoring_multigraph\Form;

use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;

/**
 * Multigraph settings form controller.
 */
class MultigraphForm extends EntityForm {

  /**
   * {@inheritdoc}
   */
  public function form(array $form, FormStateInterface $form_state) {
    $form = parent::form($form, $form_state);
    $form['#tree'] = TRUE;
    /** @var \Drupal\monitoring_multigraph\MultigraphInterface $multigraph */
    $multigraph = $this->entity;

    // Find sensors that can be added.
    $sensor_ids = \Drupal::entityQuery('monitoring_sensor_config')
      ->condition('status', TRUE)
      ->execute();
    // Remove already added sensors.
    $sensor_ids = array_diff($sensor_ids, array_keys($multigraph->getSensorsRaw()));
    ksort($sensor_ids);
    /** @var \Drupal\monitoring\Entity\SensorConfig[] $sensors */
    $sensors = $this->entityTypeManager
      ->getStorage('monitoring_sensor_config')
      ->loadMultiple($sensor_ids);
    uasort($sensors, "\Drupal\monitoring\Entity\SensorConfig::sort");

    $form['label'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('Label'),
      '#maxlength' => 60,
      '#default_value' => $multigraph->label(),
      '#required' => TRUE,
    );

    $form['id'] = array(
      '#type' => 'machine_name',
      '#title' => $this->t('ID'),
      '#maxlength' => 32,
      '#default_value' => $multigraph->id(),
      '#description' => $this->t("ID of the multigraph"),
      '#required' => TRUE,
      '#disabled' => !$multigraph->isNew(),
      '#machine_name' => array(
        'exists' => 'Drupal\monitoring_multigraph\Entity\Multigraph::load',
      ),
    );

    $form['description'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('Description'),
      '#maxlength' => 255,
      '#default_value' => $multigraph->getDescription(),
    );

    // Fieldset for sensor list elements.
    $form['sensor_list'] = array(
      '#type' => 'fieldset',
      '#title' => $this->t('Sensors'),
      '#prefix' => '<div id="selected-sensors">',
      '#suffix' => '</div>',
      '#tree' => FALSE,
    );

    // Create an array suitable for the sensor_add_select element.
    $sensors_options = array();
    foreach ($sensors as $sensor) {
      if ($sensor->isNumeric()) {
        $sensors_options[$sensor->id()] = $sensor->getCategory() . ': ' . $sensor->getLabel();
      }
    }

    // Select element for available sensors.
    $form['sensor_list']['add'] = array(
      '#type' => 'container',
      '#attributes' => array('class' => array('container-inline')),
    );
    $form['sensor_list']['add']['sensor_add_select'] = array(
      '#type' => 'select',
      '#title' => $this->t('Available sensors'),
      '#options' => $sensors_options,
      '#empty_value' => '',
    );

    $form['sensor_list']['add']['sensor_add_button'] = array(
      '#type' => 'submit',
      '#value' => $this->t('Add sensor'),
      '#ajax' => array(
        'wrapper' => 'selected-sensors',
        'callback' => array($this, 'sensorsReplace'),
        'method' => 'replaceWith',
      ),
      '#submit' => array('::addSensorSubmit'),
    );

    // Table for included sensors.
    $form['sensor_list']['sensors'] = array(
      '#type' => 'table',
      '#tree' => TRUE,
      '#header' => array(
        'category' => $this->t('Category'),
        'label' => $this->t('Sensor label'),
        'message' => $this->t('Sensor message'),
        'weight' => $this->t('Weight'),
        'operations' => $this->t('Operations'),
      ),
      '#empty' => $this->t(
        'Select and add sensors above to include them in this multigraph.'
      ),
      '#tabledrag' => array(
        array(
          'action' => 'order',
          'relationship' => 'sibling',
          'group' => 'sensors-table-weight',
        ),
      ),
    );

    // Fill the sensors table with form elements for each sensor.
    $weight = 0;
    foreach ($multigraph->getSensors() as $sensor) {
      $form['sensor_list']['sensors'][$sensor->id()] = array(
        'category' => array(
          '#markup' => $sensor->getCategory(),
        ),
        'label' => array(
          '#type' => 'textfield',
          '#default_value' => $sensor->label(),
          '#title' => $this->t('Custom sensor label'),
          '#title_display' => 'invisible',
          '#required' => TRUE,
          '#description' => $sensor->getDescription(),
        ),
        'message' => array(
          '#markup' => monitoring_sensor_run($sensor->id())->getMessage(),
        ),
        'weight' => array(
          '#type' => 'weight',
          '#title' => $this->t('Weight'),
          '#title_display' => 'invisible',
          '#default_value' => $weight++,
          '#attributes' => array(
            'class' => array('sensors-table-weight'),
          ),
        ),
        'operations' => array(
          '#type' => 'submit',
          '#value' => $this->t('Remove'),
          '#description' => $this->t('Exclude sensor from multigraph'),
          '#name' => 'remove_' . $sensor->id(),
          '#ajax' => array(
            'wrapper' => 'selected-sensors',
            'callback' => array($this, 'sensorsReplace'),
            'method' => 'replaceWith',
          ),
          '#submit' => array('::removeSensorSubmit'),
        ),
        '#attributes' => array(
          'class' => array('draggable'),
        ),
      );
    }

    $form['actions']['submit'] = array(
      '#type' => 'submit',
      '#value' => $this->t('Save'),
    );

    return $form;
  }

  /**
   * Returns the updated 'sensors_add' fieldset for replacement by ajax.
   *
   * @param array $form
   *   The updated form structure array.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state structure.
   *
   * @return array
   *   The updated form component for the selected sensors.
   */
  public function sensorsReplace(array $form, FormStateInterface $form_state) {
    return $form['sensor_list'];
  }

  /**
   * Adds sensor to entity when 'Add sensor' button is pressed.
   *
   * @param array $form
   *   The form structure array
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state structure.
   */
  public function addSensorSubmit(array $form, FormStateInterface $form_state) {
    $form_state->setRebuild();

    /** @var \Drupal\monitoring_multigraph\Entity\Multigraph $multigraph */
    $multigraph = $this->entity;

    // Add any selected sensor to entity.
    if ($sensor_name = $form_state->getValue(array('sensor_add_select'))) {
      $sensor_label = $this->entityTypeManager->getStorage('monitoring_sensor_config')->load($sensor_name)->getLabel();
      $multigraph->addSensor($sensor_name);
      $this->messenger()->addWarning($this->t('Sensor "@sensor_label" added. You have unsaved changes.', array('@sensor_label' => $sensor_label)));
    }
    else {
      $this->messenger()->addWarning($this->t('No sensor selected.'));
    }
  }

  /**
   * Removes sensor from entity when 'Remove' button is pressed for sensor.
   *
   * @param array $form
   *   The form structure array
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state structure.
   */
  public function removeSensorSubmit(array $form, FormStateInterface $form_state) {
    $form_state->setRebuild();

    /** @var \Drupal\monitoring_multigraph\MultigraphInterface $multigraph */
    $multigraph = $this->entity;

    // Remove sensor as indicated by triggering_element.
    $button_name = $form_state->getTriggeringElement()['#name'];
    $sensor_name = substr($button_name, strlen('remove_'));
    $sensor_label = $this->entityTypeManager->getStorage('monitoring_sensor_config')->load($sensor_name)->getLabel();
    $multigraph->removeSensor($sensor_name);
    $this->messenger()->addWarning($this->t('Sensor "@sensor_label" removed.  You have unsaved changes.', array('@sensor_label' => $sensor_label)));
  }

  /**
   * {@inheritdoc}
   */
  public function save(array $form, FormStateInterface $form_state) {
    parent::save($form, $form_state);
    $form_state->setRedirect('entity.monitoring_multigraph.list');
    $this->messenger()->addMessage($this->t('Multigraph settings saved.'));
  }

  /**
   * @inheritDoc
   */
  protected function copyFormValuesToEntity(EntityInterface $entity, array $form, FormStateInterface $form_state) {
    // Unset an empty sensors key or the sensors array is overwritten with an
    // empty string.
    if (!$form_state->getValue('sensors')) {
      $form_state->unsetValue('sensors');
    }
    parent::copyFormValuesToEntity($entity, $form, $form_state);
  }

}

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

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