At the moment there is no way to pass results from one subform submit handlers' execution into another. E.g. we want to create a multiform, that would allow anonymous users to register and create a node under the newly registered user at once (as it is done in Inline Registration module). The problem is that when node form is built, it obviously doesn't contain new user uid, so when it is submitted it is assigned to anonymous user. Also we don't want to submit any subform if validation failed for any other. Thus, we need to validate all subforms before any of them is submitted. As a solution, all subforms' submits could be delayed until all of them are validated and fired only in case validation was successfull.

Support from Acquia helps fund testing for Drupal Acquia logo

Comments

kpv’s picture

Status: Active » Needs review
FileSize
24.27 KB

Here is a patch.

Changes list:

  • Delayed submit and synchronous validation
    Submit handlers are executed after all subforms' were successfully validated. Relates to #1663212: Form processing ignores validation errors.
  • hook_multiform_alter() added
    The hook allows to add handlers that would alter subforms' data before and after every single subform submission, or trigger specific actions depending on multiform submission stage. Also subforms' execution order can be changed through this hook.
  • ajax support added
    Fixes #1785184: Multiform and AJAX for the case when standard path 'system/path' is used.
  • hook_multiform_ajax_alter() added
    The hook allows to replace paths for custom ajax callbacks. See multiform_multiform_ajax_alter() for an example.
  • multiform settings
    Although arguments can be passed to multiform_get_form() in old fasion, a new method is proposed.

Settings example

$multiform = array(
  // Optional. Used to determine certain multiform.
  '#multiform_id' => 'custom_multiform',
  // Can be passed into multiform_get_form() or is generated automatically
  // if arguments are passed in old fasion.
  // All subforms should be added here.
  '#subforms' => array(
    0 => array(
      'form_id' => 'user_register_form',  // Required.
      // Subform arguments.
      'args' => array(
         ...
      ),
      // Array of functions that are to be executed before subform submission.
      // Other subforms' data can be altered here.
      '#before_execute' => array(  // executed before form submit
        'custom_before_execute',
      ),
      // Same as above but after execution performed.
      '#after_execute' => array(  // executed after form submit
        'custom_after_execute',
      ),
      // Subform tag. Used to determine certain subform and define it's index
      // using multiform_get_index_by_tag().
      '#tag' => 'custom_subform_tag',
      '#weight' => 0, // Optional. Determines subforms' submission order.
    ),
    1 => array(
       ...
       ...
       ...
    ),
  ),
);

$form = multiform_get_form($multiform);

The patch should be consistent with 1.0 version implementations but anyway should be used with caution on production sites.

vlad.pavlovic’s picture

Status: Needs review » Needs work

This patch works well the first time. So if the user clicks save, it shows the form again. Unfortunately, if you click on submit again after the failed validation submit, it returns a 500 Internal server error and the form disappears.

lslinnet’s picture

This is due to the form being located in a file that is not included doing the validation process, can be fixed by making sure that the specific file is included.

If we take the media and file_entity modules, we need the file_entity.pages.inc file to be included.
To archive that we need some code like below alternatively this code could be included in file_entity's media_edit form but not sure if it belongs there or it's actually multiform's responsibility to include the correct files.

<?php
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if (substr($form_id, 0, 11) == 'media_edit_') {
    // make sure to attach file_entity functions so they are there doing validation
    form_load_include($form_state, 'inc', 'file_entity', 'file_entity.pages');
  }
}
?>

the form_load_include adds the information about which files should be loaded doing validation and submit execution even if the first validation returns an error.

Hope that helps you or points you in the correct direction.

ezman’s picture

Hi, thanks a lot for this patch - it's helped me get 90% of the way to achieving the functionality I need.

I have my module generating a block which contains a multiform containing all nodes owned by the logged-in user.
I unset all of the fields except for two - the title and the entityreference field. Only the title field is a required field in the node's fields definition.

Entityreference view widget's default functionality is to submit via AJAX. I took your code for the /system/ajax path and repurposed it.
I then combined your AJAX callback with Entityreference View Widget's AJAX callback.

