diff --git a/css/metadata_profile.css b/css/metadata_profile.css
index 9f8670e..ca675b4 100644
--- a/css/metadata_profile.css
+++ b/css/metadata_profile.css
@@ -6,7 +6,7 @@
}
.field-info {
padding-bottom: 3rem;
- border-bottom: gainsboro 1px solid;
+ border-bottom: gainsboro 2px solid;
margin-bottom: 3rem;
}
.field-info h2 {
diff --git a/src/Controller/MetadataProfileController.php b/src/Controller/MetadataProfileController.php
index 29020ce..91f0583 100644
--- a/src/Controller/MetadataProfileController.php
+++ b/src/Controller/MetadataProfileController.php
@@ -5,6 +5,7 @@ namespace Drupal\metadata_profile\Controller;
use Drupal\Core\Config\Config;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Entity\ContentEntityForm;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldDefinitionInterface;
@@ -14,6 +15,7 @@ use Drupal\Core\Link;
use Drupal\Core\Messenger\MessengerTrait;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Url;
+use Drupal\node\NodeForm;
use Drupal\system\FileDownloadController;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
@@ -142,10 +144,8 @@ class MetadataProfileController extends ControllerBase {
'#type' => 'container',
'#weight' => '9',
];
- // Refactor this to not loop; each thing called by displayField should use metadata profile.
- $field_definitions = $this->entityFieldManager->getFieldDefinitions($this->entityTypeBundleOf, $this->entityBundle);
- foreach ($field_definitions as $field_name => $field_definition) {
- $build['fields'][$field_name] = $this->buildField($metadata_profile[$field_name]);
+ foreach ($metadata_profile as $field_name => $field_profile) {
+ $build['fields'][$field_name] = $this->buildField($field_profile);
}
return $build;
@@ -227,7 +227,7 @@ class MetadataProfileController extends ControllerBase {
// * 'facet_machine_name'
// * 'facet_source'
// * 'url_alias'
- // * 'block_visible'
+ // * 'block_visible' -- not yet implemented.
$metadata_profile = [];
$field_definitions = $this->entityFieldManager->getFieldDefinitions($this->entityTypeBundleOf, $this->entityBundle);
@@ -249,6 +249,7 @@ class MetadataProfileController extends ControllerBase {
];
$metadata_profile[$field_name]['search_api'] = $this->getSearchApi($field_definition);
}
+ $metadata_profile = $this->addWeights($metadata_profile);
return $metadata_profile;
}
@@ -350,6 +351,7 @@ class MetadataProfileController extends ControllerBase {
$display ? $this->formatListForTable($field_profile['target_bundles']) : $field_profile['target_bundles'],
$field_profile['search_api']['in_search_api'] ? 'Indexed' : '',
$field_profile['search_api']['has_facet'] ? 'Facet' : '',
+ $field_profile['weight'],
];
}
}
@@ -368,6 +370,8 @@ class MetadataProfileController extends ControllerBase {
$this->t('Target bundles'),
$this->t('In Search API'),
$this->t('Has Facet'),
+ $this->t('Weight'),
+
// TODO: add more columns
];
}
@@ -379,6 +383,7 @@ class MetadataProfileController extends ControllerBase {
$render_array = [
'#type' => 'container',
'#attributes' => ['class' => ['field-info']],
+ '#weight' => $field_profile['weight'],
// TODO: add weight here from form display defaults.
'title' => [
'#plain_text' => $field_profile['label'],
@@ -396,16 +401,19 @@ class MetadataProfileController extends ControllerBase {
'#header' => ['Field Configuration',''],
'#rows' => $this->getFieldTableRows($field_profile),
'#attributes' => ['class' => ['field-info-table']],
+ '#prefix' => '
' . $this->t('Field Information') . '
',
],
'description' => [
'#type' => 'markup',
'#markup' => $field_profile['description'] ?: $this->t('[No description]'),
- '#prefix' => 'Description: ',
+ '#prefix' => 'Description:
',
],
'search_api' => $this->formatSearchApi($field_profile),
'facets' => $this->formatFacets($field_profile),
];
+
+
}
return $render_array;
@@ -493,8 +501,20 @@ class MetadataProfileController extends ControllerBase {
/**
* This does not work - most fields dont have a form weight specified in getDisplayOptions.
*/
- protected function formatWeight(FieldDefinitionInterface $field_definition) {
- return $field_definition->getDisplayOptions('form')['weight'];
+ protected function getWeight(string $field_name, array $form) {
+ if (isset($form[$field_name])) {
+ $local_weight = $form[$field_name]['#weight'];
+ if ($parent = $form['#group_children'][$field_name]) {
+ $parent_weight = $this->getWeight($parent, $form);
+ return $this->combine_weights($parent_weight, $local_weight);
+ }
+ else {
+ return $local_weight;
+ }
+ }
+ else {
+ return 9999;
+ }
}
protected function formatCardinality(FieldDefinitionInterface $field_definition) {
@@ -511,7 +531,7 @@ class MetadataProfileController extends ControllerBase {
protected function formatCreateNew(FieldDefinitionInterface $field_definition) {
if (in_array($field_definition->getType(), ['entity_reference', 'typed_relation'])) {
- $create_new_bundle = $field_definition->getSetting('handler_settings')['auto_create_bundle'] || '';
+ $create_new_bundle = $field_definition->getSetting('handler_settings')['auto_create_bundle'] ? $create_new_bundle = $field_definition->getSetting('handler_settings')['auto_create_bundle'] : '';
$create_new = $field_definition->getSetting('handler_settings')['auto_create'] || '';
if ($create_new) {
return $create_new_bundle ? 'Create new (' . $create_new_bundle . ')' : 'Create new';
@@ -579,6 +599,7 @@ class MetadataProfileController extends ControllerBase {
'col6' => $this->t('Has facet'),
],
'#rows' => [],
+ '#prefix' => '' . $this->t('Search API fields') . '
',
];
foreach ($field_profile['search_api']['fields'] as $search_api_field) {
$build['#rows'][] = $this->formatSearchApiField($search_api_field);
@@ -709,6 +730,7 @@ class MetadataProfileController extends ControllerBase {
$this->t('Block is placed'),
],
'#rows' => [],
+ '#prefix' => '' . $this->t('Search Facets') . '
',
];
foreach ($field_profile['search_api']['fields'] as $field) {
if ($field['has_facet']) {
@@ -740,4 +762,45 @@ class MetadataProfileController extends ControllerBase {
];
}
+ private function addWeights(array $metadata_profile)
+ {
+ if ($this->entityTypeBundleOf == 'node') {
+ $node = \Drupal\node\Entity\Node::create(['type' => $this->entityBundle]);
+ $form = \Drupal::service('entity.form_builder')->getForm($node);
+ foreach($metadata_profile as $field_name => $field_profile) {
+ $metadata_profile[$field_name]['weight'] = $this->getWeight($field_name, $form);
+ }
+ $weights = array_column($metadata_profile, 'weight');
+
+ array_multisort($weights, SORT_ASC, $metadata_profile);
+
+ }
+
+ return $metadata_profile;
+ }
+
+ private function combine_weights($parent_weight, $local_weight)
+ {
+ $parent_int = (string)floor($parent_weight);
+ $parent_fraction = (string)($parent_weight - $parent_int);
+ $parent_fraction = str_replace('0.', '', $parent_fraction);
+ $local_int = (string)floor($local_weight);
+ $local_fraction = (string)($local_weight - $local_int);
+ $combined_weight = $parent_int;
+ $combined_weight .= '.';
+ if ($parent_fraction) {
+ # pad so its length is a multiple of 2
+ $length = mb_strlen($parent_fraction);
+ if (fmod($length, 2) != 0){
+ $parent_fraction .= '0';
+ }
+ $combined_weight .= $parent_fraction;
+ }
+ $combined_weight .= str_pad($local_int, 2, '0', STR_PAD_LEFT);
+ if ($local_fraction) {
+ $a=2;
+ }
+ return (float)$combined_weight;
+ }
+
}