View source
<?php
namespace Drupal\rdfui\Form;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\SafeMarkup;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\field\FieldConfigInterface;
use Drupal\rdfui\SchemaOrgConverter;
use Symfony\Component\DependencyInjection\ContainerInterface;
class FieldMappings extends FormBase {
protected $rdfConverter;
protected $displayContext = 'form';
protected $entityTypeId;
protected $bundle;
public static function create(ContainerInterface $container) {
return new static($container
->get('plugin.manager.field.field_type'), $container
->get('plugin.manager.field.widget'));
}
public function buildForm(array $form, FormStateInterface $form_state, $entity_type_id = NULL, $bundle = NULL) {
$this->entityTypeId = $entity_type_id;
$this->bundle = $bundle;
$this->rdfConverter = new SchemaOrgConverter();
$instances = array_filter(\Drupal::service('entity_field.manager')
->getFieldDefinitions($entity_type_id, $bundle), function ($field_definition) {
return $field_definition instanceof FieldConfigInterface;
});
$mappings = rdf_get_mapping($this->entityTypeId, $this->bundle);
$options = NULL;
$bundle_mapping = $mappings
->getBundleMapping();
if (!empty($bundle_mapping) && !empty($bundle_mapping['types']['0'])) {
$type = $bundle_mapping['types']['0'];
$options = $this->rdfConverter
->getTypeProperties($type);
}
else {
$options = $this->rdfConverter
->getListProperties();
}
$form += array(
'#entity_type' => $this->entityTypeId,
'#bundle' => $this->bundle,
'#fields' => array_keys($instances),
);
$table = array(
'#type' => 'table',
'#tree' => TRUE,
'#header' => array(
$this
->t('Label'),
$this
->t('RDF Property'),
$this
->t('Data Type'),
$this
->t('Status'),
),
'#regions' => $this
->getRegions(),
'#attributes' => array(
'class' => array(
'rdfui-field-mappings',
),
'id' => Html::getUniqueId('rdf-mapping'),
),
);
foreach ($instances as $name => $instance) {
$property = $mappings
->getFieldMapping($name);
$table[$name] = array(
'#attributes' => array(
'id' => Html::getUniqueId($name),
),
'label' => array(
'#markup' => $this
->t($instance
->getLabel()),
),
'rdf-predicate' => array(
'#id' => 'rdf-predicate',
'#type' => 'select',
'#title' => $this
->t('RDF Property'),
'#title_display' => 'invisible',
'#options' => $options,
'#empty_option' => '',
'#attached' => array(
'library' => array(
'rdfui/drupal.rdfui.autocomplete',
),
),
'#default_value' => !empty($property) ? $property['properties'][0] : '',
),
'type' => array(
'#title' => $this
->t('Data Type'),
'#title_display' => 'invisible',
'#markup' => $this
->t('Text'),
),
'status' => array(
'#title' => $this
->t('Status'),
'#title_display' => 'invisible',
'#markup' => !empty($property['properties'][0]) ? 'Mapped' : 'Unmapped',
),
);
}
$table['#regions']['content']['rows_order'] = array();
foreach (Element::children($table) as $name) {
$table['#regions']['content']['rows_order'][] = $name;
}
$form['fields'] = $table;
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#button_type' => 'primary',
'#value' => $this
->t('Save'),
);
return $form;
}
public function getRegions() {
return array(
'content' => array(
'title' => $this
->t('Content'),
'invisible' => TRUE,
),
);
}
public function validateForm(array &$form, FormStateInterface $form_state) {
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$form_values = $form_state
->getValue('fields');
$mapping = rdf_get_mapping($this->entityTypeId, $this->bundle);
if ($this->entityTypeId === 'node') {
$type = $mapping
->getFieldMapping('title');
if (empty($type)) {
$mapping
->setFieldMapping('title', array(
'properties' => array(
'schema:name',
),
));
}
}
foreach ($form_values as $key => $value) {
$mapping
->setFieldMapping($key, array(
'properties' => array(
$value['rdf-predicate'],
),
));
}
$mapping
->save();
$this
->messenger()
->addStatus($this
->t('Your settings have been saved.'));
}
public function getFormId() {
return "rdfui_field_mapping_form";
}
}