It almost worked straight away. It processes the AJAX POSTed form, and then returns HTML back to replace what was there.
A problem I had is that the IDs are wrong in the returned HTML, which results in it replacing the wrong field (the first one).
I worked around this by creating my own version of _multiform_get_form() which rewrites the IDs and the names of the form returned by Entityreference view widget's processed form.

The problem I'm having now is on submitting the multiform.
I'm getting errors because only one of the $multiform[#subforms] array actually has a form array attached to it on submit.
The first error I see is "Notice: Undefined index: form in multiform_delayed_submit_execute() (line 184 of /sites/all/modules/multiform/multiform.inc").

Investigating a little further, I've implemented hook_multiform_alter, which gets called on submit, to inspect the $multiform array, with:

foreach ( array_keys($multiform['#subforms']) as $subform ) {
	drupal_set_message('multiform = '.print_r(array_keys($multiform['#subforms'][$subform]),true));
}

In the output, I see that only the first form (the new node creation form) has a form and form_state attached to it. The others have their form_id, args, #tag, key, and #weight, but no form or form_state.

I've tried it with AJAX submit and without, and get the same result. I can't see where the other forms in the multiform array have gone to.
I suspect a validation problem, but I'm not sure how to go about resolving it.

I want my multiform's submit functionality to process and save what's changed for each of the nodes, and to not care whether the new node form is filled in or not.
It seems the current default functionality is to fail validation if any of the forms fail validation.

Do you have any ideas how I can achieve this?

Here's my module's relevant code in case there's something I'm doing that's obviously wrong, it also might help anyone who wants to use an entityreference view widget field in a multiform:

function mi_ajaxedit_block_content() {
	global $user;
	$form_state = array();
	form_load_include($form_state, 'inc', 'node', 'node.pages');
	form_load_include($form_state, 'inc', 'multiform', 'multiform');
	form_load_include($form_state, 'inc', 'multiform', 'multiform.ajax');

	$multiform = array('#multiform_id' => 'memoir_multiform');
	$emptynode = (object) array('uid' => $user->uid, 'name' => (isset($user->name) ? $user->name : ''), 'type' => 'memoir', 'language' => LANGUAGE_NONE);
	$multiform['#subforms'][] = array(
		'form_id' => 'mi_ajaxedit_custom_node_form',
		'args' => array($emptynode),
		'#tag' => 'subformnew',
	);	
	$query = new EntityFieldQuery();
	$query->entityCondition('entity_type','node')
		->propertyCondition('type','memoir')
		->propertyCondition('uid',$user->uid);
	$results = $query->execute();
	if ( isset($results['node']) ) {
		$memoir_nids = array_keys($results['node']);
		$memoirs = node_load_multiple($memoir_nids);
		foreach ($memoirs as $node) {
			$multiform['#subforms'][] = array(
				'form_id' => 'mi_ajaxedit_custom_node_form',
				'args' => array($node),
				'#tag' => 'subform' . $node->nid,
			);
		}		
	}
	$form = multiform_get_form($multiform);
	//return render array
	return $form;
}

function mi_ajaxedit_custom_node_form($form, &$form_state, $node) {
  $form = array();
  form_load_include($form_state, 'inc', 'node', 'node.pages');
  form_load_include($form_state, 'inc', 'multiform', 'multiform');
  form_load_include($form_state, 'inc', 'multiform', 'multiform.ajax');
  $form = node_form($form, $form_state, $node);

  // loop and hide fields
  foreach (element_children($form) as $key) {
    if ($key != 'title' && $key != 'field_facets' && $key != 'submit') {
      $form[$key]['#access'] = FALSE;
    }
  }
	$form['submit'] = array(
		'#type' => 'submit', 
		'#value' => 'save', 
		'#submit' => array('mi_ajaxedit_memoirtool_submit'),
		'#attributes' => array(
			//'class' => array('use-ajax-submit') // Have tried with and without AJAX submit
		),
		'#limit_validation_errors' => array(), // Recently added this to see if it helps. It doesn't.
	);
  return $form;	
}

