05
Days
23
Hours
59
Minutes
59
Seconds


How to edit a submission using the original form

This tutorial will provide an example where, based on the logged in user, it pre-fills last submitted data in case the user wants to adjust certain information. You can download the sample form on the right for a finished example which can be restored using the built-in RSForm!Pro Backup/Restore feature (the sample form does not include the submission removal script - this can be simply added as instructed below).

Download Sample Form
Intro

Although normally you could use the Manage Directories feature, this doesn't provide a full form's functionality. Basically, if you have a simpler form without any custom added validations for example, you should use the Manage Directories feature instead to provide a frontend listing (that can be set even based on the logged in user, where users can adjust their submitted data).

The following steps explain what the form will do:

  • It firstly checks if a user is logged in, otherwise a message is displayed.
  • Queries are then performed to grab information about the form including submitted data on the logged in user.
  • A script then includes previous submitted data within the $val array from the "Script called before form is generated" area, that is designed to pre-fill fields.
  • Eventually, when the user re-submits the form, a new submission is made and the old one is removed through scripting (optional step).

Script

The following script is added within "Script called before form is generated" area (backend > Components > RSForm!Pro > Manage Forms > your form > Form Properties > PHP Scripts - Pre-Processing).

Most of the code is commented for a better understanding on what exactly is going on.

    if(Joomla\CMS\Factory::getUser()->id == 0){
    //if user is not logged in, the following message is displayed
      $formLayout = 'Please login in order to access the form.';
    }else{
      $db = Joomla\CMS\Factory::getDBO();
      $db->setQuery("SELECT `SubmissionId` FROM #__rsform_submissions WHERE `UserId`='".Joomla\CMS\Factory::getUser()->id."' AND `FormId`='".$formId."' ORDER BY `SubmissionId` DESC LIMIT 1");
      $SubmissionId = $db->loadResult();
      //grabs previous user submission, if any.

      if(!empty($SubmissionId)){
        //this basically triggers if the user had submitted the form before.

        $exclude = implode("','",array(7,8,9,10,11,12,13,14,15,21,22,23,24,27,28,30,31,32,33,34,41,212,499,500,2424));
        /* certain form elements are EXCLUDED as follows:
        7 button
        8 captcha
        9 File Upload
        10 freeText
        11 hidden field
        12 image button
        13 submit button
        14 password
        15 support ticket
        21 single product
        22 multiple product
        23 total
        24 recaptcha
        27 choose payment
        28 donation
        30 RSEvents!Pro name
        31 RSEvents!Pro email
        32 RSEvents!Pro tickets
        33 RSEvents!Pro payments
        34 RSEvents!Pro coupon
        41 Page Break
        212 Google Map
        499 offline payment
        500 PayPal payment
        2424 reCaptcha V2
        */

        $db->setQuery("SELECT ct.`ComponentTypeName`, p.`PropertyValue`, sv.`FieldValue` FROM #__rsform_component_types AS ct LEFT JOIN #__rsform_components AS c ON ct.`ComponentTypeId` = c.`ComponentTypeId` LEFT JOIN #__rsform_properties AS p ON c.`ComponentId` = p.`ComponentId` LEFT JOIN #__rsform_submission_values AS sv ON  p.`PropertyValue` = sv.`FieldName` WHERE c.`FormId`='".$formId."' AND c.`ComponentTypeId` NOT IN ('".$exclude."') AND p.`PropertyName`='NAME' AND sv.`SubmissionId` = '".$SubmissionId."'");

        $results = $db->loadObjectList();
        //to keep things sort, the above query grabs previously submitted data of your form fields based on the logged in user.


        foreach($results as $result){
        //there are four main cases when you have to specify a particular syntax to include data within the $val variable that will eventually pre-fill form fields

          if($result->ComponentTypeName == 'selectList' || $result->ComponentTypeName == 'checkboxGroup'){
          //for dropdowns and checkbox groups
            if(strstr($result->FieldValue,"\n") !== false){
            //for multi selections
              $multiVals = explode("\n",$result->FieldValue);
              foreach($multiVals as $multiVal){
                $val[$result->PropertyValue][] = $multiVal;
              }
            }else{
            //for single selections
              $val[$result->PropertyValue] = $result->FieldValue;
            }
          }elseif($result->ComponentTypeName == 'calendar'){
          //for the calendar field
            $val[$result->PropertyValue] = $result->FieldValue;
            //if you're using other calendar formats than d-m-Y, you may need to use something like the following instead (adjust according to your date format):
            //$calDate = explode("/",$result->FieldValue);
            //$val[$result->PropertyValue] = $calDate[2].'/'.$calDate[0].'/'.$calDate[1];
          }elseif($result->ComponentTypeName == 'birthDay'){
          //for the birthday field
            $bDate = str_replace(' ','',$result->FieldValue);
            $bDate = explode("/",$bDate);
            $val[$result->PropertyValue]['d'] = $bDate[0];
            $val[$result->PropertyValue]['m'] = $bDate[1];
            $val[$result->PropertyValue]['y'] = $bDate[2];
          }else{
          //for other fields such as textboxes, radio groups and so on
            $val[$result->PropertyValue] = $result->FieldValue;
          }
        }
      }
    }
