link_orcid-1.0.0-rc1/link_orcid.module
link_orcid.module
<?php
/**
* @file
*/
use Drupal\Core\Form\FormStateInterface;
use Drupal\user\UserInterface;
/**
* Implements hook_form_FORM_ID_alter().
*/
function link_orcid_form_user_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
/** @var \Drupal\Core\Entity\EntityFormInterface $form_object */
$form_object = $form_state->getFormObject();
$account = $form_object->getEntity();
$config = \Drupal::config('link_orcid.settings');
$field_name = $config->get('user_field');
if ($field_name && isset($form[$field_name])) {
// Disable access for the ORCID field.
$form[$field_name]['#attributes']['readonly'] = 'readonly';
$form[$field_name]['#disabled'] = TRUE;
}
if (
$account instanceof UserInterface &&
\Drupal::currentUser()->id() == $account->id() &&
\Drupal::currentUser()->hasPermission('link own orcid')
) {
if ($field_name && isset($form[$field_name])) {
// Show Unlink or Link button depending on field value.
$orcid_value = $account->get($field_name)->value;
if (!empty($orcid_value)) {
$form[$field_name]['#suffix'] = (
$form[$field_name]['#suffix'] ?? ''
) . '<a class="button button--danger" style="margin-left:10px;" href="/link-orcid/unlink">' . t('Unlink ORCID') . '</a>';
}
else {
$form[$field_name]['#suffix'] = (
$form[$field_name]['#suffix'] ?? ''
) . '<a class="button button--primary" style="margin-left:10px;" href="/link-orcid/start">' . t('Link ORCID') . '</a>';
}
}
else {
// Fallback: show in a details element if field not found.
$form['link_orcid'] = [
'#type' => 'details',
'#title' => t('ORCID'),
'#open' => TRUE,
'#weight' => -50,
];
$orcid_value = $account->get($field_name)->value ?? '';
if (!empty($orcid_value)) {
$form['link_orcid']['link_button'] = [
'#type' => 'markup',
'#markup' => '<a class="button button--danger" href="/link-orcid/unlink">' . t('Unlink ORCID') . '</a>',
];
}
else {
$form['link_orcid']['link_button'] = [
'#type' => 'markup',
'#markup' => '<a class="button button--primary" href="/link-orcid/start">' . t('Link ORCID') . '</a>',
];
}
}
}
}
