funder_field-1.1.0-alpha1/src/Plugin/Field/FieldWidget/FunderFieldDefault.php

src/Plugin/Field/FieldWidget/FunderFieldDefault.php
<?php

namespace Drupal\funder_field\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\Validator\ConstraintViolationInterface;
use Drupal\Component\Utility\Html;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Component\Utility\NestedArray;
use Drupal\Component\Utility\UrlHelper;

/**
 * Plugin implementation of the 'default' widget.
 *
 * @FieldWidget(
 *   id = "funder_field_widget_default",
 *   module = "funder_field",
 *   label = @Translation("Default"),
 *   field_types = {
 *     "funder_field"
 *   }
 * )
 */

class FunderFieldDefault extends \Drupal\Core\Field\WidgetBase
{

  //Called when Funder field's autocomplete closes. Passes the funder id to the autocomplete function for Award field
  public function myAjaxCallback(array &$form, FormStateInterface $form_state)
  {
    $triggering = $form_state->getTriggeringElement();
    $triggering_element_no = $triggering['#parents'][1];
    $value = $form_state->getValue($triggering['#parents']);

    $value_split = explode("( id: ", $value);
    $has_id = FALSE;
    if (count($value_split) > 1)
    {
      $value_split_again = explode(" )", $value_split[1]);
      if (count($value_split_again) > 0) {
        $value = $value_split_again[0];
        $has_id = TRUE;
      }
    }
    # Gets the field name
    $field_name = $triggering['#array_parents'][0];
    /*
    $url_encoded_org_name = urlencode($value);
    if ($value) {
      $query_str = 'https://api.crossref.org/funders/';
      if ($has_id === FALSE)
        $query_str = 'https://api.crossref.org/funders?query=';
      if ($has_id) {
        $url_encoded_org_name = $url_encoded_org_name . "/works";
      }
      //$response2 = \Drupal::httpClient()->get($query_str . $url_encoded_org_name);
    } */

    unset($form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award']['#disabled']);
    unset($form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award']['#attributes']['disabled']);
    unset($form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award_url']['#disabled']);
    unset($form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award_url']['#attributes']['disabled']);

    unset($form[$field_name]['widget'][$triggering_element_no]['award_url']['#disabled']);
    //form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award']['#autocomplete_route_name'] = 'funder_field.autocompleteAward';
    if ($has_id)
      $form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award']['#autocomplete_route_parameters'] = ['funder_id' => $value];
    else
      $form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award']['#autocomplete_route_parameters'] = ['funder_id' => ''];

    $form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award']['#attributes']["autocomplete"] = 'off';
    $form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award']['#attributes']["role"] = 'presentation';
    $form[$field_name]['widget'][$triggering_element_no]['funder_detail']['award']['#attributes']["data-autocomplete-path"] = '/autocomplete/funder_field/'.$value;

    return $form[$field_name]['widget'][$triggering_element_no]['funder_detail'];
  }

  /**
     * @inheritDoc
     */
  public function formElement(\Drupal\Core\Field\FieldItemListInterface $items, $delta, array $element, array &$form, \Drupal\Core\Form\FormStateInterface $form_state)
  {
    $cardinality = $this->fieldDefinition->getFieldStorageDefinition()->getCardinality();
    if ($cardinality == 1) {
      $element['funder_begin_label'] = array(
        '#type' => 'markup',
        '#markup' => '<label>' . $this->t($this->fieldDefinition->getLabel()) . '</label><hr>',
      );
    }
    $element['funder_name'] = array(
      '#title' => $this->t('Funder Name'),
      '#type' => 'textfield',
      '#size' => '80',
      '#maxlength' => 255,
      '#autocomplete_route_name' => 'funder_field.autocomplete',
      '#default_value' => isset($items[$delta]->funder_name) ? $items[$delta]->funder_name : NULL,
      '#description' => $this->t('Example - National Science Foundation'),
      '#attributes' => [
        // DISABLES BROWSER AUTOCOMPLETE
        "autocomplete" => "off",
        "role" => "presentation",
        "id" => "1234567",
      ],
      '#ajax' => [
        'callback' => [$this, 'myAjaxCallback'],
        'event' => 'autocompleteclose',
        'wrapper' => "org-data-wrapper-$delta"
      ],
    );

    $element['funder_detail'] = [
      '#type' => 'container',
      '#attributes' => ['id' => "org-data-wrapper-$delta"],
    ];

    $element['funder_detail']['award'] = array(
      '#title' => $this->t('Award'),
      '#type' => 'textfield',
      '#size' => '80',
      '#default_value' => isset($items[$delta]->award) ? $items[$delta]->award : NULL,
      '#description' => $this->t('Example - DMR-0748516'),
      '#maxlength' => 2048,
      '#autocomplete_route_name' => 'funder_field.autocompleteAward',
      '#autocomplete_route_parameters' => ['funder_id' => '100000001'],
      //'#disabled' => TRUE,
      '#states' => [
        'disabled' => [
          ':input[id="1234567"]' => ['value' => ''],
        ],
      ],
    );

    $element['award'] = array(
      '#title' => $this->t('Award'),
      '#type' => 'hidden',
      '#maxlength' => 2048,
    );

    $element['funder_detail']['award_url'] = array(
      '#title' => $this->t('Award URL'),
      '#type' => 'textfield',
      '#size' => '80',
      '#default_value' => isset($items[$delta]->award_url) ? $items[$delta]->award_url : NULL,
      '#description' => $this->t('Example - https://www.nsf.gov/awardsearch/showAward?AWD_ID=your_award_id&HistoricalAwards=false'),
      '#maxlength' => 2048,
      //'#disabled' => TRUE,
      '#states' => [
        'disabled' => [
          ':input[id="1234567"]' => ['value' => ''],
        ],
      ],
    );

    $element['award_url'] = array(
      '#title' => $this->t('Award URL'),
      '#type' => 'hidden',
      '#maxlength' => 2048,
    );

    if ($this->getSetting('showFunderUrl')) {
      $element['funder_url'] = array(
        '#title' => $this->t('Funder URL'),
        '#type' => 'textfield',
        '#size' => '80',
        '#default_value' => isset($items[$delta]->funder_url) ? $items[$delta]->funder_url : NULL,
        '#description' => $this->t('Example - https://nsf.org'),
        '#maxlength' => 2048,
      );
      /*
      $element['funder_url'] = array(
        '#title' => $this->t('Funder URL'),
        '#type' => 'hidden',
        '#maxlength' => 2048,
      );*/
    }

    if ($this->getSetting('showFunderId')) {
      $element['funder_id'] = array(
        '#title' => $this->t('Funder ID'),
        '#type' => 'textfield',
        '#size' => '80',
        '#maxlength' => 255,
        '#default_value' => isset($items[$delta]->funder_id) ? $items[$delta]->funder_id : NULL,
        '#description' => $this->t('Example - 100000001'),
      );
    }

    if ($this->getSetting('showFunderDOI')) {
      $element['funder_doi'] = array(
        '#title' => $this->t('Funder DOI'),
        '#type' => 'textfield',
        '#size' => '80',
        '#default_value' => isset($items[$delta]->funder_doi) ? $items[$delta]->funder_doi : NULL,
        '#description' => $this->t('Example - 10.13039/100000001'),
        '#maxlength' => 2048,
      );
    }

    if ($cardinality == 1) {
      $element['funder_end_label'] = array(
        '#type' => 'markup',
        '#markup' => '<hr>',
      );
    }
    //$element['#attributes']['class'][] = 'funder-field-elements';
    //$element['#attached']['library'][] = 'funder_field/funder_field_widget';
    //ksm($form_state);
    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public static function defaultSettings()
  {
    return array_merge(
      [
        'showFunderUrl' => FALSE,
        'showFunderId' => FALSE,
        'showFunderDOI' => FALSE,
      ],
      parent::defaultSettings());
  }

  /**
   * {@inheritdoc}
   */
  public function settingsSummary() {
    $this->sanitizeSettings();

    $summary = [];
    if ($this->getSetting('showFunderUrl') === FALSE) {
      $summary[] = $this->t('Funder URL field: hidden');
    }
    else {
      $summary[] = $this->t('Funder URL field: shown');
    }
    if ($this->getSetting('showFunderId') === FALSE) {
      $summary[] = $this->t('Funder ID field: hidden');
    }
    else {
      $summary[] = $this->t('Funder ID field: shown');
    }
    if ($this->getSetting('showFunderDOI') === FALSE) {
      $summary[] = $this->t('Funder DOI field: hidden');
    }
    else {
      $summary[] = $this->t('Funder DOI field: shown');
    }
    return $summary;
  }

  /**
   * {@inheritdoc}
   */
  public function settingsForm(array $form, FormStateInterface $formState) {
    $this->sanitizeSettings();

    $marker = rand();
    //$elements = [];

    $form['showFunderUrl'] = [
      '#title'         => $this->t('Show funder url'),
      '#type'          => 'checkbox',
      '#default_value' => $this->getSetting('showFunderUrl'),
      '#weight'        => 1,
      '#wrapper_attributes' => [
        'class'        => [
          'formatter_suite-org-url-link-show-org-url',
        ],
      ],
      '#attributes'    => [
        'class'        => [
          'showFunderUrl-' . $marker,
        ],
      ],
    ];

    $form['showFunderId'] = [
      '#title'         => $this->t('Show funder id'),
      '#type'          => 'checkbox',
      '#default_value' => $this->getSetting('showFunderId'),
      '#weight'        => 1,
      '#wrapper_attributes' => [
        'class'        => [
          'formatter_suite-org-url-link-show-org-url',
        ],
      ],
      '#attributes'    => [
        'class'        => [
          'showFunderId-' . $marker,
        ],
      ],
    ];

    $form['showFunderDOI'] = [
      '#title'         => $this->t('Show funder DOI'),
      '#type'          => 'checkbox',
      '#default_value' => $this->getSetting('showFunderDOI'),
      '#weight'        => 1,
      '#wrapper_attributes' => [
        'class'        => [
          'formatter_suite-org-url-link-show-org-url',
        ],
      ],
      '#attributes'    => [
        'class'        => [
          'showFunderDOI-' . $marker,
        ],
      ],
    ];
    return $form;
  }

  protected function sanitizeSettings() {
    $showFunderUrl       = $this->getSetting('showFunderUrl');
    $showFunderUrl       = boolval($showFunderUrl);
    $this->setSetting('showFunderUrl', $showFunderUrl);

    $showFunderId       = $this->getSetting('showFunderId');
    $showFunderId      = boolval($showFunderId);
    $this->setSetting('showFunderId', $showFunderId);

    $showFunderDOI      = $this->getSetting('showFunderDOI');
    $showFunderDOI      = boolval($showFunderDOI);
    $this->setSetting('showFunderId', $showFunderDOI);
  }

  /**
   * {@inheritdoc}
   */
  public function errorElement(array $element, ConstraintViolationInterface $violation, array $form, FormStateInterface $form_state) {
    return isset($violation->arrayPropertyPath[0]) ? $element[$violation->arrayPropertyPath[0]] : $element;
  }

  /**
   * {@inheritdoc}
   */
  public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
    foreach ($values as $delta => $value) {
      if ($value['funder_name'] === '') {
        $values[$delta]['funder_name'] = NULL;
      }
      else
      {
        if (!is_null($value['funder_detail']['award']) && !empty($value['funder_detail']['award']))
          $values[$delta]['award'] = $value['funder_detail']['award'];

        if (!is_null($value['funder_detail']['award_url']) && !empty($value['funder_detail']['award_url']))
          $values[$delta]['award_url'] = $value['funder_detail']['award_url'];

        /*
        if ($this->getSetting('showFunderUrl')) {
          if (!is_null($value['funder_detail']['funder_url']) && !empty($value['funder_detail']['funder_url']))
          $values[$delta]['funder_url'] = $value['funder_detail']['funder_url'];
        }

        if ($this->getSetting('showFunderId')) {
          if (!is_null($value['funder_detail']['funder_id']) && !empty($value['funder_detail']['funder_id']))
          $values[$delta]['funder_id'] = $value['funder_detail']['funder_id'];
        }

        if ($this->getSetting('showFunderDOI')) {
          if (!is_null($value['funder_detail']['funder_doi']) && !empty($value['funder_detail']['funder_doi']))
          $values[$delta]['funder_doi'] = $value['funder_detail']['funder_doi'];
        }*/
      }
    }

    return $values;
  }
}

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

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