Optional - removing the previous submission

The next script is added within "Scripts Called after form has been Processed" area (backend > Components > RSForm!Pro > Manage Forms > your form > Properties > PHP Scripts). This basically removes the previous submission after the new one is already saved and there's no need for any further adjustment.

This script is optional, unless you do want the previous submission to be deleted (this is permanent).

    $db = Joomla\CMS\Factory::getDBO();
    $db->setQuery("SELECT `SubmissionId` FROM #__rsform_submissions WHERE `UserId`='".Joomla\CMS\Factory::getUser()->id."' AND `FormId`='".$formId."' ORDER BY `SubmissionId` DESC LIMIT 2");
    $oldSubId = '';
    if(count($db->loadColumn()) == 2){
      $oldSubId = $db->loadColumn()[1];
    }
    if(!empty($oldSubId)){
      $db->setQuery("DELETE rs,rsv FROM #__rsform_submissions AS rs ,#__rsform_submission_values AS rsv WHERE
      rs.`SubmissionId`=rsv.`SubmissionId` AND rs.`SubmissionId`='".$oldSubId."'");
      $db->execute();
    }

This tutorial will provide an example where, based on a fixed hash delivered via email, it pre-fills last submitted data in case the user wants to adjust certain information. You can download the sample form on the right for a finished example which can be restored using the built-in RSForm!Pro Backup/Restore feature.

Download Sample Form
Step 1

Edit your form and add a Hidden field let's name it for example, 'SubmissionCode'. In the 'Default Value' are add the following code:

//<code>
$code = JFactory::getApplication()->input->get('SubmissionCode');
if (!$code)
{
    $code = md5(uniqid(serialize($_SERVER)));
}
return $code;
//</code>

Step 2

Go to Form Properties > Scripts > PHP Scripts and add the following code in the 'Script called after form has been processed' area:

$code     = JFactory::getApplication()->input->get('SubmissionCode');
$db     = JFactory::getDbo();

// Check unique code
if ($code)
{
    // Grab old submission
    $db->setQuery("SELECT `SubmissionId` FROM #__rsform_submission_values WHERE `FormId`= " . $db->q($formId) ." AND `FieldName`='SubmissionCode' AND FieldValue = " . $db->q($code) . " ORDER BY SubmissionId ASC LIMIT 1");
    if ($oldSubId = $db->loadResult())
    {
        // Remove it
        $db->setQuery("DELETE rs,rsv FROM #__rsform_submissions AS rs ,#__rsform_submission_values AS rsv WHERE rs.`SubmissionId`=rsv.`SubmissionId` AND rs.`SubmissionId`='".$oldSubId."'")->execute();
    }

    // Override generated code if supplied
    $db->setQuery("UPDATE #__rsform_submission_values SET FieldValue = " . $db->q($code) . " WHERE FieldName = " . $db->q('SubmissionCode') . " AND SubmissionId = " . $db->q($SubmissionId))->execute();
}

Step 3

Go to Form Properties > Scripts > PHP Scripts - Pre-Processing and add the following code in the 'Script called before form is generated' area:

$code = JFactory::getApplication()->input->get('SubmissionCode');
$db = JFactory::getDbo();
$db->setQuery("SELECT `SubmissionId` FROM #__rsform_submission_values WHERE `FormId`= " . $db->q($formId) ." AND `FieldName`='SubmissionCode' AND FieldValue = " . $db->q($code) . " ORDER BY SubmissionId DESC LIMIT 1");
$SubmissionId = $db->loadResult();

//grabs previous user submission, if any.

if(!empty($SubmissionId)){
    //this basically triggers if the user had submitted the form before.

    $exclude = implode("','",array(7,8,9,10,11,12,13,14,15,21,22,23,24,27,28,30,31,32,33,34,41,212,499,500,2424));
    /* certain form elements are EXCLUDED as follows:
    7 button
    8 captcha
    9 File Upload
    10 freeText
    11 hidden field
    12 image button
    13 submit button
    14 password
    15 support ticket
    21 single product
    22 multiple product
    23 total
    24 recaptcha
    27 choose payment
    28 donation
    30 RSEvents!Pro name
    31 RSEvents!Pro email
    32 RSEvents!Pro tickets
    33 RSEvents!Pro payments
    34 RSEvents!Pro coupon
    41 Page Break
    212 Google Map
    499 offline payment
    500 PayPal payment
    2424 reCaptcha V2
    */

    $db->setQuery("SELECT ct.`ComponentTypeName`, p.`PropertyValue`, sv.`FieldValue` FROM #__rsform_component_types AS ct LEFT JOIN #__rsform_components AS c ON ct.`ComponentTypeId` = c.`ComponentTypeId` LEFT JOIN #__rsform_properties AS p ON c.`ComponentId` = p.`ComponentId` LEFT JOIN #__rsform_submission_values AS sv ON  p.`PropertyValue` = sv.`FieldName` WHERE c.`FormId`='".$formId."' AND c.`ComponentTypeId` NOT IN ('".$exclude."') AND p.`PropertyName`='NAME' AND sv.`SubmissionId` = '".$SubmissionId."'");

    $results = $db->loadObjectList();
    //to keep things sort, the above query grabs previously submitted data of your form fields based on the logged in user.


    foreach($results as $result){
    //there are four main cases when you have to specify a particular syntax to include data within the $val variable that will eventually pre-fill form fields

      if($result->ComponentTypeName == 'selectList' || $result->ComponentTypeName == 'checkboxGroup'){
      //for dropdowns and checkbox groups
        if(strstr($result->FieldValue,"\n") !== false){
        //for multi selections
          $multiVals = explode("\n",$result->FieldValue);
          foreach($multiVals as $multiVal){
            $val[$result->PropertyValue][] = $multiVal;
          }
        }else{
        //for single selections
          $val[$result->PropertyValue] = $result->FieldValue;
        }
      }elseif($result->ComponentTypeName == 'calendar'){
      //for the calendar field
        $val[$result->PropertyValue] = $result->FieldValue;
        //if you're using other calendar formats than d-m-Y, you may need to use something like the following instead (adjust according to your date format):
        //$calDate = explode("/",$result->FieldValue);
        //$val[$result->PropertyValue] = $calDate[2].'/'.$calDate[0].'/'.$calDate[1];
      }elseif($result->ComponentTypeName == 'birthDay'){
      //for the birthday field
        $bDate = str_replace(' ','',$result->FieldValue);
        $bDate = explode("/",$bDate);
        $val[$result->PropertyValue]['d'] = $bDate[0];
        $val[$result->PropertyValue]['m'] = $bDate[1];
        $val[$result->PropertyValue]['y'] = $bDate[2];
      }else{
      //for other fields such as textboxes, radio groups and so on
        $val[$result->PropertyValue] = $result->FieldValue;
      }
    }
  }

Step 4

Add the following URL in your User Email Message:

    <a href="https://www.your_website/index.php?option=com_rsform&formId={global:formid}&SubmissionCode={SubmissionCode:value}" target="_blank">click here to edit the submission</a>

Make sure to replace 'https://www.your_website' with the actual path of your website.


56 persons found this article helpful.


Was this article helpful?

Yes No
Sorry about that