rdfui-8.x-1.0-beta4/src/Form/FieldMappings.php
src/Form/FieldMappings.php
<?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;
/**
* RDF UI Field Mapping form.
*/
class FieldMappings extends FormBase {
/**
* The EasyRdfConverter.
*
* @var \Drupal\rdfui\EasyRdfConverter
*/
protected $rdfConverter;
protected $displayContext = 'form';
protected $entityTypeId;
protected $bundle;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container)
{
return new static(
$container->get('plugin.manager.field.field_type'),
$container->get('plugin.manager.field.widget')
);
}
/**
* {@inheritdoc}
*/
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();
// Gather bundle information.
$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'),
),
);
// Fields.
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;
}
/**
* {@inheritdoc}
*/
public function getRegions() {
return array(
'content' => array(
'title' => $this->t('Content'),
'invisible' => TRUE,
// @todo Bring back this message in https://drupal.org/node/1963340.
),
);
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
// @TODO implement method if validation is required.
}
/**
* Overrides \Drupal\field_ui\FormDisplayOverview::submitForm().
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$form_values = $form_state->getValue('fields');
$mapping = rdf_get_mapping($this->entityTypeId, $this->bundle);
// Add mapping for title field.
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.'));
}
/**
* Returns a unique string identifying the form.
*
* @return string
* The unique string identifying the form.
*/
public function getFormId() {
return "rdfui_field_mapping_form";
}
}