/* in multiform_multiform_ajax_alter, code checks for /system/ajax path and replaces it with own handler
// here we're doing the same thing, but for entityreference_view_widget
*/
function mi_ajaxedit_multiform_ajax_alter(&$element, $key, &$form_state) {	
	$setting = $element['#attached']['js'][$key];
	if ( is_array($setting) && isset($setting['data']['ajax'][$element['#id']]['url']) && $setting['data']['ajax'][$element['#id']]['url'] == "/entityreference_view_widget/ajax/field_facets" ) {
	    $multiform_index = $form_state['multiform_index'];
	    $element['#attached']['js'][$key]['data']['ajax'][$element['#id']]['url'] = '/mi_multiform/ajax/field_facets';
            // Add multiform_index in order to define triggering element's subform when triggered.
            if ( isset($setting['data']['ajax'][$element['#id']]['submit']) && is_array($setting['data']['ajax'][$element['#id']]['submit']) ) {
		$element['#attached']['js'][$key]['data']['ajax'][$element['#id']]['submit']['_multiform_index'] = $multiform_index;
		// also change the wrapper to be correct (ie. NOT 'edit-field-facets') by appending a number to it. This "number" seems to be the last digit of $multiform_index
		$wrapper = $setting['data']['ajax'][$element['#id']]['wrapper'];
		preg_match( '/_(\d+)$/', $multiform_index, $match);
		if ( count($match) > 0 ) {
			$idx = intval($match[1]);
			if ( $idx > 0 ) { // if idx == 0 or 1 then leave it alone - the 'new node' form doesn't have an idx appended to it
				$element['#attached']['js'][$key]['data']['ajax'][$element['#id']]['wrapper'] = $wrapper . '--' . ($idx+1);
			}
		  }
            }
	}
}

function mi_ajaxedit_multiform_ajax_form_callback() {
  module_load_include('inc', 'multiform');
  $multiform = array(
    'multiform' => $_POST['multiform'],
    'form_id' => $_POST['form_id'],
    'form_build_id' => $_POST['form_build_id'],
  );
  foreach ($multiform as $key => $value) {
    unset($_POST[$key]);
  }
  // Define triggering element's subform index.
  $multiform_index = isset($_POST['_multiform_index']) ? $_POST['_multiform_index'] : FALSE;
  if (!$multiform_index) {
    return;
  }
  $_POST += $multiform['multiform'][$multiform_index];

  //entityreference_view_widget_ajax() code:
  // Reset the cache of IDs. Drupal rather aggressively prevents id duplication
  // but this causes it to remember IDs that are no longer even being used.
  // Taken from Views.
  if (isset($_POST['ajax_html_ids'])) {
    unset($_POST['ajax_html_ids']);
  }

  // Include the node.pages when processing the form
  // this drupal_process_form call is in both multiform and ERVW
  form_load_include($form_state, 'inc', 'node', 'node.pages');
  form_load_include($form_state, 'inc', 'multiform', 'multiform.ajax');
  list($form, $form_state) = ajax_get_form();
  drupal_process_form($form['#form_id'], $form, $form_state);

  //multiform code:
  $multiform = array();
  multiform_process_form_state('restore', $form_state);
  _multiform_delayed_submit_execute($form, $form_state, $form['#form_id'], $multiform);

  //in this multiform, form_parents is always an array of one item, field_facets. it then searches through $form for this value, renders it and returns it
  $form_parents = func_get_args();
  
  $form = drupal_array_get_nested_value($form, $form_parents);
  mi_multiform_fix_form($form, $multiform_index);

  $output = drupal_render($form);
  $js = drupal_add_js();
  $settings = call_user_func_array('array_merge_recursive', $js['settings']['data']);

  $commands = array();
  $commands[] = ajax_command_replace(NULL, $output, $settings);
  $commands[] = ajax_command_invoke(NULL, "setupMemoirTool", array(false));
  return array('#type' => 'ajax', '#commands' => $commands);
}

/**
 * Recursive helper for multiform_get_form().
 Copied from multiform.module and reappropriated
 */
