You are here

function multiselect_widget in Multiselect 5

Same name and namespace in other branches
  1. 5.2 multiselect.module \multiselect_widget()
  2. 6 multiselect.module \multiselect_widget()

Implementation of hook_widget @todo Temporary 'print_r's need removing @todo Is the if ($field['widget']['type'] == 'multiselect_select' necessary? @todo Doesn't seem to populate list when in 'preview'

File

./multiselect.module, line 61
Allows users to select multiple items in an easier way than the normal node-reference widget

Code

function multiselect_widget($op, &$node, $field, &$node_field) {
  print_r("op = {$op}. field['widget']['type'] = " . $field['widget']['type'] . "<br/>\n");

  //necessary to get list of nodes that can be included in this nodereference
  include_once drupal_get_path('module', 'content') . '/nodereference.module';
  if ($field['widget']['type'] == 'multiselect_select') {
    switch ($op) {
      case 'prepare form values':

        //puts node_field (original) values into a temporary bit of the array called default nids
        $node_field_transposed = content_transpose_array_rows_cols($node_field);
        $node_field['default nids'] = $node_field_transposed['nid'];
        break;
      case 'form':

        //generates form object
        $form = array();
        $selectedoptions = array();
        $notselectedoptions = array();

        //gets list of all nodes we can reference
        $options = _nodereference_potential_references($field, true);

        //for each node, check if it's already selected. If it is, add it to the selected list
        foreach ($options as $key => $value) {
          $inarray = FALSE;
          if (is_array($node_field['default nids'])) {
            foreach ($node_field['default nids'] as $n => $nid) {
              if ($nid == $key) {
                $inarray = TRUE;
              }
            }
          }
          if ($inarray) {
            $selectedoptions[$key] = _nodereference_item($field, $value);
          }
          else {
            $notselectedoptions[$key] = _nodereference_item($field, $value);
          }
        }

        //useful variables
        $fieldname = $field['field_name'];
        $addbutton = $fieldname . "_add";
        $removebutton = $fieldname . "_remove";
        $selfield = $fieldname . "_sel";
        $unselfield = $fieldname . "_unsel";

        //call methods to create prefix (ie the non-selected table, etc)
        $prefix = "<div class='container-inline'>";
        $prefix .= _html_for_notselected_box($notselectedoptions, $unselfield, $fieldname);
        $prefix .= _html_for_buttons($fieldname);

        //create the form item
        $form[$fieldname] = array(
          '#tree' => TRUE,
        );
        $form[$fieldname]['nids'] = array(
          '#type' => 'select',
          '#options' => $selectedoptions,
          '#size' => 10,
          '#prefix' => $prefix,
          '#suffix' => "\n</div>\n",
          '#multiple' => TRUE,
          '#attributes' => array(
            'class' => "{$selfield} multiselect_sel",
            'id' => $fieldname,
          ),
          '#default_value' => $node_field['default nids'],
        );

        //return the form array
        return $form;
      case 'process form values':

        //Replace the node values
        $node_field = content_transpose_array_rows_cols(array(
          'nid' => $node_field['nids'],
        ));
        break;
      case 'submit':
        break;
    }
  }
}