You are here

function subform_form_child_pre_render in Subform 7

Pre-render callback for elements within subforms.

Prefixes the #name of all input elements except files in $form with $prefix

Registers this callback.

See also

subform_form_after_build()

1 string reference to 'subform_form_child_pre_render'
subform_form_after_build_traverse_children in ./subform.module
Helper function to set a #pre_render callback on all elements within a subform.

File

./subform.module, line 637
Defines a subform element type.

Code

function subform_form_child_pre_render($element) {
  $subform_name = $element['#subform_name'];
  if (!isset($element['#access']) || $element['#access']) {

    // Prefix the #attributes[name] of all input elements with the subform name.
    // Don't prefix #name as theme_form_element() needs the original #name to
    // set correct classes on which CSS and Javascript might depend.
    if (!empty($element['#name'])) {

      // Name set in #attributes has preference.
      $element_name = isset($element['#attributes']['name']) ? $element['#attributes']['name'] : $element['#name'];
      if ($element['#type'] == 'file') {
        $element_name = substr($element_name, 6, -1);
        $element['#attributes']['name'] = 'files[' . $subform_name . '-' . $element_name . ']';
      }
      elseif ($element['#type'] != 'subform') {
        $element_name = explode('[', $element_name, 2);
        $element_name[0] = '[' . $element_name[0] . ']';
        $element['#attributes']['name'] = $subform_name . implode('[', $element_name);
      }
    }

    // Prepend the special input key '_subform_element_name' to ajax settings.
    if (!empty($element['#attached']['js'])) {
      foreach ($element['#attached']['js'] as &$js) {
        if (isset($element['#id']) && is_array($js) && isset($js['data']['ajax'][$element['#id']])) {

          // Note that the submit array is rebuild so '_subform_element_name' is
          // the first element in the array, which is very important for subform_init().
          $js['data']['ajax'][$element['#id']]['submit'] = array(
            '_subform_element_name' => $subform_name,
          ) + $js['data']['ajax'][$element['#id']]['submit'];
        }
      }
    }

    // Correct input element names in #states.
    if (!empty($element['#states'])) {
      foreach ($element['#states'] as $state => $conditions) {
        $element['#states'][$state] = array();
        foreach ($conditions as $selector => $condition) {
          $selector = preg_replace('%\\[name="([^["]+)(.+)?"\\]%', '[name="' . $subform_name . '[$1]$2"]', $selector);
          $element['#states'][$state][$selector] = $condition;
        }
      }
    }
  }
  return $element;
}