I have a content type that has a series of multi-value select fields. That I need users to select in relation to a value pulled from another node.
The best way to present this is to have a table that looks like this:
I’ve got the ‘bones’ of a hook_form_alter, and I can almost present what I need. However, I cannot seem to get my checkboxes/radios to appear in the grid. I am this far…
My form_alter function looks like:
function hnbuilder_form_node_scheme_of_work_form_alter(&$ form, FormStateInterface &$ form_state, &$ form_id){ /** check whether we passed a node reference into the form via ID in the url **/ if ($ _GET['id']){ $ nid = $ _GET['id']; /** if we didn't pass it in, we are editing the node **/ }else{ $ current_url = Url::fromRoute('<current>'); $ path = $ current_url->getInternalPath(); $ path_args = explode('/', $ path); $ thisnid = $ path_args[1]; $ thisnode = \Drupal\node\Entity\Node::load($ thisnid); $ nid = $ thisnode->get('field_related_unit')->target_id; } /** Load the referenced node */ $ node = \Drupal\node\Entity\Node::load($ nid); /** get the learning outcomes from the referenced node and put them into an array **/ $ lo = array( 0=>"", 1=>"LO1 ".$ node->field_lo1->value, 2=>"LO2 ".$ node->field_lo2->value, 3=>"LO3 ".$ node->field_lo3->value, 4=>"LO4 ".$ node->field_lo4->value ); /** create table headers **// $ header = array( 0 => 'Learning Outcome', 1 => 'Assignment 1', 2 => 'Assignment 2', 3 => 'Assignment 3', 4 => 'Assignment 4' ); /** an array of the checkbox/radio options from our content type each field has 4 options */ $ ffld = array( 1=>$ form['field_lo1_sow']['widget']['#options'], 2=>$ form['field_lo2_sow']['widget']['#options'], 3=>$ form['field_lo3_sow']['widget']['#options'], 4=>$ form['field_lo4_sow']['widget']['#options'] ); /** create a new array of options for the table */ $ options = array( 1=>array($ lo[1],$ ffld[1][1],$ ffld[1][2],$ ffld[1][3],$ ffld[1][4]), 2=>array($ lo[2],$ ffld[2][1],$ ffld[2][2],$ ffld[2][3],$ ffld[2][4]), 3=>array($ lo[3],$ ffld[3][1],$ ffld[3][2],$ ffld[3][3],$ ffld[3][4]), 4=>array($ lo[4],$ ffld[4][1],$ ffld[4][2],$ ffld[4][3],$ ffld[4][4]) ); /** build the tableselect **/ $ form['table'] = array( '#type' => 'tableselect', '#header' => $ header, '#options' => $ options, '#js_select' => FALSE ); return $ form;
}
I think I have several issues, and I’m hoping someone can help:
- I’m not sure that ‘tableselect’ is the right thing to be using, as it seems this only supports single selection (based on the table row).
- I’m unsure how to display the existing checkbox/radios as actual field items. I’m stuck getting their values.
Is there a way to achieve this? If so, I’d really appreciate some pointers.