function mi_multiform_fix_form(&$element, $form_id) {
  // Recurse.
  foreach (element_children($element) as $key) {
    mi_multiform_fix_form($element[$key], $form_id);
  }
  // By only changing $element['#name'] form API is not affected but the
  // browser will put the element values into _POST where multiform_get_form
  // expects them.
  if (isset($element['#name'])) {
	// If the name was op then we want multiform[$form_id][op]. If it was
	// foo[bar] then we want multiform[$form_id][foo][bar].
	$element['#name'] = "multiform[$form_id]" . preg_replace('/^[^[]+/', '[\0]', $element['#name']);
  }
  if (isset($element['#attributes']['name'])) {
	// If the name was op then we want multiform[$form_id][op]. If it was
	// foo[bar] then we want multiform[$form_id][foo][bar].
	$element['#attributes']['name'] = "multiform[$form_id]" . preg_replace('/^[^[]+/', '[\0]', $element['#attributes']['name']);
  }
  if (isset($element['#id'])) {
    if (isset($element['#type']) && $element['#type'] == 'checkbox') {
		//don't change the ID of the checkboxes, otherwise their AJAX events won't work.
	} else {
		// For #id, needs to be #id with "--" and form's unique index number appended:
		// eg, edit-field-facets becomes edit-field-facets--2
		preg_match( '/_(\d+)$/', $form_id, $match);
		if ( count($match) > 0 ) {
			$idx = intval($match[1]);
			if ( $idx > 0 ) { // if idx == 0 or 1 then leave it alone - the 'new node' form doesn't have an idx appended to it
				$element['#id'] = $element['#id'] . '--' . ($idx+1);
			}
		}
	}
  }
  if (isset($element['#wrapper'])) {
    // If the name was op then we want multiform[$form_id][op]. If it was
    // foo[bar] then we want multiform[$form_id][foo][bar].
    $element['#wrapper'] = "multiform[$form_id]" . preg_replace('/^[^[]+/', '[\0]', $element['#wrapper']);
  }
}

dustinsilva@gmail.com’s picture

Be advised I had to change $hook == 'element_info' to read $hook == 'element_info_alter' in the following code.


function multiform_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'form_alter') {
    $group = $implementations['multiform'];
    unset($implementations['multiform']);
    $implementations['multiform'] = $group;
  }
  // Used to override system_element_info() for multiform ajax purposes.
  elseif ($hook == 'element_info_alter') {
    $group = $implementations['multiform'];
    unset($implementations['multiform']);
    $implementations['multiform'] = $group;
  }
}
kpv’s picture

Issue summary: View changes

Hello, pls see https://drupal.org/sandbox/kpv/2234747 for another version. It was written from scratch (work is still in progress) and has some differences in multiform settings array. For reference see multifrom_example module.

kpv’s picture

Status: Needs work » Needs review
timwood’s picture

Version: 7.x-1.0 » 7.x-1.x-dev
Status: Needs review » Needs work
Related issues: +#1663212: Form processing ignores validation errors

The patch from #1, with slight modification in #5 applies cleanly but throws the following error when used in conjunction with Media and Plupload modules.

Fatal error: Cannot use string offset as an array in /var/www/web1.vm/sites/all/modules/contrib/multiform/multiform.ajax.inc on line 73

If the Sandbox project by kpv is the answer to this it should probably be turned into a patch file so the maintainers can more easily review?

kpv’s picture

Attached patch should be applied to 7.x-1.x branch.

kpv’s picture

Status: Needs work » Needs review

If you are trying integration with other projects, pls consider changes in the way settings are passed into multiform_get_form().
Here is the code from example module.

  $settings = array(
    '#multiform_id' => 'multiform_example_generic',
    '#subforms' => array(
      array(
        'form_id' => 'multiform_example_form_first',
        '#after_execute' => array('multiform_example_first_subform_after_execute'),
        '#map' => array(
          0 => array(
            '#parents' => array('submit_first_2'),
            '#triggering_submit' => array('register'),
          ),
        ),
      ),
      array(
        'form_id' => 'multiform_example_form_second',
        '#map' => array(
          0 => array(
            '#parents' => array('submit_second_2'),
            '#triggering_submit' => array('register'),
          ),
        ),
      ),
      array(
        'form_id' => 'multiform_ajax_example_form',
      ),
    ),
    '#submit_map' => array(
      '#submits' => array(
        'register' => array(
          '#type' => 'submit',
          '#value' => t('Register multiform'),
        ),
      ),
    ),
    '#redirect_path' => '<front>',
  );
  return multiform_get_form($settings);
