<?phpnamespaceDrupal\my_module\Form;useDrupal\Core\Form\FormBase;useDrupal\Core\Form\FormStateInterface;useDrupal\eb\Entity\EbDefinition;/** * Custom grid provider form. */classMyProviderFormextendsFormBase{/** * {@inheritdoc} */publicfunctiongetFormId():string{return'my_provider_form';}/** * {@inheritdoc} */publicfunctionbuildForm(array$form,FormStateInterface$form_state,?EbDefinition$eb_definition=NULL):array{// Get current definition data$data=$eb_definition?['bundle_definitions'=>$eb_definition->get('bundle_definitions')??[],'field_definitions'=>$eb_definition->get('field_definitions')??[],]:[];// Build your custom interface$form['my_interface']=['#type'=>'container','#attributes'=>['id'=>'my-provider-container'],];// Hidden field to store data$form['definition_data']=['#type'=>'hidden','#default_value'=>json_encode($data),];// Attach your JavaScript library$form['#attached']['library'][]='my_module/provider';$form['#attached']['drupalSettings']['myProvider']=['data'=>$data,];$form['actions']=['#type'=>'actions',];$form['actions']['submit']=['#type'=>'submit','#value'=>$this->t('Save'),'#button_type'=>'primary',];return$form;}/** * {@inheritdoc} */publicfunctionsubmitForm(array&$form,FormStateInterface$form_state):void{// Process submitted data$data=json_decode($form_state->getValue('definition_data'),TRUE);// Update the definition entity$definition=$form_state->get('eb_definition');if($definition){$definition->set('bundle_definitions',$data['bundle_definitions']??[]);$definition->set('field_definitions',$data['field_definitions']??[]);$definition->save();$this->messenger()->addStatus($this->t('Definition saved.'));}}}
// js/my-provider.js(function(Drupal,drupalSettings,once){'use strict';Drupal.behaviors.myProvider={attach:function(context,settings){once('my-provider','#my-provider-container',context).forEach(function(container){// Initialize your custom interfaceconstdata=drupalSettings.myProvider?.data||{};// Build your UI and update hidden field when data changes.functionupdateData(newData){consthiddenField=document.querySelector('[name="definition_data"]');if(hiddenField){hiddenField.value=JSON.stringify(newData);}}});}};})(Drupal,drupalSettings,once);
// Get bundles for entity typeasyncfunctiongetBundles(entityType){constresponse=awaitfetch(`/eb/api/bundles/${entityType}`,{headers:{'X-Requested-With':'XMLHttpRequest'},});returnresponse.json();}// Get field configurationasyncfunctiongetEntityConfig(entityType,bundle){constresponse=awaitfetch(`/eb/api/entity-config/${entityType}/${bundle}`,{headers:{'X-Requested-With':'XMLHttpRequest'},});returnresponse.json();}