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;
}
}