kalman.hosszu’s picture

Status: Needs review » Needs work

Thanks for the work! It seems very good for the first look, good work. I have some minor suggestions bellow, please fix them and I will do a deeper review for the patch. Thanks for the work again!

  1. +++ b/multiform.inc
    @@ -0,0 +1,251 @@
    +  ¶
    +  // @todo: Maybe use other technique to generate default #multiform_id to ensure it is unique.
    +  // Add #multiform_id if not set in settings.
    +  // #multiform_id is required for theming (for default tpl.php tempalate name).
    +  $settings += array(
    +    '#multiform_id' => DEFAULT_MULTIFORM_ID,
    +  );
    +  ¶
    +  $submits_form = array(
    +    'form_id' => 'multiform_submits_form',
    +    'args' => array($settings),
    +  );
    +  ¶
    +  // Add submits_form to the end of subforms list.
    +  array_push($settings['#subforms'], $submits_form);
    +  ¶
    +  foreach ($settings['#subforms'] as $k => $subform) {
    

    Please remove unused spaces from the beginning of the empty lines.

  2. +++ b/multiform.inc
    @@ -0,0 +1,251 @@
    +  // Disable redirect for the given subform. If any redirect is needed, it must be global for multiform.
    

    Please use line breaks in code comments. Not only here, please fix it in the whole patch.

  3. +++ b/multiform.inc
    @@ -0,0 +1,251 @@
    + * Store $subform_form and $subform_state structure for further processing (delayed submit).
    

    The first line of the code block comment should not longer than 80 characters.

  4. +++ b/multiform.inc
    @@ -0,0 +1,251 @@
    + * @todo
    

    What is the task? Please write the task after every @todo section.

  5. +++ b/multiform.module
    @@ -1,141 +1,260 @@
    +  ¶
    

    Remove spaces form empty line.

  6. +++ b/multiform_example/multiform_example.module
    @@ -0,0 +1,240 @@
    + * Implements  hook_form_alter().
    

    Remove one space between "Implement"s and "hook" words.

  7. +++ b/multiform_log/multiform_log.info
    @@ -0,0 +1,4 @@
    +name = Multiform Log
    +core = 7.x
    +
    +dependencies[] = multiform
    

    Add this also to multiform package.

  8. +++ /dev/null
    @@ -1,104 +0,0 @@
    -<?php
    -/**
    - * @file
    - *
    - *
    - *
    - * @author Kálmán Hosszu - http://drupal.org/user/267481
    - */
    -
    -class MultiformTestCase extends DrupalWebTestCase {
    -
    -  /**
    -   * Info method.
    -   *
    -   * @return array
    -   */
    -  public static function getInfo() {
    -    return array(
    -      'name' => 'Forms functionality',
    -      'description' => 'Testing multiform functionality.' ,
    -      'group' => 'Multiform',
    -    );
    -  }
    -
    -  /**
    -   * Overriden setUp function.
    -   */
    -  public function setUp() {
    -    parent::setUp('multiform', 'multiform_test');
    -  }
    -
    -  /**
    -   * Check various submit ops.
    -   */
    -  public function testSubmitHandling() {
    -    // Go to the form page.
    -    $this->drupalGet('multiform-test/1');
    -
    -    // Check buttons.
    -    $this->assertFieldByName('op', 'save');
    -    $this->assertFieldByName('op', 'delete');
    -
    -    // No more buttons.
    -    $submitButtons = $this->xpath('//input[@type="submit" and @name!="op"]');
    -    $this->assertEqual(count($submitButtons), 0, t('No more submit button.'));
    -
    -    // Save button.
    -    $this->drupalPost(NULL, array(), 'save');
    -    $this->assertText('multiform_test1_1multiform_test1_submit_button', t('First form save message is found.'));
    -    $this->assertText('multiform_test1_2multiform_test1_submit_button', t('Second form save message is found.'));
    -
    -    // Delete button.
    -    $this->drupalPost(NULL, array(), 'delete');
    -    $this->assertText('multiform_test1_1multiform_test1_delete_button', t('First form delete message is found.'));
    -    $this->assertText('multiform_test1_2multiform_test1_delete_button', t('Second form delete message is found.'));
    -  }
    -
    -  /**
    -   * Check the merged fields exist.
    -   */
    -  public function testFieldsAreExist() {
    -    // Go to the form page.
    -    $this->drupalGet('multiform-test/2');
    -
    -    // Check textfields.
    -    $this->assertFieldByName('multiform[multiform_test2_1_0][required_text_1]');
    -    $this->assertFieldByName('multiform[multiform_test2_2_1][required_text_2]');
    -
    -    // Check button.
    -    $this->assertFieldByName('op', 'save');
    -  }
    -
    -  /**
    -   * Check required fields.
    -   */
    -  public function testRequiredFields() {
    -    $first_text = array('multiform[multiform_test2_1_0][required_text_1]' => 'test1 value');
    -    $second_text = array('multiform[multiform_test2_2_1][required_text_2]' => 'test2 value');
    -    // No required fields.
    -    $this->drupalPost('multiform-test/2', array(), 'save');
    -    $this->assertText('test1 field is required.');
    -    $this->assertText('test2 field is required.');
    -    $this->assertNoText('multiform_test2_1multiform_test2_submit_button');
    -    $this->assertNoText('multiform_test2_2multiform_test2_submit_button');
    -
    -    // Send all required fields.
    -    $this->drupalPost(NULL, array_merge($first_text, $second_text), 'save');
    -    $this->assertText('multiform_test2_1multiform_test2_submit_button');
    -    $this->assertText('multiform_test2_2multiform_test2_submit_button');
    -    $this->assertNoText('test1 field is required.');
    -    $this->assertNoText('test2 field is required.');
    -
    -    // Send first form's required field.
    -    $this->drupalPost(NULL, $first_text, 'save');
    -    $this->assertNoText('multiform_test2_1multiform_test2_submit_button');
    -    $this->assertText('test2 field is required.');
    -
    -    // Send second form's required field.
    -    $this->drupalPost(NULL, $second_text, 'save');
    -    $this->assertNoText('multiform_test2_2multiform_test2_submit_button');
    -    $this->assertText('test1 field is required.');
    -  }
    -
    -}
    

    We need the old tests and we need to test the new functionality too.

kpv’s picture

Fixed 1-7 (from #11) and added tests from original 7.x-1.x branch (modified to correspond new api), yet without new functionality tests - let's discuss test cases.

kpv’s picture

Status: Needs work » Needs review
kpv’s picture

@kalman.hosszu
Do you need help with patch at #12? I suggest to create 7.x-2.x-dev branch based on this patch, since it has different api. Also this would allow to use it in other projects.

andypost’s picture

Status: Needs review » Reviewed & tested by the community

Would be great to see the new branch for the code

andypost’s picture

Title: Add Delayed submit functionality » Add Delayed submit functionality - branch 7.x-2.x
Category: Feature request » Task

Proper title

  • kalman.hosszu committed caa6f42 on 7.x-2.x
    Issue #1870120 by kpv: Add Delayed submit functionality - branch 7.x-2.x
    
kalman.hosszu’s picture

Version: 7.x-1.x-dev » 7.x-2.x-dev

I created a new branch for this patch. I found some minor whitespace and "No newline at end of file" problems. I thinks we should create a new version after another review.

kpv’s picture

It seems that the patch wasn't applied correctly. Commit doesn't contain most of the patch content.

  • kalman.hosszu committed 65cd39b on 7.x-2.x
    Issue #1870120 by kpv: Add Delayed submit functionality - branch 7.x-2.x
    
kalman.hosszu’s picture

Fixed.

Here is the log of he patch:

▶ git apply -v multiform-delayed_submit_and_ajax_support-1870120-12.patch
Checking patch README.txt...
Checking patch multiform.example.inc...
Checking patch multiform.form.inc...
Checking patch multiform.inc...
multiform-delayed_submit_and_ajax_support-1870120-12.patch:548: new blank line at EOF.
+
Checking patch multiform.info...
Checking patch multiform.module...
multiform-delayed_submit_and_ajax_support-1870120-12.patch:930: new blank line at EOF.
+
Checking patch multiform.sharedfields.inc...
multiform-delayed_submit_and_ajax_support-1870120-12.patch:1030: new blank line at EOF.
+
Checking patch multiform_example/multiform_example.ajax.inc...
Checking patch multiform_example/multiform_example.info...
Checking patch multiform_example/multiform_example.module...
multiform-delayed_submit_and_ajax_support-1870120-12.patch:1335: new blank line at EOF.
+
Checking patch multiform_example/multiform_example.sharedfields.inc...
multiform-delayed_submit_and_ajax_support-1870120-12.patch:1409: new blank line at EOF.
+
Checking patch multiform_example/multiform_example_content_types/multiform_example_content_types.features.field_base.inc...
Checking patch multiform_example/multiform_example_content_types/multiform_example_content_types.features.field_instance.inc...
Checking patch multiform_example/multiform_example_content_types/multiform_example_content_types.features.inc...
Checking patch multiform_example/multiform_example_content_types/multiform_example_content_types.info...
Checking patch multiform_example/multiform_example_content_types/multiform_example_content_types.module...
Checking patch multiform_example/templates/multiform-example-generic.tpl.php...
Checking patch multiform_log/multiform_log.admin.inc...
Checking patch multiform_log/multiform_log.info...
Checking patch multiform_log/multiform_log.install...
Checking patch multiform_log/multiform_log.module...
Checking patch tests/multiform.test...
Checking patch tests/multiform_test.info...
Checking patch tests/multiform_test.module...
Applied patch README.txt cleanly.
Applied patch multiform.example.inc cleanly.
Applied patch multiform.form.inc cleanly.
Applied patch multiform.inc cleanly.
Applied patch multiform.info cleanly.
Applied patch multiform.module cleanly.
Applied patch multiform.sharedfields.inc cleanly.
Applied patch multiform_example/multiform_example.ajax.inc cleanly.
Applied patch multiform_example/multiform_example.info cleanly.
Applied patch multiform_example/multiform_example.module cleanly.
Applied patch multiform_example/multiform_example.sharedfields.inc cleanly.
Applied patch multiform_example/multiform_example_content_types/multiform_example_content_types.features.field_base.inc cleanly.
Applied patch multiform_example/multiform_example_content_types/multiform_example_content_types.features.field_instance.inc cleanly.
Applied patch multiform_example/multiform_example_content_types/multiform_example_content_types.features.inc cleanly.
Applied patch multiform_example/multiform_example_content_types/multiform_example_content_types.info cleanly.
Applied patch multiform_example/multiform_example_content_types/multiform_example_content_types.module cleanly.
Applied patch multiform_example/templates/multiform-example-generic.tpl.php cleanly.
Applied patch multiform_log/multiform_log.admin.inc cleanly.
Applied patch multiform_log/multiform_log.info cleanly.
Applied patch multiform_log/multiform_log.install cleanly.
Applied patch multiform_log/multiform_log.module cleanly.
Applied patch tests/multiform.test cleanly.
Applied patch tests/multiform_test.info cleanly.
Applied patch tests/multiform_test.module cleanly.
warning: squelched 2 whitespace errors
warning: 7 lines add whitespace errors.
kpv’s picture

great! I will check those spaces.
Also, can we get a link to 2.x-dev on project page? Meanwhile I will prepare some docs.

kalman.hosszu’s picture

Version: 7.x-2.x-dev » 7.x-1.x-dev

I have to change the version, because I get an error message when I try to create a snapshot from the new branch.

kalman.hosszu’s picture

Version: 7.x-1.x-dev » 7.x-2.x-dev

Fixed

joseph.olstad’s picture

Status: Reviewed & tested by the community » Fixed

this patch appears was applied to 7.x-2.x branch in commit 65cd39b4fb

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.