you can do it this way:
first page:
[[!FormIt?
&hooks=`redirect`
&redirectTo=`227`
&fsFormTopic=`[[*pagetitle]]`
&store=`1`
]]
[[!+fi.validation_error_message:notempty=`<p>[[!+fi.validation_error_message]]</p>`]]
<form action="[[~[[*id]]]]" method="post" class="form">
<div class="ten columns">
<div class="form-group[[+error.username:notempty=` error`]]">
<label for="username">[[!%login.username]] <span class="error">[[+error.username]]</span></label>
<input type="text" name="username" id="username" value="[[+username]]" readonly />
</div>
<div class="form-group[[+error.rnr-name:notempty=` error`]]">
<label for="rnr-name">Runners Name <span class="error">[[+error.rnr-name]]</span></label>
<input type="text" name="rnr-name" id="rnr-name" value="[[+fullname]]" readonly />
</div>
<div class="form-group[[+error.rnr-age:notempty=` error`]]">
<label for="rnr-age">Runners Age <span class="error">[[+error.rnr-age]]</span></label>
<input type="text" name="rnr-age" id="rnr-age" value="[[+age:toAge]]" readonly />
</div>
<div class="form-group[[+error.rnr-age:notempty=` error`]]">
<label for="rnr-age">Gender <span class="error">[[+error.rnr-sex]]</span></label>
<input type="text" name="sex" id="sex" value="[[+sex]]" readonly />
</div>
<div class="form-group[[+error.runname:notempty=` error`]]">
<label for="runname">Run Name <span class="error">[[+error.runname]]</span></label>
<input type="text" name="runname" id="runname" value="[[*pagetitle]]" readonly />
</div>
<div class="form-group[[+error.rnr-dist:notempty=` error`]]">
<label for="rnr-dist">Run Distance<span>[[+error.rnr-dist]]</span> </label>
<select name="rnr-dist">
<option value="" [[!+fi.rnr-dist:FormItIsSelected=``]] >Select One</option>
<option value="15k" [[!+fi.rnr-dist:FormItIsSelected=`15k`]] >15k</option>
<option value="5k" [[!+fi.rnr-dist:FormItIsSelected=`5k`]] >5k</option>
</select>
</div>
<div class="form-group[[+error.rnr-swag:notempty=` error`]]">
<label for="rnr-swag">Swag<span>[[+error.rnr-swag]]</span> </label>
<select name="rnr-swag">
<option value="" [[!+fi.rnr-swag:FormItIsSelected=``]] >Select One</option>
<option value="t-lg" [[!+fi.rnr-swag:FormItIsSelected=`t-lg`]] >T-Shirt Large</option>
<option value="t-sm" [[!+fi.rnr-swag:FormItIsSelected=`t-sm`]] >T-Shirt Small</option>
</select>
</div>
<div class="form-group[[+error.rnrm-price:notempty=` error`]]">
<label for="rnrm-price">Run Price<span class="error">[[+error.rnrm-price]]</span></label>
<input type="text" name="rnrm-price" id="rnrm-price" value="[[*prodPrice]]" readonly />
</div>
<div class="form-group[[+error.additional_runners:notempty=` error`]]">
<label for="additional_runners">How many additional Runners?<span class="error">[[+error.additional_runners]]</span></label>
<input type="text" name="additional_runners" id="additional_runners" value="[[!+fi.additional_runners]]" />
</div>
</div>
<input type="submit" value="Next" />
</form>
second page (the &redirectTo -page)
[[!FormItRetriever]]
[[!FormIt?
&hooks=`RunnersFormSave,redirect`
&redirectTo=`3`
&fsFormTopic=`[[*pagetitle]]`
]]
[[!+fi.validation_error_message:notempty=`<p>[[!+fi.validation_error_message]]</p>`]]
<form action="[[~[[*id]]]]" method="post" class="form">
<div class="ten columns">
<div class="form-group[[+error.username:notempty=` error`]]">
<label for="username">[[!%login.username]] <span class="error">[[+error.username]]</span></label>
<input type="text" name="username" id="username" value="[[+username]]" readonly />
</div>
<div class="form-group[[+error.rnr-name:notempty=` error`]]">
<label for="rnr-name">Runners Name <span class="error">[[+error.rnr-name]]</span></label>
<input type="text" name="rnr-name" id="rnr-name" value="[[+fullname]]" readonly />
</div>
<div class="form-group[[+error.rnr-age:notempty=` error`]]">
<label for="rnr-age">Runners Age <span class="error">[[+error.rnr-age]]</span></label>
<input type="text" name="rnr-age" id="rnr-age" value="[[+age:toAge]]" readonly />
</div>
<div class="form-group[[+error.rnr-age:notempty=` error`]]">
<label for="rnr-age">Gender <span class="error">[[+error.rnr-sex]]</span></label>
<input type="text" name="sex" id="sex" value="[[+sex]]" readonly />
</div>
<div class="form-group[[+error.runname:notempty=` error`]]">
<label for="runname">Run Name <span class="error">[[+error.runname]]</span></label>
<input type="text" name="runname" id="runname" value="[[*pagetitle]]" readonly />
</div>
<div class="form-group[[+error.rnr-dist:notempty=` error`]]">
<label for="rnr-dist">Run Distance<span>[[+error.rnr-dist]]</span> </label>
<select name="rnr-dist">
<option value="" [[!+fi.rnr-dist:FormItIsSelected=``]] >Select One</option>
<option value="15k" [[!+fi.rnr-dist:FormItIsSelected=`15k`]] >15k</option>
<option value="5k" [[!+fi.rnr-dist:FormItIsSelected=`5k`]] >5k</option>
</select>
</div>
<div class="form-group[[+error.rnr-swag:notempty=` error`]]">
<label for="rnr-swag">Swag<span>[[+error.rnr-swag]]</span> </label>
<select name="rnr-swag">
<option value="" [[!+fi.rnr-swag:FormItIsSelected=``]] >Select One</option>
<option value="t-lg" [[!+fi.rnr-swag:FormItIsSelected=`t-lg`]] >T-Shirt Large</option>
<option value="t-sm" [[!+fi.rnr-swag:FormItIsSelected=`t-sm`]] >T-Shirt Small</option>
</select>
</div>
<div class="form-group[[+error.rnrm-price:notempty=` error`]]">
<label for="rnrm-price">Run Price<span class="error">[[+error.rnrm-price]]</span></label>
<input type="text" name="rnrm-price" id="rnrm-price" value="[[*prodPrice]]" readonly />
</div>
<div class="form-group[[+error.additional_runners:notempty=` error`]]">
<label for="additional_runners">How many additional Runners?<span class="error">[[+error.additional_runners]]</span></label>
<input type="text" name="additional_runners" id="additional_runners" value="[[!+fi.additional_runners]]" />
</div>
</div>
[[!getAdditionalRunners? &tpl=`runnersform` &additional_runners=`[[!+fi.additional_runners]]`]]
<input type="submit" value="Register" />
</form>
the snippet 'getAdditionalRunners' which creates the formparts for each runner:
$additional_runners = (int) $modx->getOption('additional_runners',$scriptProperties,0);
for ($i=1;$i<=$additional_runners;$i++){
$properties = array();
$properties['rnr_idx'] = $i;
$output .= $modx->getChunk($tpl,$properties);
}
return $output;
the chunk 'runnersform'
<h3>Additional Runner [[+rnr_idx]]</h3>
<div class="ten columns">
<div class="form-group[[+error.rnr-add[[+rnr_idx]]:notempty=` error`]]">
<label for="rnr-add[[+rnr_idx]]">Runners Name <span class="error">[[+error.rnr-add[[+rnr_idx]]]]</span></label>
<input type="text" name="rnr-add[[+rnr_idx]]" id="rnr-add[[+rnr_idx]]" value="[[!+fi.rnr-add[[+rnr_idx]]]]" />
</div>
<div class="form-group[[+error.rnr-age:notempty=` error`]]">
<label for="rnr-age[[+rnr_idx]]">Runners Age <span class="error">[[+error.rnr-age[[+rnr_idx]]]]</span></label>
<input type="text" name="rnr-age[[+rnr_idx]]" id="rnr-age[[+rnr_idx]]" value="[[!+fi.rnr-age[[+rnr_idx]]]]" />
</div>
<div class="form-group[[+error.rnr-sex[[+rnr_idx]]:notempty=` error`]]">
<label for="rnr-sex[[+rnr_idx]]">Gender<span>[[+error.rnr-sex[[+rnr_idx]]]]</span> </label>
<select name="rnr-sex[[+rnr_idx]]" value="">
<option value=""[[!+fi.rnr-sex[[+rnr_idx]]:FormItIsSelected=``]] >Select One</option>
<option value="Male" [[!+fi.rnr-sex[[+rnr_idx]]:FormItIsSelected=`Male`]]>Male</option>
<option value="Female" [[!+fi.rnr-sex[[+rnr_idx]]:FormItIsSelected=`Female`]]>Female</option>
</select>
</div>
<div class="form-group[[+error.runname[[+rnr_idx]]:notempty=` error`]]">
<label for="runname[[+rnr_idx]]">Run Name <span class="error">[[+error.runname[[+rnr_idx]]]]</span></label>
<input type="text" name="runname[[+rnr_idx]]" id="runname[[+rnr_idx]]" value="[[*pagetitle]]" />
</div>
<div class="form-group[[+error.rnr-dist[[+rnr_idx]]:notempty=` error`]]">
<label for="rnr-dist[[+rnr_idx]]">Run Distance<span>[[+error.rnr-dist[[+rnr_idx]]]]</span> </label>
<select name="rnr-dist[[+rnr_idx]]">
<option value="" [[!+fi.rnr-dist[[+rnr_idx]]:FormItIsSelected=``]] >Select One</option>
<option value="15k" [[!+fi.rnr-dist[[+rnr_idx]]:FormItIsSelected=`15k`]] >15k</option>
<option value="5k" [[!+fi.rnr-dist[[+rnr_idx]]:FormItIsSelected=`5k`]] >5k</option>
</select>
</div>
<div class="form-group[[+error.rnr-swag[[+rnr_idx]]:notempty=` error`]]">
<label for="rnr-swag[[+rnr_idx]]">Swag<span>[[+error.rnr-swag[[+rnr_idx]]]]</span> </label>
<select name="rnr-swag[[+rnr_idx]]">
<option value="" [[!+fi.rnr-swag[[+rnr_idx]]:FormItIsSelected=``]] >Select One</option>
<option value="t-lg" [[!+fi.rnr-swag[[+rnr_idx]]:FormItIsSelected=`t-lg`]] >T-Shirt Large</option>
<option value="t-sm" [[!+fi.rnr-swag[[+rnr_idx]]:FormItIsSelected=`t-sm`]] >T-Shirt Small</option>
</select>
</div>
<div class="form-group[[+error.rnr-price:notempty=` error`]]">
<label for="rnr-price[[+rnr_idx]]">Run Price<span class="error">[[+error.rnr-price[[+rnr_idx]]]]</span></label>
<input type="text" name="rnr-price[[+rnr_idx]]" id="rnr-price[[+rnr_idx]]" value="[[*prodPrice]]" readonly />
</div>
</div>
and finally the new snippet 'runnersFormSave'
// Load the FormSave class
$formSave = $modx->getService('formsave', 'FormSave', $modx->getOption('formsave.core_path', null, $modx->getOption('core_path') . 'components/formsave/') . 'model/formsave/', array());
if (!($formSave instanceof FormSave))
return '';
$formit = &$hook->formit;
$formValues = $hook->getValues();
$formTopic = $modx->getOption('fsFormTopic', $formit->config, 'form');
$formPublished = (int)$modx->getOption('fsFormPublished', $formit->config, 1);
$formFields = 'username,rnr-name,rnr-age,rnr-dist,rnr-swag';
$additional_runners = $hook->getValue('additional_runners');
for ($i = 0; $i <= $additional_runners; $i++) {
if ($formFields !== false) {
$formFields = explode(',', $formFields);
foreach ($formFields as $key => $value) {
$formFields[$key] = trim($value);
}
}
// Create new form object
$newForm = $modx->newObject('fsForm');
// Build the data array
$dataArray = array();
if ($formFields === false) {
$dataArray = $hook->getValues();
} else {
$values = $hook->getValues();
foreach ($formFields as $field) {
if (!isset($values[$field])) {
// Add empty field
$dataArray[$field] = '';
continue;
}
$dataArray[$field] = $values[$field];
}
}
// Fill the database object
$newForm->fromArray(array(
'topic' => $formTopic,
'time' => time(),
'published' => $formPublished,
'data' => $dataArray,
'ip' => $_SERVER['REMOTE_ADDR']));
// Save the form
$newForm->save();
//set formfields for additional runners
$next = $i+1;
$formFields = 'rnr-add' . $next . ',rnr-age' . $next . ',rnr-sex' . $next . ',rnr-dist' . $next . ',rnr-swag' . $next;
// Set the form in FormIt so you can access it in any hook through $form->formSave
//$formit->formSave = $newForm;
}
return true;
[ed. note: Bruno17 last edited this post 9 years ago.]