library_manager-8.x-1.0/src/Form/LibraryDefinitionJsForm.php

src/Form/LibraryDefinitionJsForm.php
<?php

namespace Drupal\library_manager\Form;

use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

/**
 * Library definition js form.
 *
 * @property \Drupal\library_manager\LibraryDefinitionInterface $entity
 */
class LibraryDefinitionJsForm extends EntityForm {

  /**
   * {@inheritdoc}
   */
  public function form(array $form, FormStateInterface $form_state) {

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

    $defaults = [
      'file_name' => '',
      'code' => '',
      'preprocess' => TRUE,
      'minified' => FALSE,
      'weight' => 0,
      'external' => FALSE,
      'url' => '',
      'header' => FALSE,
    ];

    $route_match = $this->getRouteMatch();
    $file_id = $route_match->getParameter('file_id');
    if (!$route_match->getParameter('is_new')) {
      // This JS file should exist in the entity.
      $data = $this->entity->getJsFile($file_id);
      if (!$data) {
        throw new NotFoundHttpException();
      }
      $defaults = $data + $defaults;
    }

    $form['file_id'] = [
      '#type' => 'value',
      '#value' => $file_id,
    ];

    $form['file_name'] = [
      '#type' => 'textfield',
      '#title' => $this->t('File name'),
      '#required' => TRUE,
      '#placeholder' => 'example.js',
      '#default_value' => $defaults['file_name'],
    ];

    $form['header'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Load the script in the header of the page'),
      '#default_value' => $defaults['header'],
    ];

    $form['preprocess'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Preprocess'),
      '#default_value' => $defaults['preprocess'],
    ];

    $form['minified'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Minified'),
      '#default_value' => $defaults['minified'],
    ];

    $weights = range(-10, 0);
    $form['weight'] = [
      // Use 'select' because 'weight' element does not support '#min' property.
      '#type' => 'select',
      '#title' => $this->t('Weight'),
      '#default_value' => $defaults['weight'],
      '#options' => array_combine($weights, $weights),
    ];

    $form['external'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('External'),
      '#default_value' => $defaults['external'],
    ];

    $form['code'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Code'),
      '#default_value' => $defaults['code'],
      '#attributes' => [
        'class' => ['library-definition-edit-code'],
      ],
      '#states' => ['visible' => [':input[name="external"]' => ['checked' => FALSE]]],
      '#rows' => 15,
      '#codemirror' => [
        'mode' => 'javascript',
        'lineNumbers' => TRUE,
        'buttons' => [
          'undo',
          'redo',
          'enlarge',
          'shrink',
        ],
      ],
    ];

    $form['url'] = [
      '#type' => 'url',
      '#title' => $this->t('Url'),
      '#default_value' => $defaults['url'],
      '#states' => ['visible' => [':input[name="external"]' => ['checked' => TRUE]]],

    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $file_name = $form_state->getValue('file_name');
    if (!preg_match('#^\w[\w\-\.\/]*\.js$#i', $file_name) || strpos($file_name, '..') !== FALSE) {
      $form_state->setError($form['file_name'], $this->t('The file name is not correct.'));
    }
  }

  /**
   * Returns the action form element for the current entity form.
   */
  protected function actionsElement(array $form, FormStateInterface $form_state) {

    $element = parent::actionsElement($form, $form_state);

    $file_id = $form['file_id']['#value'];

    if (isset($file_id)) {
      // Change link url to point on JS delete form instead of entity delete
      // form.
      $route_parameters = [
        'library_definition' => $this->entity->id(),
        'file_id' => $form['file_id']['#value'],
      ];
      $element['delete']['#url'] = Url::fromRoute('entity.library_definition.delete_js_form', $route_parameters);
    }
    else {
      $element['delete']['#access'] = FALSE;
    }

    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function save(array $form, FormStateInterface $form_state) {

    $values = $form_state->getValues();
    $file_id = $values['file_id'];

    $js = $this->entity->get('js');
    if (!$file_id) {
      $ids = array_keys($js);
      $file_id = count($ids) > 0 ? max($ids) + 1 : 1;
    }

    $js[$file_id] = [
      'file_name' => $values['file_name'],
      'preprocess' => $values['preprocess'],
      'minified' => $values['minified'],
      'weight' => $values['weight'],
      'external' => $values['external'],
      'code' => $values['code'],
      'url' => $values['url'],
      'header' => $values['header'],
    ];

    $this
      ->entity
      ->set('js', $js)
      ->save();

    $this->messenger()->addStatus($this->t('The JS file has been saved.'));

    $form_state->setRedirectUrl($this->entity->toUrl('edit-form'));
  }

}

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

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