0

I'll try to explain this logically as best as I can. Basically I have a facility on my site whereby users can enter their employment history. This is a form with input fields. To make things easier I have a jQuery function that clones these input fields and allows the user to enter multiple records at once.

Whilst adding new records the user may wish to remove a record from the list, in which case they can press the 'remove' link next to each record.

HTML (1 Item):

<div class="history-form-fields">

<div class="row">
  <label for="History_0_type">Type</label>
  <select name="History[0][type]" id="History_0_type">
  <option value="">Select</option>
  </select>
</div>

<div class="row">
  <label for="History_0_name">Name</label>
  <input type="text" name="History[0][name]" id="History_0_name" />
</div>

<div class="row">
  <label for="History_0_year">Year</label>
  <select name="History[0][year]" id="History_0_year">
  <option value="">Select</option>
  </select>
</div>

</div>

<input id="add" type="button" value="Add Another" />    

JS:

<script type="text/javascript">
    var counter = <?php echo $historyCount; ?>;

    $('#add').click(function(){
        var divCloned = $('.history-form-fields:first').clone();
        divCloned.insertAfter('.history-form-fields:last');
        initNewInputs(divCloned.children('.row'), ++counter);
    });

    $('.remove').live('click', function(){
        $(this).parent().remove();
        return false;
    });
</script>

In the above JS code, the $historyCount variable is set beforehand in my PHP script:

$historyCount=isset($_POST['History']) ? count($_POST['History'])-1 : 0;

So for example when the form is posted, if there were multiple records on the page and there are some validation errors, then the form is redisplayed showing those same records.

There is also a call to a function initNewInputs() which is passed in the new counter value. This is so that new form input elements can receive unique ID and NAME attributes (in the HTML code above you can see the integer indexes within the attribute values).

This is all working fine. The issue I'm having is in the following scenario:

  1. User starts adding in new records

    • Record 1 - Count 0
    • Record 2 - Count 1
    • Record 3 - Count 2
    • Record 4 - Count 3
    • Record 5 - Count 4

  2. User removes Records 3 & 4 (so we now only have 3 records). Record 5 is now Record 3 but maintains the same Count value (4).

  3. User then adds in a new record:

    • Record 4 - Count 5

  4. User posts the form - there are some validation errors so the form is redisplayed. The PHP script determines that it received 4 records, so it pre-sets the count to 3.

  5. User decides to add a new record whilst fixing the errors

    • Record 5 - Count 4

This is where the problem arises - a record with the count value of 4 already exists on the page. I.e. it has now created input elements with the same ID and NAME attribute values as one that is already on the page.

I know this is a little bit difficult to understand but I would appreciate any help. It will most likely require modification of how the counter is set.

0

1 Answer 1

1

Rather than using count($_POST['History']) to fill in counter use the upper bound (in this case, I mean highest index number) of the $_POST['History'] array.

Sign up to request clarification or add additional context in comments.

4 Comments

Hmmm good idea. Let me give that a go and I'll post back shortly.
Yes this seems to have done the trick. I will continue testing and if all OK will Accept your answer! Thanks.
Sounds good. Don't forget to give me an upvote for the efforts :)
Of course :) Something so simple that I probably would never have figured out myself! Thanks again.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.